完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
介绍
网上寻遍了资料发现驱动LCD1602液晶屏的程序几乎都是4线或8线数据线。基本思路都是直接操作I/O,但是缺点是接线太多,十分麻烦。PCF8574和PCF8574AT这两种芯片都是IIC芯片,可以将并行的八根数据线转换只用两根数据线进行控制,减少了I/O口的使用,提高所使用微处理器的控制能力。 故此记录用PCF8574AT代替直接操作I/O驱动LCD1602。以下内容是编写程序时发现并修正的一些错误和使用该款芯片时需要注意的细节,希望能够抛砖引玉。如有错误还请指正! PCF8574AT 某宝上有一款LCD1602驱动板,能够极大程度节约引脚资源。用IIC协议驱动屏幕。 选址 其中值得注意的点,芯片名称有所区别,根据实际芯片找到对应的地址才能寻址成功。A2 A1 A0是硬件选址,默认不接均为1。最低bit为读写位。 以PCF8574AT为例,查找其地址。 最后芯片写地址是 0x7e芯片接线图 LCD1602 显示问题 我使用野火指南者板子stm32f103vet6,程序烧写后需要复位才能正常显示lcd1602内容。这个问题可以在lcd初始化命令补一句。 void LCD_Init(void)上述初始化之后,完美解决了上电复位后才显示文本的问题。 乱码问题 快速复位lcd1602会出现乱码是因为没有读忙函数。 读忙函数51实现: /* 等待液晶准备好 */ void LcdWaitReady() { unsigned char sta; LCD1602_DB = 0xFF; LCD1602_RS = 0; LCD1602_RW = 1; do { LCD1602_E = 1; sta = LCD1602_DB; //读取状态字 LCD1602_E = 0; } while (sta & 0x80); //bit7等于1表示液晶正忙,重复检测直到其等于0为止 } STM32实现: void LCD1602_Wait_Ready(void) { uint8_t sta; LCD_data |= 0xf0; //数据高四位置1 i2c_WriteByte(LCD_data); LCD_data &=~(1<<(1-1));//RS=0; // 0 0 0 0 0 0 0 0 LCD_data |=(1<<(2-1));//RW=1; // D7 D6 D5 D4 E RW RS i2c_WriteByte(LCD_data); do { LCD_data |= 1<<2; // 0000(数据)0000(控制位) // 0xxx 0100 -------> E=1 i2c_WriteByte(LCD_data); SysTick_Delay_Ms(5); //延时 sta = i2c_R_Byte(); /* 读取状态字 */ LCD_data ^= 1<<2; //异或运算(还原) // 0xxx 0000 ----------> E=0 //or LCD_data &=~(1<<2) //I2C_WriteByte(LCD_data);//1→0 执行指令 i2c_WriteByte(LCD_data); }while(sta &0x80); /* 状态字的最高位 1忙,0空闲 */ } |
|
|
|
只有小组成员才能发言,加入小组>>
3263 浏览 9 评论
2944 浏览 16 评论
3443 浏览 1 评论
8955 浏览 16 评论
4036 浏览 18 评论
1079浏览 3评论
559浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
552浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2287浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1848浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 17:20 , Processed in 0.843993 second(s), Total 45, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号