stc单片机连接1602的显示问题

用杜洋的时钟例子,1602只显示一排方块,调电位器白搭。

怀疑是例子程序有问题,改用1602最小系统,情况依旧。

搜索了一下,问题原因大概有两个:一是1602没有正常初始化;二是排线可能有短路或断路。排除程序的问题。

后来在CSDN论坛看到

Kejane的文章中提到将初始化代码: write_com(0x38); delay(5);重复4次即可解决问题,遂试了一下,问题解决。

要实现STC单片机LCD1602显示温度,需要先连接温度传感器并读取温度值,然后将温度值转换为字符串并输出到LCD1602上。 以下是可能的代码实现: ```c #include <STC12C5A60S2.h> #include <intrins.h> #define LCD_RS P1_0 // LCD1602 RS信号引脚 #define LCD_RW P1_1 // LCD1602 RW信号引脚 #define LCD_E P1_2 // LCD1602 E信号引脚 #define LCD_D4 P1_4 // LCD1602 数据信号引脚4 #define LCD_D5 P1_5 // LCD1602 数据信号引脚5 #define LCD_D6 P1_6 // LCD1602 数据信号引脚6 #define LCD_D7 P1_7 // LCD1602 数据信号引脚7 #define TEMP_PIN P3_0 // 温度传感器引脚 // 延时函数 void delay(unsigned int t) { while(t--); } // LCD1602命令写入 void LCD_WriteCmd(unsigned char cmd) { LCD_RS = 0; LCD_RW = 0; LCD_E = 0; _nop_(); _nop_(); LCD_D7 = cmd >> 7; LCD_D6 = (cmd >> 6) & 0x01; LCD_D5 = (cmd >> 5) & 0x01; LCD_D4 = (cmd >> 4) & 0x01; LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; _nop_(); _nop_(); LCD_D7 = (cmd >> 3) & 0x01; LCD_D6 = (cmd >> 2) & 0x01; LCD_D5 = (cmd >> 1) & 0x01; LCD_D4 = cmd & 0x01; LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; delay(5); } // LCD1602数据写入 void LCD_WriteData(unsigned char data) { LCD_RS = 1; LCD_RW = 0; LCD_E = 0; _nop_(); _nop_(); LCD_D7 = data >> 7; LCD_D6 = (data >> 6) & 0x01; LCD_D5 = (data >> 5) & 0x01; LCD_D4 = (data >> 4) & 0x01; LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; _nop_(); _nop_(); LCD_D7 = (data >> 3) & 0x01; LCD_D6 = (data >> 2) & 0x01; LCD_D5 = (data >> 1) & 0x01; LCD_D4 = data & 0x01; LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; delay(5); } // 初始化LCD1602 void LCD_Init() { delay(15000); LCD_WriteCmd(0x30); delay(4500); LCD_WriteCmd(0x30); delay(300); LCD_WriteCmd(0x30); delay(600); LCD_WriteCmd(0x38); // 设置16x2显示,5x8点阵,8位数据接口 LCD_WriteCmd(0x08); // 关闭显示 LCD_WriteCmd(0x01); // 清除显示 LCD_WriteCmd(0x06); // 显示光标右移,不移动内容 LCD_WriteCmd(0x0C); // 打开显示,不显示光标、闪烁 } // 读取温度值 float Get_Temperature() { unsigned int temp; // 温度值 unsigned char low_byte, high_byte; // 低字节和高字节 float temperature; // 实际温度值 // 启动温度传感器 TEMP_PIN = 1; delay(10); TEMP_PIN = 0; delay(10); // 读取温度值 TEMP_PIN = 1; delay(10); low_byte = TEMP_PIN; delay(10); high_byte = TEMP_PIN; delay(10); // 计算温度值 temp = (high_byte << 8) | low_byte; temperature = temp * 0.0625; return temperature; } // 将浮点数转换为字符串 void FloatToString(char* str, float value) { int integer = (int)value; int decimal = (int)((value - integer) * 100); sprintf(str, "%d.%02d", integer, decimal); } void main() { char temp_str[10]; // 存储温度字符串 LCD_Init(); // 初始化LCD1602 while(1) { float temperature = Get_Temperature(); // 读取温度值 FloatToString(temp_str, temperature); // 将温度值转换为字符串 LCD_WriteCmd(0x01); // 清屏 LCD_WriteCmd(0x80); // 光标移到第一行第一列 LCD_WriteData('T'); LCD_WriteData('e'); LCD_WriteData('m'); LCD_WriteData('p'); LCD_WriteData(':'); LCD_WriteData(' '); for(int i = 0; i < strlen(temp_str); i++) { LCD_WriteData(temp_str[i]); // 在第一行显示温度值 } delay(1000); // 延时1秒钟 } } ``` 注意:以上代码仅供参考,具体实现方式可能因电路设计、STC单片机型号等因素而异。请根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值