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 的器件
2、地址为 40h,由于硬件地址引脚 A0-A2 可寻址 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 #include
3、 sbit SCL = P30;sbit SDA = P31;bit ack;unsigned char LCD_data;unsigned char code digit =“0123456789“; /定义字符数组显示数字/*延时*void delay_nus(unsigned int n) /N us 延时函数unsigned int i=0;for (i=0;i4us 后 SCL 跳变SCL=1;nop4();SDA=1;_nop_();_nop_();/*void Write_A_Byte(unsigned char c)unsigned char BitCnt;for(BitCnt
4、=0;BitCnt8;BitCnt+) /要传送的数据长度为 8 位if(cBitCnt) /判断发送位else SDA=0; _nop_();SCL=1; /置时钟线为高,通知被控器开始接收数据位nop4(); _nop_(); SCL=0; _nop_();_nop_();SDA=1; /8 位发送完后释放数据线,准备接收应答位_nop_();_nop_(); SCL=1;_nop_();_nop_();_nop_();if(SDA=1)ack=0; else ack=1; /判断是否接收到应答信号SCL=0;_nop_();_nop_();bit Write_Random_Address
5、_Byte(unsigned char add,unsigned char dat)Start(); /启动总线Write_A_Byte(add); /发送器件地址if(ack=0)return(0);Write_A_Byte(dat); /发送数据if(ack=0)return(0);Stop(); /结束总线return(1);/*液晶屏使能 *void Enable_LCD_write()LCD_data|=(1(3-1);/E=1;Write_Random_Address_Byte(0x40,LCD_data);delay_nus(2);LCD_data/E=0;Write_Rando
6、m_Address_Byte(0x40,LCD_data);/*写命令*void LCD_write_command(unsigned char command)delay_nus(16);LCD_data/RS=0;LCD_data/RW=0;Write_Random_Address_Byte(0x40,LCD_data);LCD_data /清高四位LCD_data|=command /写高四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();command=command4; /低四位移到高四位LCD_data /清高
7、四位LCD_data|=command /写低四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();/*写数据*void LCD_write_data(unsigned char value) delay_nus(16);LCD_data|=(1(1-1);/RS=1;LCD_data/RW=0;Write_Random_Address_Byte(0x40,LCD_data);LCD_data /清高四位LCD_data|=value /写高四位Write_Random_Address_Byte(0x40,LCD_data)
8、;Enable_LCD_write();value=value4; /低四位移到高四位LCD_data /清高四位LCD_data|=value /写低四位Write_Random_Address_Byte(0x40,LCD_data);Enable_LCD_write();/*设置显示位置*void set_position(unsigned char x,unsigned char y)unsigned char position;if (y = 0)position = 0x80 + x;else position = 0xc0 + x;LCD_write_command(positio
9、n);/*显示字符串*void display_string(unsigned char x,unsigned char y,unsigned char *s) set_position(x,y);while (*s) LCD_write_data(*s); s+; /*液晶初始化*void LCD_init(void) LCD_write_command(0x28);delay_nus(40); LCD_write_command(0x28);delay_nus(40); Enable_LCD_write();delay_nus(40);LCD_write_command(0x28); /4 位显示!LCD_write_command(0x0c); /显示开LCD_write_command(0x01); /清屏delay_nms(2);void main(void)LCD_init();display_string(4,0,“imxuheng“); /显示一段文字display_string(2,1,“Hello Today!“); /显示一段文字while(1);程序还不够完美,自身工作与电学没什么关系,只是业余爱好鼓捣鼓捣,希望各位能够提出修改意见。