1、密码锁#include #include#define LCM_Data P0#define uchar unsigned char #define uint unsigned int#define w 6 /定义密码位数sbit lcd1602_rs=P27;sbit lcd1602_rw=P26;sbit lcd1602_en=P25;sbit Scl=P34; /24C02串行时钟sbit Sda=P35; /24C02串行数据sbit ALAM = P21; /报警 sbit KEY = P36; /开锁sbit open_led=P22; /开锁指示灯bit operation=0;
2、 /操作标志位bit pass=0; /密码正确标志bit ReInputEn=0; /重置输入充许标志 bit s3_keydown=0; /3秒按键标志位bit key_disable=0; /锁定键盘标志unsigned char countt0,second; /t0中断计数器,秒计数器void Delay5Ms(void);unsigned char code a=0xFE,0xFD,0xFB,0xF7; /控盘扫描控制表unsigned char code start_line = password: ;unsigned char code name = =Coded Lock=;
3、 /显示名称unsigned char code Correct = correct ; /输入正确unsigned char code Error = error ; /输入错误unsigned char code codepass = pass ; unsigned char code LockOpen = open ; /OPENunsigned char code SetNew = SetNewWordEnable;unsigned char code Input = input: ; /INPUTunsigned char code ResetOK = ResetPasswordOK
4、 ;unsigned char code initword = Init password.;unsigned char code Er_try = error,try again!;unsigned char code again = input again ;unsigned char InputData6; /输入密码暂存区unsigned char CurrentPassword6=1,3,1,4,2,0; /当前密码值unsigned char TempPassword6;unsigned char N=0; /密码输入位数记数unsigned char ErrorCont; /错误
5、次数计数unsigned char CorrectCont; /正确输入计数unsigned char ReInputCont; /重新输入计数unsigned char code initpassword6=0,0,0,0,0,0;/=5ms延时=void Delay5Ms(void) unsigned int TempCyc = 5552; while(TempCyc-);/=400ms延时=void Delay400Ms(void) unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA-) TempCycB=7
6、269; while(TempCycB-); /=/=24C02=/=void mDelay(uint t) /延时 uchar i; while(t-) for(i=0;i125;i+) ; void Nop(void) /空操作 _nop_(); _nop_(); _nop_(); _nop_();/*起始条件*/void Start(void) Sda=1; Scl=1; Nop(); Sda=0; Nop(); /*停止条件*/void Stop(void) Sda=0; Scl=1; Nop(); Sda=1; Nop();/*应答位*/void Ack(void) Sda=0; N
7、op(); Scl=1; Nop(); Scl=0;/*反向应答位*/void NoAck(void) Sda=1; Nop(); Scl=1; Nop(); Scl=0; /*发送数据子程序,Data为要求发送的数据*/void Send(uchar Data) uchar BitCounter=8; uchar temp; do temp=Data; Scl=0; Nop(); if(temp&0x80)=0x80) Sda=1; else Sda=0; Scl=1; temp=Data1; Data=temp; BitCounter-; while(BitCounter); Scl=0;
8、/*读一字节的数据,并返回该字节值*/uchar Read(void) 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=temp1; temp=temp1; BitCounter-; while(BitCounter); return(temp); void WrToROM(uchar Data,uchar Address,uchar
9、Num) uchar i; uchar *PData; PData=Data; for(i=0;iNum;i+) Start(); Send(0xa0); Ack(); 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;i0;x-) for(y=110;y0;y-);/-写指令-write_1602com(uchar com
10、)/*液晶写入指令函数* lcd1602_rs=0;/数据/指令选择置为指令 lcd1602_rw=0; /读写选择置为写 P0=com;/送入数据 delay(1); lcd1602_en=1;/拉高使能端,为制造有效的下降沿做准备 delay(1); lcd1602_en=0;/en由高变低,产生下降沿,液晶执行命令/-写数据-write_1602dat(uchar dat)/*液晶写入数据函数* lcd1602_rs=1;/数据/指令选择置为数据 lcd1602_rw=0; /读写选择置为写 P0=dat;/送入数据 delay(1); lcd1602_en=1; /en置高电平,为制造
11、下降沿做准备 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) ca
12、se (0x11): k=1;break; case (0x21): k=2;break; case (0x41): k=3;break; case (0x81): k=A;break; case (0x12): k=4;break; case (0x22): k=5;break; case (0x42): k=6;break; case (0x82): k=B;break; case (0x14): k=7;break; case (0x24): k=8;break; case (0x44): k=9;break; case (0x84): k=C;break; case (0x18): k
13、=*;break; case (0x28): k=0;break; case (0x48): k=#;break; case (0x88): k=D;break; return(k);中间部分去掉了。到时一起发你/=主函数=void main(void) unsigned char KEY,NUM; unsigned char i,j; P1=0xFF; TMOD=0x11; TL0=0xB0; TH0=0x3C; EA=1; ET0=1; TR0=0; Delay400Ms(); /启动等待,等LCM讲入工作状态 lcd_init(); /LCD初始化 write_1602com(yi);/
14、日历显示固定符号从第一行第0个位置之后开始显示 for(i=0;i16;i+) write_1602dat(namei);/向液晶屏写日历显示的固定符号部分 write_1602com(er);/时间显示固定符号写入位置,从第2个位置后开始显示 for(i=0;i16;i+) write_1602dat(start_linei);/写显示时间固定符号,两个冒号 write_1602com(er+9); /设置光标位置 write_1602com(0x0f); /设置光标为闪烁 Delay5Ms(); /延时片刻(可不要) N=0; /初始化数据输入位数 while(1) if(key_disa
15、ble=1) Alam_KeyUnable(); else ALAM=1; /关报警 KEY=keynum(); if(KEY!=0) if(key_disable=1) second=0; else NUM=coding(KEY); switch(NUM) case (A): ; break; case (B): ; break; case (C): ; break; case (D): ResetPassword(); break; /重新设置密码 case (*): Cancel(); break; /取消当前输入 case (#): Ensure(); break; /确认键, def
16、ault: /DisplayListChar(0,1,Input); write_1602com(er); for(i=0;i16;i+) write_1602dat(Inputi); operation=0; if(N6) /当输入的密码少于6位时,接受输入并保存,大于6位时则无效。 OneAlam(); /按键提示音 /DisplayOneChar(6+N,1,*); for(j=0;j=N;j+) write_1602com(er+6+j); write_1602dat(*); InputDataN=NUM; N+; else /输入数据位数大于6后,忽略输入 N=6; break; /*中断服务函数*void time0_int(void) interrupt 1 TL0=0xB0; TH0=0x3C; /TR0=1; countt0+; if(countt0=20) countt0=0; second+; if(pass=1) if(second=1) open_led=1; /关指示灯 TR0=0; /关定时器 TL0=0xB0; TH0=0x3C; second=0; else if(second=3) TR0=0; second=0; key_disable=0; s3_keydown=0; TL0=0xB0; TH0=0x3C; else TR0=1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1