1、uchar IS_Valid_User = 0;uchar code Title_Text=Your Password.;uchar DSY_BUFFER10= /显示缓冲uchar UserPassword10= /用户输入的密码void Initialize_LCD();void Set_Disp_Pos(uchar pos);void Write_LCD_Data(uchar dat);void Display_String(uchar *str,uchar LineNO); /在液晶指定行显示字符串void IIC_24C04_Init(); /IIC 初始化void Beep();v
2、oid yinyue();void Write_LCD_Command(uchar cmd);uchar RecString(uchar Slave,uchar Subsddr,uchar *Buffer,uchar N);/从IIC 读取数据uchar SendString(uchar Slave,uchar Subsddr,uchar *Buffer,uchar N);/向IIC 写入数据uchar Keys_Scan(); /键盘扫描void boss();sbit LED_OPEN=P24; /开锁亮灯sbit BEEP=P37; /蜂鸣器sbit RS=P27;sbit RW=P26
3、;sbit EN=P25;sbit SCL=P32;sbit SDA=P33;/-/延时void DelayXus(uint x)uchar i;while(x-) for(i=0;i120;i+);/蜂鸣器子程序void Beep()for (i=0;100;i+)DelayXus(1);BEEP=BEEP;BEEP=0;/- -/清除密码void Clear_Password()UserPassword0 = 0DSY_BUFFER0=void Display_String(uchar *str,uchar LineNO)Write_LCD_Command(LineNO|0x80);for
4、(i=0;=strlen(str);Write_LCD_Data(stri);/-/ 主程序void main()P0 = 0xFF;P1 = 0xFF;P2 = 0xFF;IE=0x82; /允许T0 中断TMOD=0x00;/ TMOD = 0x02; /T0 设置为8 位自动重装模式/ TH0 = 175;/ TL0 = 175;/ TR0 = 1; /启动T0DelayXus(10);Initialize_LCD(); /初始化LCDIIC_24C04_Init(); /初始化24C04Display_String(Title_Text,0x00); /在第1 行显示标题RecStri
5、ng(0xa0, 0 , IIC_Password, 6);IIC_Password0 =UserPassword0 =while(1) boss();Beep();DelayXus(100);P1= 0xF0;while (P1 != 0xF0); /如果有键未释放则等待while (P1 = 0xF0); /如果没有再次按下按键则等待/-LCD1602.C-/液晶控制与显示程序void DelayMS(uint ms)while(ms-) for(i=0;/-/忙检查uchar Busy_Check()uchar LCD_Status;RS=0; /RS 为寄存器选择,高电平1 时选择数据
6、寄存器、低电平0 时选择指令寄存器。RW=1; /R/W 为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作EN=1; /E(或EN)端为使能(enable)端,下降沿使能,下跳变时液晶屏开始执行命令DelayMS(1);LCD_Status=P0; /DB9 为高4 位三态、 双向数据总线 7 位(最高位)(也是busy flag)EN=0;return LCD_Status;/-/写LCD 命令/-void Write_LCD_Command(uchar cmd)while(Busy_Check()&0x80)=0x80); /忙等待 /低电平0 时选择指令寄存器RW=0;
7、/低电平(0)时进行写操作 /写指令时,E 为高脉冲,即让E 从0 到1 发生正跳变,应先置0P0=cmd; /产生正跳变/设置LCD 显示位置void Set_Disp_Pos(uchar pos)Write_LCD_Command(pos|0x80);/发送数据void Write_LCD_Data(uchar dat)RS=1; /高电平1 时选择数据寄存器P0=dat;/LCD 初始化void Initialize_LCD()Write_LCD_Command(0x38); /设置162 显示,57 点阵,8 位数据接口Write_LCD_Command(0x01); /显示清屏,数据
8、指针=0,所有显示=0Write_LCD_Command(0x06); /写指令06H 置字符输入模式:屏幕不动,字符后移Write_LCD_Command(0x0c); /显示开,关光标/*/-/显示字符串void ShowString(uchar x,uchar y,uchar *str)uchar i=0;if (y=0) Write_LCD_Command(0x80|x); /以下设置显示起始位置if (y=1) Write_LCD_Command(0xc0|x); /1602 型LCD 字符显示位置的确定方法规定为:80H+地址码,注意可以设置显示位置/第二行行首地址:80H+40H
9、=0CH 教材P28716;i+) /输出字符串*/-/1602 型LCD 内部地址参照教材P287,1602 型字符显示位置的确定方法规定为80H+地址码(00-0FH 40-4FH)/如要将字符显示在第2 行第6 列,则确定地址的指令代码应为80H+45H=C5H/-24C04.c-/24C04 IIC 读/写程序/-void DeslayMS(uint x)/-/起始位void Start()SDA=1;SCL=1;Delay4us();SDA=0;SCL=0;/停止位void Stop()/读取应答 每次传送一个字节完毕,必须接收从机发出的一个应答位void RACK()/发送应答信号
10、void ACK()/发送非应答信号void NO_ACK()/从芯片读取1 字节uchar Recbyte()uchar i,rd;rd=0x00;8;rd=1;rd |=SDA;return rd;/向芯片发送1 字节uchar SendByte(uchar wd)bit ack0;SDA=(bit)(wd & 0x80);wd /释放总线并准备读取应答ack0=!SDA; / 此SDA 为从机发来的应答信号,SDA 为0 表示应答,为1 则为无应答return ack0; /返回应答/向芯片发送多字节数据函数(写多字节)uchar SendString(uchar Slave,uchar
11、 Subaddr,uchar *Buffer,uchar N)Start();if (!SendByte(Slave) return 0; /0xa0 器件地址以及写入操作,0xa0 即为10100000BSendByte(Subaddr) return 0;N;SendByte(Bufferi) return 0;Stop();return 1;/接收多字节数据函数(读多字节)uchar RecString(uchar Slave,uchar Subaddr,uchar *Buffer,uchar N)SendByte(Slave+1) return 0; /0xa1 器件地址以及读取操作,
12、0xa1 即为1010 0001BN-1;Bufferi= Recbyte(); /接收数据ACK(); /发送应答位BufferN-1= Recbyte(); /NO_ACK(); /发送非应答位/向24C04 中写一个字节数据/数据先通过指令完成移位再从SDA 串行输出。按照时序要求,/数据在SCL 低电平时变化,高电平时稳定,每个时钟脉冲传送一位。void Write_A_Byte(uchar b)bSDA=CY; /反汇编可以看出左移是x/SDA = (bit)(b&0x80); /通过按位“与”运算将最高位数据?/因为传送时高位在前,低位在后RACK();/向指定地址写数据void
13、Write_IIC(uchar addr,uchar dat)Write_A_Byte(0xa0); /0xa0 器件地址以及写入操作,0xa1 即为1010 0000BWrite_A_Byte(addr); /芯片内存寻址Write_A_Byte(dat);DeslayMS(10);uchar Read_A_Byte()uchar i,b; /可以不要b|=SDA;return b;/从任意地址读取数据uchar Read_Current()uchar d;Write_A_Byte(0xa1);d=Read_A_Byte();return d;uchar Random_Read(uchar addr)return Read_Current();/-/中断发声换函数void T0_INT() interrupt 1BEEP=!BEEP;TH0=HI_LISTsidx;TL0=LO_LISTsidx;/IIC 总线初始化/-
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1