idata uchar thirdB[]=\新密码输入提示 idata uchar mm0[6]={7,7,7,7,7,7};//初始密码 idata uchar mm[6];//输入密码 idata uchar Xmm1[6];//新密码1 idata uchar Xmm2[6];//新密码2 uchar flag; //密码配对正确标志 sbit key=P3^2;//室内开门键 sbit rs=P2^6; //指令或数据口 sbit rw=P2^5; //读或写状态口 sbit e=P2^7; //LCD使能口 sbit GLed=P3^4;//定义绿灯 sbit YLed=P3^5;//定义黄灯 sbit RLed=P3^6; //定义红灯 sbit buzzer=P3^0;//定义蜂鸣器 void delay(uint xms); void lcd_init();
void write_com(uchar com); void write_data(uchar dat); void alarm();
void lcd_display1(uchar tab[],uchar l); void lcd_display2(uchar tab1[],uchar tab2[]); uchar keyscan(); uchar KeyPro(void);
void zhijie(void) interrupt 0 //外部中断,用以室内开锁 { delay(20); if(key==0) { delay(20); while(1) { if(key==1) {
delay(10); //防抖
13
if(key==1) { GLed=0; //绿灯亮1秒,表示开门
delay(1000); GLed=1; break;
}
}
}
}
}
void delay(uint xms)//延时程序 x ms { uint i,j;
for(i=xms;i>0;i--) for(j=112;j>0;j--);
}
bit lcd_busy() //判断是否忙 { P0= 0xff; rs=0;
//写指令
rw=1; //表示读状态 e=0; _nop_(); e=1;
return (bit)(P0 & 0x80);
}
void write_data(uchar dat)//LCD写数据程序 { lcd_busy(); //判断LCD是否忙碌
rs=1; rw=0;
P0=dat;
14
delay(10); e=1; delay(10); e=0;
}
void write_com(uchar com)//LCD写指令程序 { lcd_busy();//判断LCD是否忙碌 rs=0; rw=0; P0=com; delay(10); e=1; delay(10); e=0;
}
void lcd_pos(uchar pos)//显示位置程序 { write_com(pos|0x80);
}
void lcd_init() //LCD初始化程序 { write_com(0x38); //开显示
write_com(0x0e); //开显示不显示光标 write_com(0x06); //写一个指针加1 write_com(0x01); //清屏
write_com(0x80); //设置数据指针起点
}
void lcd_display1(uchar tab[],uchar h)//选择性单行显示子程序{ uchar i;
lcd_init();//初始化LCD
delay(10);
15
if(h==1) //第一行显示 { lcd_pos(0x01); }
if(h==2) //第二行显示 { lcd_pos(0x42);
} i=0;
while(tab[i] != '\\0') { write_data(tab[i]);//显示字符 i++;
}
}
void lcd_display2(uchar tab1[],uchar tab2[])//双行显示子程序 { uchar i,j; lcd_init(); //初始化LCD
delay(10); lcd_pos(0x01); //从第一行显示 i=0;
while(tab1[i] != '\\0') { write_data(tab1[i]);//显示字符 i++; }
lcd_pos(0x42); //从第二行显示 j=0;
while(tab2[j] != '\\0') { write_data(tab2[j]);//显示字符 j++;
}
16