电子密码锁总结报告内容摘要:

0)。 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。 iNum。 i++) { Start()。 Send(0xa0)。 21 Ack()。 Send(Address+i)。 Ack()。 Start()。 Send(0xa1)。 Ack()。 *(Pdata+i)=Read()。 Scl=0。 NoAck()。 Stop()。 } } //================================================================================================== //=======================================LCD1602==================================================== //================================================================================================== 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。 x0。 x) for(y=110。 y0。 y)。 } //写指令 write_1602(uchar )//****液晶写入指令函数 **** { lcd1602_rs=0。 //数据 /指令选择置为指令 lcd1602_rw=0。 //读写选择置为写 P0=。 //送入数据 delay(1)。 lcd1602_en=1。 //拉高使能端,为制造有效的下降沿做准备 delay(1)。 lcd1602_en=0。 //en 由高变低,产生下降沿,液晶执行命令 } 22 //写数据 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_1602(0x38)。 //设置液晶工作模式,意思: 16*2 行显示, 5*7 点阵, 8 位数据 write_1602(0x0c)。 //开显示不显示光标 write_1602(0x06)。 //整屏不移动,光标自动右移 write_1602(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。 23 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((P1amp。 0xf0)!=0xf0) { Delay5Ms()。 Delay5Ms()。 if((P1amp。 0xf0)!=0xf0) { row=P1^0xf0。 //确定行线 i=0。 P1=a[i]。 //精确定位 while(i4) { if((P1amp。 0xf0)!=0xf0) { col=~(P1amp。 0xff)。 //确定列线 break。 //已定位后提前退出 } else { i++。 P1=a[i]。 } } } else { return 0。 } while((P1amp。 0xf0)!=0xf0)。 return (row|col)。 //行线与列线组合后返回 24 } else return 0。 //无键按下时返回 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。 } //===================== 显 示 输 入 的 N 个数字,用 H 代替以便隐藏============================ void DisplayOne(void) 25 { // DisplayOneChar(9+N,1,‟*‟)。 write_1602(yi+5+N)。 write_1602dat(„*‟)。 } //=======================显示提示输入 ========================= void DisplayChar(void) { unsigned char I。 if(pass==1) { //DisplayListChar(0,1,LockOpen)。 write_1602(er)。 for(i=0。 i16。 i++) { write_1602dat(LockOpen[i])。 } } else { if(N==0) { //DisplayListChar(0,1,Error)。 write_1602(er)。 for(i=0。 i16。 i++) { write_1602dat(Error[i])。 } } else { //DisplayListChar(0,1,start_line)。 write_1602(er)。 for(i=0。 i16。 i++) { write_1602dat(start_line[i])。 } } } } void DisplayInput(void) { unsigned char I。 if(CorrectCont==1) 26 { //DisplayListChar(0,0,Input)。 write_1602(er)。 for(i=0。 i16。 i++) { write_1602dat(Input[i]。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。