🍌🍌
作者简介:大家好啊,我叫DW,每天分享一些我新学到的知识,期待和大家一起进步
🍋
🍋🍋
系列专栏:STM32
🍎
🍎🍎
🍎🍎🍎
🍎小实验目标:三线驱动LCD1602液晶🍎
🍊如有写得不好的地方欢迎大家指正🍊🍑开发板:正点原子STM32F103Mini版🍑
创作时间:🍒🍒🍒2022年6月4日🍒🍒🍒
不管是串行方式驱动LCD1602液晶还是并行方式驱动LCD1602液晶,都会占用STM32过多的IO口,那么有没有什么方式可以减少单片机IO口的使用呢?答案是有的。
我们可以把两片74HC595芯片以级联的方式驱动LCD1602,该方式只用到单片机的3个IO口就可以驱动LCD1602了。
在四位数码管的文章中已经详细介绍了74HC595这块芯片的使用方法,详细介绍见文章:15.[STM32]一篇文章教会你使用75HC595芯片驱动四位数码管
在该文章的基础上添加上一个写字节的函数。
写字节函数
//写字节函数
void LCD1602_Write_Byte(u8 dat,u8 dat1){
for(u8 i=0;i<8;i++){
((dat<<i)&0x80) ? DIO_High:DIO_Low;
SCK_High;
SCK_Low;
}
for(u8 i=0;i<8;i++){
((dat1<<i)&0x80) ? DIO_High:DIO_Low;
SCK_High;
SCK_Low;
}
RCK_High;
RCK_Low;
}
提示:两块74HC595采取级联方式,故需要发送两次数据。
接下来编写一个写指令和写数据的函数,该函数是本次例程的重点。我们需要写的是8位数据,但是我们只用到位:RS、RW、EN(对应位0~2),位3~7为0。
当我们需要写数据时E、RW、RS为:001,故需要写的指令为0000 0001(0x01)接下来需要将数据写到总线上,当E为高电平时数据会送到液晶内部,故需要写的指令为:0000 0101(0x05),之后需要释放EN,故需要重新写0x01;
当我们需要写指令时E、RW、RS为:000,故需要写的指令为0000 0000(0x00),接下来需要将指令写到总线上,当E为高电平时数据会送到液晶内部,故需要写的指令为:0000 0100(0x04),之后需要释放EN,故需要重新写0x00;
写指令和写数据的函数
void LCD1602_Write_Cmd_Data(u8 cmd,u8 data){
if(cmd){ //1 数据
LCD1602_Write_Byte(data,0x01); //0000 0001 // E = 0 RW = 0 RS = 1
delay_ms(3);
LCD1602_Write_Byte(data,0x05); //0000 0101 // E = 1 RW = 0 RS = 1
delay_ms(3);
LCD1602_Write_Byte(data,0x01); //0000 0001 // E = 0 RW = 0 RS = 1
}
else{ //0 指令
LCD1602_Write_Byte(data,0x00); //0000 0000 // E = 0 RW = 0 RS = 0
delay_ms(3);
LCD1602_Write_Byte(data,0x04); //0000 0100 // E = 1 RW = 0 RS = 0
delay_ms(3);
LCD1602_Write_Byte(data,0x00); //0000 0000 // E = 0 RW = 0 RS = 0
}
}
提示:
RS = 1:写数据 RS = 0:写指令
RW = 1:读操作 RW = 1:写操作
EN:读操作高有效 EN:高有效
接下来看硬件连接图吧。
第一片74HC595芯片的11、12、14引脚分别与单片机的PB0~PB2相连,74HC595的15、1、2引脚和LCD1602的RS、R/W、E引脚相连 。
第二片74HC595芯片的QA~QH引脚与LCD1602的D0~D7相连。
提示:
第一块芯片的9引脚和第二块芯片的14引脚相互连接
两块芯片的RCK、SCK相互连接
我们把上一篇DS18B20的文章的例程添加进去,就可以在LCD1602上显示温度了,大家一起来看看实验结果图吧。
今天的分享就到这里,谢谢大家的耐心阅读,如果觉得有用的话给个👍👍👍
🌜🌜🌜本章结束,我们下一章见🌜🌜🌜
参考资料:
1.STM32固件库手册
2.正点原子STM32不完全手册_库函数版本
3.参考视频
4.数字电子技术基础
资料已上传,需要自取