您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 用24C04与1602LCD设计电子密码锁各模块
Main.c#includereg52.h#includestring.h#includeintrins.h//2404#include2404.h#includeLCD1602.h#includekey.h#defineucharunsignedchar#defineuintunsignedint//上次按键和当前按键序号,该矩阵中序号范围0~15,16表示无按键ucharpre_keyno=16,keyno=16;ucharcodeTitle_Text[]=yourpassword...;//标题字符串ucharDSY_BUFFER[16]=;//显示缓冲ucharuserpassword[7]=;//用户输入的密码ucharIIC_Password[7];ucharIS_Valid_User=0;uchari=0;voidBeep();ucharClear_Password();sbitLED_OPEN=P2^7;//开锁灯亮sbitBEEP=P3^7;//蜂鸣器//===================================================//延时................voiddelay(uintx){uchari;while(x--)for(i=0;i120;i++);}//蜂鸣器子程序voidbeep(){uchari;for(i=0;i100;i++){BEEP=~BEEP;}BEEP=0;}//清除密码voidclear_password(){uchari;for(i=0;i6;i++){userpassword[i]='';DSY_BUFFER[i]='';}}//主程序初始化voidinit_main(){P0=0xFF;P1=0xFF;P2=0xFF;TMOD=0x02;//T0设置为8位自动重装模式TH0=175;TL0=175;TR0=1;//启动T0delay(10);lcd_init();IIC_24C04_Init();//初始化24C04}//键盘执行功能voidkey_main(){P1=0xF0;if(P1!=0xF0)keyno=keys_scan();//扫描键盘获取键序号KeyNoif(pre_keyno!=keyno){if(i=6){switch(keyno){case0:case1:case2:case3:case4:case5:case6:case7:case8:case9://if(i=6)//密码限制在6位以内//{//如果i为0则执行一次清屏if(i==0)display_string(,0x40);userpassword[i]=keyno+'0';userpassword[i+1]='';//DSY_BUFFER[i]=userpassword[i];DSY_BUFFER[i]='*';DSY_BUFFER[i+1]='';display_string(DSY_BUFFER,0x40);i++;//}break;case10://按A键开锁if(strcmp(userpassword,IIC_Password)==0){LED_OPEN=0;//点亮LEDClear_Password();display_string(UnlockOK!,0x40);IS_Valid_User=1;}else{LED_OPEN=1;//关闭LEDClear_Password();display_string(ERROR!,0x40);IS_Valid_User=0;}i=0;break;case11://按B键上锁LED_OPEN=1;Clear_Password();display_string(Title_Text,0x00);display_string(,0x40);i=0;IS_Valid_User=0;break;case12://按C键设置新密码//如果是合法用户则提示输入新密码if(!IS_Valid_User)display_string(Norights!,0x40);else{i=0;display_string(NewPassword:,0x00);display_string(,0x40);}break;case13://按D键保存新密码if(!IS_Valid_User)display_string(Norights!,0x40);else{sendstring(0xa0,0,userpassword,6);//重新读入刚写的密码recstring(0xa0,0,IIC_Password,6);IIC_Password[6]='';i=0;display_string(Title_Text,0x00);display_string(PasswordSaved!,0x40);}break;case14://按E键消除所有输入i=0;Clear_Password();display_string(,0x40);}}beep();pre_keyno=keyno;}//delay(100);//Beep();delay(100);P1=0xF0;while(P1!=0xF0);//如果有键未释放则等待while(P1==0xF0);//如果没有再次按下按键则等待}//=====================================================================//主程序//-----------------------------------------------------------------//原始程序中相邻两位密码不能相同.//本压缩包中的HEX由修改后的新程序编译生成,允许输入任意密码.//-----------------------------------------------------------------//实训100例中本例内的main函数可用以下代码替换.//改动的主要是main函数中while循环内的代码.//-----------------------------------------------------------------//主程序//-----------------------------------------------------------------voidmain(){init_main();display_string(Title_Text,0x00);//在第1行显示标题//24C04的内容已由初始化BIN文件导入//将24C04中预先写入的密码读入passrecstring(0xa0,0,IIC_Password,6);IIC_Password[6]='\0';while(1){key_main();//P1=0xF0;//while(P1!=0xF0);//如果有键未释放则等待//while(P1==0xF0);//如果没有再次按下按键则等待}}2404.c#includereg51.h#includestring.h#includeintrins.h//2404#defineucharunsignedchar#defineuintunsignedint#definedelay4us();//2404sbitSCL=P3^2;//串行时钟sbitSDA=P3^3;//串行数据//----------------24c04程序//---------------------起始位voidstart(){SDA=1;SCL=1;delay4us();SDA=0;delay4us();SCL=0;}//---------------------停止位voidstop(){SDA=0;SCL=1;delay4us();SDA=1;delay4us();SCL=0;}//----------iic总线初始化voidIIC_24C04_Init(){SCL=0;stop();}//-----------------发送应答信号voidACK(){SDA=0;SCL=1;delay4us();SDA=1;SCL=0;}//------------------发送非应答信号voidno_ACK(){SDA=1;SCL=1;delay4us();SDA=0;SCL=0;}//---------------------从芯片读取1字节ucharrecbyte(){uchari,rd;rd=0x00;SDA=1;for(i=0;i8;i++){SCL=1;rd=1;rd|=SDA;delay4us();SCL=0;delay4us();}SCL=0;delay4us();returnrd;}//----------------------向芯片发送一个字节ucharsendbyte(ucharwd){uchari;bitACK0;for(i=0;i8;i++){SDA=(bit)(wd&0x80);_nop_();_nop_();SCL=1;delay4us();SCL=0;wd=1;}delay4us();SDA=1;SCL=1;delay4us();ACK0=!SDA;SCL=0;delay4us();returnACK0;}//发送多字节数据函数ucharsendstring(ucharslave,ucharsubaddr,uchar*buffer,ucharN){uchari;start();if(!sendbyte(slave))return0;if(!sendbyte(subaddr))return0;for(i=0;iN-1;i++){if(!sendbyte(buffer[i]))return0;}stop();return1;}//-------------------接收多字节数据函数ucharrecstring(ucharslave,ucharsubaddr,uchar*buffer,ucharN){uchari;start();if(!sendbyte(slave))return0;if(!sendbyte(subaddr))return0;start();if(!sendbyte(slave+1))return0;for(i=0;iN-1;i++){buffer[i]=recbyte();ACK();}buffer[N-1]=recbyte();no_ACK();stop();return1;}1602.c#includereg52.h#includestring.h#includeintrins.h//2404#defineucharunsignedchar#defineuintunsignedintsbitrs=P2^0;//1602sbitrw=P2^1;sbiteq=P2^2;voiddelay_lcd(ucharn){uchari;while(n--){for(i=0;i250;i++){_nop_();_nop_();_nop_();_nop_();}}}//测试LCD忙状态返回resultbitlcd_bz(){bitresult;rs=0;rw=1;eq=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);eq=0;returnresult;}//写指令数据到LCDvoidlcd_wcmd(ucharcmd){rs=0;rw=0;eq=0;P0=cmd;eq=1;delay_lcd(1);eq=0;}//写入显示数据到LCDvoidlcd_wdat(uchardat){while(lcd_bz());rs=1;rw=0;P0=dat;delay_lcd(1);eq=1;eq=0;}//LCD初始化voidlcd_init(){lcd_wcmd(
本文标题:用24C04与1602LCD设计电子密码锁各模块
链接地址:https://www.777doc.com/doc-3582931 .html