赞
踩
main.c
驱动就不写了,只放了主函数。
#include "STC15F2K60S2.h" #include "ds1302.h" #include "iic.h" //12MHZ #include "sonic.h" //2020-10-30 #define u8 unsigned char #define key_state_0 0 #define key_state_1 1 #define key_state_2 2 #define NO_KEY 0 #define SetKeyBoard(x) P4=(x>>3)|(x>>4);P3=x #define GetKeyBoard() ((P4&0x10)<<3)|((P4&0x04)<<4)|(P3&0x3f) sbit buzzer=P0^6; sbit relay=P0^4; u8 code smg_duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; u8 code smg_wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; u8 key_scan() { u8 key_temp,key_temporary=0; u8 key1,key2; SetKeyBoard(0x0f); key1=GetKeyBoard(); SetKeyBoard(0xf0); key2=GetKeyBoard(); key_temp=key1|key2; switch(key_temp) { case NO_KEY:key_temporary=0;break; case 0x77:key_temporary=4;break; case 0x7b:key_temporary=5;break; case 0x7d:key_temporary=6;break; case 0x7e:key_temporary=7;break; case 0xb7:key_temporary=8;break; case 0xbb:key_temporary=9;break; case 0xbd:key_temporary=10;break; case 0xbe:key_temporary=11;break; case 0xd7:key_temporary=12;break; case 0xdb:key_temporary=13;break; case 0xdd:key_temporary=14;break; case 0xde:key_temporary=15;break; case 0xe7:key_temporary=16;break; case 0xeb:key_temporary=17;break; case 0xed:key_temporary=18;break; case 0xee:key_temporary=19;break; } return key_temporary; } u8 key_judge() { static unsigned char key_state=key_state_0; u8 key_val=0,key_return=0; key_val=key_scan(); switch(key_state) { case key_state_0: if(key_val!=NO_KEY) { key_state=key_state_1; } break; case key_state_1: if(key_val==NO_KEY) { key_state=key_state_0; } else { key_state=key_state_2; key_return=key_val; } break; case key_state_2: if(key_val==NO_KEY) { key_state=key_state_0; } break; } return key_return; } void Timer0Init(void) //1毫秒@12.000MHz { AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0x20; //设置定时初值 TH0 = 0xD1; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; EA = 1; } u8 code_judge(u8 a[],u8 b[]) { u8 j; for(j=0;j<6;j++) { if(a[j]!=b[j]) return 0; } return 1; } bit key_flag; bit work_mode=1; //0 auto 1 code 一开始为6:59, ---mode=1 2test bit buzzer_flag; bit sonic_flag; bit sonic_relay_flag=1; bit next_flag=1; bit sonic_relay_time_flag; bit code_relay_flag; bit code_relay_time_flag; bit nn_flag; //时间处理 u8 shi,fen,miao; u8 time_display[8]; u8 input_count; u8 input_index=2; //从2开始 u8 menu_index=0; u8 input_display[8]={0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00}; //用于密码输入时候的显示 u8 input_num[8]; //用于密码比较 u8 true_code[]={6,5,4,3,2,1}; //密码设置界面 u8 code_shezhi_display[8]={0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00}; // ' -' 旧密码输入判断 u8 code_old_cunchu[8]; //num u8 shezhi_input_display[8]={0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; // '- ' 设置新密码 u8 code_new_cunchu[8]; //num u8 input_code_wrong=0; u8 shezhi_code_wrong=0; u8 i; unsigned int distance; unsigned int relay_sonic_count=0; unsigned int code_relay_count=0; void Delay10ms() //@12.000MHz { unsigned char i, j; i = 117; j = 184; do { while (--j); } while (--i); } void main() { u8 keyvalue; P2=0x80;P0=0xff;P2=0; P2=0xa0;P0=0;P2=0; Timer0Init(); Timer1Init(); set_sfm(6,50,45); for(i=0;i<6;i++) { ET0=0; true_code[i]=read_24c02(i); ET0=1; } while(1) { //work_mode if(((shi/16*10+shi%16)>=7)&&((shi/16*10+shi%16)<22)) //7 ~ 22 //auto { work_mode=0; } else { work_mode=1; } //sonic if(work_mode==0) //auto { if(sonic_flag) { sonic_flag=0; distance=get_distance(); if(distance<30) { if(sonic_relay_flag) { sonic_relay_time_flag=1; P2=0xa0;buzzer=0;relay=1;P2=0; } } else { P2=0xa0;buzzer=0;relay=0;P2=0; if(sonic_relay_flag==0)sonic_relay_flag=1; relay_sonic_count=0; } } time_display[0]=smg_duan[shi/16];time_display[1]=smg_duan[shi%16];time_display[2]=0x40; time_display[3]=smg_duan[fen/16];time_display[4]=smg_duan[fen%16];time_display[5]=0x40; time_display[6]=smg_duan[miao/16];time_display[7]=smg_duan[miao%16]; } //time display ET0=0; miao=Read_Ds1302_Byte(0x81); fen=Read_Ds1302_Byte(0x83); shi=Read_Ds1302_Byte(0x85); ET0=1; //buzzer_control if(buzzer_flag) { P2=0x80;P0=~0x01;P2=0; } else { P2=0x80;P0=0xff;P2=0; } if(key_flag) { key_flag=0; keyvalue=key_judge(); switch(keyvalue) { case 4:break; case 5: input_count=8; if(menu_index==0) { input_display[input_index]=smg_duan[8];input_num[input_index-2]=input_count;input_index++; } if(menu_index==1) { code_shezhi_display[input_index]=smg_duan[8]; code_old_cunchu[input_index-2]=input_count; input_index++; } if(menu_index==2) { shezhi_input_display[input_index]=smg_duan[8]; code_new_cunchu[input_index-2]=input_count; input_index++; } break; case 6: input_count=4; if(menu_index==0) { input_display[input_index]=smg_duan[4];input_num[input_index-2]=input_count;input_index++; } if(menu_index==1) { code_shezhi_display[input_index]=smg_duan[4]; code_old_cunchu[input_index-2]=input_count; input_index++; } if(menu_index==2) { shezhi_input_display[input_index]=smg_duan[4]; code_new_cunchu[input_index-2]=input_count; input_index++; } break; case 7:input_count=0; if(menu_index==0) { input_display[input_index]=smg_duan[0];input_num[input_index-2]=input_count;input_index++; } if(menu_index==1) { code_shezhi_display[input_index]=smg_duan[0]; code_old_cunchu[input_index-2]=input_count; input_index++; } if(menu_index==2) { shezhi_input_display[input_index]=smg_duan[0]; code_new_cunchu[input_index-2]=input_count; input_index++; } break; case 8:break; case 9: input_count=9; if(menu_index==0) { input_display[input_index]=smg_duan[9];input_num[input_index-2]=input_count;input_index++; } if(menu_index==1) { code_shezhi_display[input_index]=smg_duan[9]; code_old_cunchu[input_index-2]=input_count; input_index++; } if(menu_index==2) { shezhi_input_display[input_index]=smg_duan[9]; code_new_cunchu[input_index-2]=input_count; input_index++; } break; case 10:input_count=5; if(menu_index==0) { input_display[input_index]=smg_duan[5];input_num[input_index-2]=input_count;input_index++; } if(menu_index==1) { code_shezhi_display[input_index]=smg_duan[5]; code_old_cunchu[input_index-2]=input_count; input_index++; } if(menu_index==2) { shezhi_input_display[input_index]=smg_duan[5]; code_new_cunchu[input_index-2]=input_count; input_index++; } break; case 11:input_count=1; if(menu_index==0) { input_display[input_index]=smg_duan[1];input_num[input_index-2]=input_count;input_index++; } if(menu_index==1) { code_shezhi_display[input_index]=smg_duan[1]; code_old_cunchu[input_index-2]=input_count; input_index++; } if(menu_index==2) { shezhi_input_display[input_index]=smg_duan[1]; code_new_cunchu[input_index-2]=input_count; input_index++; } break; case 12: for(i=2;i<8;i++) { input_display[i]=0x00; } input_index=2; //从2开始 if(menu_index==0) { if(code_judge(true_code,input_num)) //正常输入开锁状态 { code_relay_flag=1; P2=0xa0;buzzer=0;relay=1;P2=0; } else { input_code_wrong++; if(input_code_wrong==3) { input_code_wrong=0; buzzer_flag=1; } } } if(menu_index==1) //设置界面 { if(code_judge(true_code,code_old_cunchu)) { menu_index=2; } else { shezhi_code_wrong++; if(shezhi_code_wrong==3) { shezhi_code_wrong=0; buzzer_flag=1; menu_index=0; //退出设置界面 } input_index=2; for(i=2;i<8;i++) { code_shezhi_display[i]=0x00; //清空old_code input } } } if(menu_index==2) //新密码确认 { for(i=0;i<6;i++) { true_code[i]=code_new_cunchu[i]; //新密码转入true_code write_24c02(i,code_new_cunchu[i]); Delay10ms(); } } break;//确认 case 13: menu_index=1; input_index=2; break;//设置 case 14:input_count=6; if(menu_index==0) { input_display[input_index]=smg_duan[6];input_num[input_index-2]=input_count;input_index++; } if(menu_index==1) { code_shezhi_display[input_index]=smg_duan[6]; code_old_cunchu[input_index-2]=input_count; input_index++; } if(menu_index==2) { shezhi_input_display[input_index]=smg_duan[6]; code_new_cunchu[input_index-2]=input_count; input_index++; } break; case 15:input_count=2; if(menu_index==0) { input_display[input_index]=smg_duan[2];input_num[input_index-2]=input_count;input_index++; } if(menu_index==1) { code_shezhi_display[input_index]=smg_duan[2]; code_old_cunchu[input_index-2]=input_count; input_index++; } if(menu_index==2) { shezhi_input_display[input_index]=smg_duan[2]; code_new_cunchu[input_index-2]=input_count; input_index++; } break; case 16:input_index=2; //回到初始界面,清空初始显示 for(i=2;i<8;i++) { input_display[i]=0x00; } menu_index=0; break;//退出 case 17:true_code[0]=6;true_code[1]=5;true_code[2]=4;true_code[3]=3; true_code[4]=2;true_code[5]=1;break;//复位 //恢复 code:6-5-4-3-2-1 case 18:input_count=7; if(menu_index==0) { input_display[input_index]=smg_duan[7];input_num[input_index-2]=input_count;input_index++; } if(menu_index==1) { code_shezhi_display[input_index]=smg_duan[7]; code_old_cunchu[input_index-2]=input_count; input_index++; } if(menu_index==2) { shezhi_input_display[input_index]=smg_duan[7]; code_new_cunchu[input_index-2]=input_count; input_index++; } break; case 19:input_count=3; if(menu_index==0) { input_display[input_index]=smg_duan[3];input_num[input_index-2]=input_count;input_index++; } if(menu_index==1) { code_shezhi_display[input_index]=smg_duan[3]; code_old_cunchu[input_index-2]=input_count; input_index++; } if(menu_index==2) { shezhi_input_display[input_index]=smg_duan[3]; code_new_cunchu[input_index-2]=input_count; input_index++; } break; } } } } void timer0() interrupt 1 { static unsigned int key_count=0,smg_count=0,i=0,buzzer_count=0,sonic_count=0; key_count++; smg_count++; sonic_count++; if(sonic_relay_time_flag) { relay_sonic_count++; if(relay_sonic_count>=5000) { relay_sonic_count=0; sonic_relay_time_flag=0; sonic_relay_flag=0; //不能再被赋值为1 P2=0xa0;buzzer=0;relay=0;P2=0; } } if(code_relay_flag) { code_relay_count++; if(code_relay_count>=5000) { code_relay_count=0; code_relay_flag=0; P2=0xa0;buzzer=0;relay=0;P2=0; } } if(sonic_count==200) { sonic_count=0; sonic_flag=1; } if(buzzer_flag) { buzzer_count++; if(buzzer_count>=3000) { buzzer_count=0; buzzer_flag=0; P2=0x80;P0=0xff;P2=0; } } if(key_count==10) { key_count=0; key_flag=1; } if(smg_count==3) { smg_count=0; P2=0xc0;P0=0;P2=0; if(work_mode==1) //code_state { if(menu_index==0) { P2=0xe0;P0=~input_display[i];P2=0; } if(menu_index==1) //设置 { P2=0xe0;P0=~code_shezhi_display[i];P2=0; //输入旧密码判断 } if(menu_index==2) { P2=0xe0;P0=~shezhi_input_display[i];P2=0; //显示新密码输入 } } if(work_mode==0) //auto state { P2=0xe0;P0=~time_display[i];P2=0; //显示时间 } P2=0xc0;P0=smg_wei[i];P2=0; i++; if(i==8)i=0; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。