{ uchar temp=0;
uchar temp1=0; uchar BitCounter=8; Sda=1; do{ Scl=0; Nop(); Scl=1; Nop(); if(Sda)
temp=temp|0x01; else
temp=temp&0xfe; if(BitCounter-1) {temp1=temp<<1; temp=temp1;} BitCounter--;} while(BitCounter); return(temp);}
void WrToROM(uchar Data[],uchar Address,uchar Num) { uchar i; uchar *PData; PData=Data; for(i=0;i Send(Address+i); Ack(); Send(*(PData+i)); Ack(); Stop(); mDelay(20);}} void RdFromROM(uchar Data[],uchar Address,uchar Num) { uchar i; uchar *PData; PData=Data; for(i=0;i Send(Address+i); Ack(); Start(); Send(0xa1); Ack(); *(PData+i)=Read(); Scl=0; NoAck(); Stop();}} #define yi 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80) #define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40) void delay(uint xms)//延时函数,有参函数 {uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--);} void write_1602com(uchar com)//****液晶写入指令函数**** { lcd1602_rs=0;//数据/指令选择置为指令 lcd1602_rw=0; //读写选择置为写 P0=com;//送入数据 delay(1); lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1); lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令} void write_1602dat(uchar dat)//***液晶写入数据函数**** { lcd1602_rs=1;//数据/指令选择置为数据 lcd1602_rw=0; //读写选择置为写 P0=dat;//送入数据 delay(1); lcd1602_en=1; //en置高电平,为制造下降沿做准备 delay(1); lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令} void lcd_init(void) { write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据 write_1602com(0x0c);//开显示不显示光标 write_1602com(0x06);//整屏不移动,光标自动右移 write_1602com(0x01);//清显示} unsigned char coding(unsigned char m) { unsigned char k; switch(m) { case (0x18): k=1;break; case (0x28): k=2;break; case (0x48): k=3;break; case (0x88): k='A';break; case (0x14): k=4;break; case (0x24): k=5;break; case (0x44): k=6;break; case (0x84): k='B';break; case (0x12): k=7;break; case (0x22): k=8;break; case (0x42): k=9;break; case (0x82): k='C';break; case (0x11): k='*';break; case (0x21): k=0;break; case (0x41): k='#';break; case (0x81): k='D';break;} return(k);} unsigned char keynum(void) { unsigned char row,col,i; P1=0xf0; if((P1&0xf0)!=0xf0) {Delay5Ms(); Delay5Ms(); if((P1&0xf0)!=0xf0) {row=P1^0xf0; //确定行线 else {return 0;} i=0; P1=a[i]; while(i<4) {if((P1&0xf0)!=0xf0) {col=~(P1&0xff); //确定列线 else {i++; P1=a[i];}}} break;} //精确定位 while((P1&0xf0)!=0xf0); return (row|col);} else return 0;} void OneAlam(void) {ALAM=0; Delay5Ms(); ALAM=1;} void TwoAlam(void) { ALAM=0; Delay5Ms(); ALAM=1; Delay5Ms(); ALAM=0; Delay5Ms(); ALAM=1;} void ThreeAlam(void) { ALAM=0; Delay5Ms(); ALAM=1; Delay5Ms(); ALAM=0; Delay5Ms(); ALAM=1; Delay5Ms(); ALAM=0; Delay5Ms(); ALAM=1;} void DisplayOne(void) {write_1602com(yi+5+N); write_1602dat('*');} void DisplayChar(void) {unsigned char i; if(pass==1) {write_1602com(er); else {if(N==0) {write_1602com(er); else {write_1602com(er); for(i=0;i<16;i++) {write_1602dat(start_line[i]);}}}} for(i=0;i<16;i++) {write_1602dat(Error[i]); }} for(i=0;i<16;i++) {write_1602dat(Locktrue[i]); }} void DisplayInput(void) { unsigned char i; if(CorrectCont==1) { write_1602com(er); for(i=0;i<16;i++) {write_1602dat(Input[i]); }}} void ResetPassword(void) { unsigned char i; unsigned char j; if(pass==0) { pass=0; else {if(ReInputEn==1) DisplayChar(); ThreeAlam();} {if(N==6) {ReInputCont++; if(ReInputCont==2) {for(i=0;i<6;) {if(TempPassword[i]==InputData[i]) //将两次输入的新密码作对比 else {write_1602com(er); for(j=0;j<16;j++) {write_1602dat(Error[j]); } ThreeAlam(); pass=0; ReInputEn=0; ReInputCont=0; DisplayChar(); break;}} //关闭重置功能, //错误提示 i++; if(i==6) {write_1602com(er); for(j=0;j<16;j++) {write_1602dat(ResetOK[j]); TwoAlam(); } //操作成功提示 //将新密码写入24C02存储 else WrToROM(TempPassword,0,6); ReInputEn=0;} ReInputCont=0; CorrectCont=0;} {OneAlam(); write_1602com(er); for(j=0;j<16;j++) {write_1602dat(again[j]); } for(i=0;i<6;i++) {TempPassword[i]=InputData[i];}} N=0;}}}} void Alam_KeyUnable(void) {P1=0x00; {ALAM=~ALAM; Delay5Ms();}} void Cancel(void) { unsigned char i; unsigned char j; write_1602com(er); for(j=0;j<16;j++) {write_1602dat(start_line[j]); } 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库51单片机课程设计 电子密码锁 - 图文(3)在线全文阅读。
相关推荐: