seg_disp[5]=jm_disp[5]; seg_disp[6]=jm_disp[6]; seg_disp[7]=jm_disp[7]; } }
/**************** 控制函数 ****************/ void control() {
if(count==6) //6秒内没继续输入密码,返回常态 {
int i;
y=1; v=0; lock=0; for(i=0;i<8;i++) {
jm_disp[i]=0x00; mima[i]=0x00; } }
if(ms==4)
n2=n2-1; //控制继电器工作1s if(n2==0) {
OP=1; n2=50; ms=0; //关闭继电器 } }
/****************** 1毫秒延时函数 ********************/ void Delay1ms(int c) {
unsigned char a, b; for (;c>0;c--) { for (b=38;b>0;b--) { for (a=13;a>0;a--); } } }
/******************* 开机自检函数 *******************/ void check() {
c_led(); //自检led disp(); //自检数码管 while(x<16) {
21
}
sm_key(); //按键检测 }
Delay1ms(500); seg=0x00;
OP=0; //自检继电器 Delay1ms(500); OP=1;
y=1; //自检完成,进入常态
/**************** 开机自检led子函数 ******************/ void c_led() {
unsigned char b; int bb=0; b=0x01;
while(bb<8) //逐个移动点亮led { P0=b; Delay1ms(500); b=b<<1; bb++; } }
/**************** 按键检测函数 *****************/ void sm_key() {
int i=0,j; uchar a,b,c,k; key=0x0f; lb[4]=lb[3]; lb[3]=lb[2]; lb[2]=lb[1]; lb[1]=lb[0];
lb[0]=key; //滚动滤波存储 for(j=0;j<4;j++) { if(lb[j]!=lb[j+1])
return; //5次值不等,退出函数 k=lb[j+1]; //相等,当前稳定值暂存k } pd[1]=pd[0]; //前一次稳定值存入pd[1] pd[0]=k; 当前稳定值存入pd[0] if((pd[1]==0x0f)&&(pd[0]!=0x0f)) //pd[1]为0x0f且pd[0]不为0x0f则按键按下 {
22
key=0x0f; a=key&0x0f; key=0xf0; b=key&0xf0; c=a|b; //线反转后得到按键状态值 while(c!=key_code[i]) i++; //查找第几个按键按下 keyvalue=i; //得到键值 if(y==0) //刚启动模式下检测键盘 {
seg=sdm[keyvalue]; x++; return; }
switch(keyvalue) //查找按键功能 {
case(0):k0(); break; case(1):k1(); break; case(2):k2(); break; case(3):k3(); break; case(4):k4(); break; case(5):k5(); break; case(6):k6(); break; case(7):k7(); break; case(8):k8(); break; case(9):k9(); break; case(10):k10(); break; //case(11):k11(); break; case(12):k12(); break; case(13):k13(); break; case(14):k14(); break; case(15):k15(); break; } } }
/**************** k0按键功能函数 ******************/ void k0() {
if((ms==2&&y==3)&&v<6) {
mima[v]=0x01; jm_disp[v]=0x40; v=v+1; }
if((ms==3&&y==3)&&v<8) {
mima[v]=0x01;
23
jm_disp[v]=0x40; v=v+1; }
if((y==1||y==2)&&(ms==0&&lock<8)) {
y=2; w=1;
keyvalue=keyvalue+1; lock=lock+1; count=0; }
if((ms==1&&y==1)&&v<8) {
keyvalue=keyvalue+1; seg_disp[v]=sdm[keyvalue]; if(v==1||v==4) v=v+2; else v=v+1; } }
/**************** k1按键功能函数 ******************/ void k1() {
if((ms==2&&y==3)&&v<6) { mima[v]=0x02; jm_disp[v]=0x40; v=v+1; }
if((ms==3&&y==3)&&v<8) {
mima[v]=0x02; jm_disp[v]=0x40; v=v+1; }
if((y==1||y==2)&&(ms==0&&lock<8)) {
y=2; w=1;
keyvalue=keyvalue+1; lock=lock+1; count=0; }
if((ms==1&&y==1)&&v<8) {
keyvalue=keyvalue+1; seg_disp[v]=sdm[keyvalue];
24
if(v==1||v==4) v=v+2; else v=v+1; } }
/**************** k2按键功能函数 ******************/ void k2() {
if((ms==2&&y==3)&&v<6) { mima[v]=0x03; jm_disp[v]=0x40; v=v+1; }
if((ms==3&&y==3)&&v<8) {
mima[v]=0x03; jm_disp[v]=0x40; v=v+1; }
if((y==1||y==2)&&(ms==0&&lock<8)) {
y=2; w=1;
keyvalue=keyvalue+1; lock=lock+1; count=0; }
if((ms==1&&y==1)&&v<8) {
if(v==0) return;
keyvalue=keyvalue+1; seg_disp[v]=sdm[keyvalue]; if(v==1||v==4) v=v+2; else v=v+1; } }
/**************** k3按键功能函数 ******************/ void k3() //修改用户密码按键 {
if(y==3&&ms!=3) //管理员模式下修改用户密码 ms=2;
25