欢迎来到天天文库
浏览记录
ID:38977378
大小:2.58 MB
页数:8页
时间:2019-06-22
《51单片机任意2个IO口驱动LCD1602》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、51单片机任意2个IO口驱动LCD1602相信大家对1602显示屏已经十分熟悉,驱动方式有8线制(需要11根线)和4线制(需要7根线),这里为大家推荐一种只需要2根线就能驱动1602的方法。之前在网上见到Arduino通过IIC驱动1602的实例,本人完全不懂Arduino程序,看了一下驱动电路,发现PCF8574这个关键芯片,它就相当于一个桥梁,将IIC总线转换为8位准双向口。思路1、单片机通过IIC与PCF8574进行通信。首先写好IIC通信程序,网上到处都是IIC通信程序,很容易找。PCF8574的器件地址为40h,由于硬件地址引脚A0-A
2、2可寻址8个器件,所以器件地址并不唯一,具体说明大家去查查PCF8574芯片手册。2、单片机4线制驱动1602网上也有很多相关程序,我就不再多说。4线制驱动方式需要7个IO口(RS、RW、E和4条数据线),而PCF8574提供了8位准双向口,所以管脚还有剩余。3、IIC通信程序和1602的4线制驱动程序相结合4、51单片机任意2个IO口驱动1602成功!!!。(我只是个业余爱好者,要是各位觉得太低端那就见谅了)驱动电路图效果图实物图Proteus仿真程序#include#includesbitSCL=P3^
3、0;sbitSDA=P3^1;bitack;unsignedcharLCD_data;unsignedcharcodedigit[]={"0123456789"};//定义字符数组显示数字//*****************延时************************voiddelay_nus(unsignedintn)//Nus延时函数{unsignedinti=0;for(i=0;i4、i4us后SC5、L跳变SCL=1;nop4();SDA=1;_nop_();_nop_();}//******************************************voidWrite_A_Byte(unsignedcharc){unsignedcharBitCnt;for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位{if((c<6、0;}_nop_();_nop_();SDA=1;//8位发送完后释放数据线,准备接收应答位_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();if(SDA==1)ack=0;elseack=1;//判断是否接收到应答信号SCL=0;_nop_();_nop_();}bitWrite_Random_Address_Byte(unsignedcharadd,unsignedchardat){Start();//启动总线Write_A_Byte(add);//发送器件地址if(ack==0)return(0);7、Write_A_Byte(dat);//发送数据if(ack==0)return(0);Stop();//结束总线return(1);}//********************液晶屏使能*********************voidEnable_LCD_write(){LCD_data8、=(1<<(3-1));//E=1;Write_Random_Address_Byte(0x40,LCD_data);delay_nus(2);LCD_data&=~(1<<(3-1));//E=0;Write_Random_Address_Byte(0x9、40,LCD_data);}//*************写命令****************************voidLCD_
4、i4us后SC
5、L跳变SCL=1;nop4();SDA=1;_nop_();_nop_();}//******************************************voidWrite_A_Byte(unsignedcharc){unsignedcharBitCnt;for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位{if((c<6、0;}_nop_();_nop_();SDA=1;//8位发送完后释放数据线,准备接收应答位_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();if(SDA==1)ack=0;elseack=1;//判断是否接收到应答信号SCL=0;_nop_();_nop_();}bitWrite_Random_Address_Byte(unsignedcharadd,unsignedchardat){Start();//启动总线Write_A_Byte(add);//发送器件地址if(ack==0)return(0);7、Write_A_Byte(dat);//发送数据if(ack==0)return(0);Stop();//结束总线return(1);}//********************液晶屏使能*********************voidEnable_LCD_write(){LCD_data8、=(1<<(3-1));//E=1;Write_Random_Address_Byte(0x40,LCD_data);delay_nus(2);LCD_data&=~(1<<(3-1));//E=0;Write_Random_Address_Byte(0x9、40,LCD_data);}//*************写命令****************************voidLCD_
6、0;}_nop_();_nop_();SDA=1;//8位发送完后释放数据线,准备接收应答位_nop_();_nop_();SCL=1;_nop_();_nop_();_nop_();if(SDA==1)ack=0;elseack=1;//判断是否接收到应答信号SCL=0;_nop_();_nop_();}bitWrite_Random_Address_Byte(unsignedcharadd,unsignedchardat){Start();//启动总线Write_A_Byte(add);//发送器件地址if(ack==0)return(0);
7、Write_A_Byte(dat);//发送数据if(ack==0)return(0);Stop();//结束总线return(1);}//********************液晶屏使能*********************voidEnable_LCD_write(){LCD_data
8、=(1<<(3-1));//E=1;Write_Random_Address_Byte(0x40,LCD_data);delay_nus(2);LCD_data&=~(1<<(3-1));//E=0;Write_Random_Address_Byte(0x
9、40,LCD_data);}//*************写命令****************************voidLCD_
此文档下载收益归作者所有