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;
}
}