LCD1602按下复位后乱码的问题

1602按下后会有乱码的问题,其实根本上是硬件引起的。某些最小系统板的复位电路没做好,按下复位键后,就会产生乱码
在这里插入s图片描述
但是出现这种现象,是可以用软件后期修正的。
由于LCD复位后默认是8线输入,如果函数LCD_write_command是一个按四线输入写入的函数,那么执行LCD_write_command(0x28);等效为先写入8线指令0x20;写入后LCD已经改为了四线模式,再写入4线指令8x的高四位,但是不再有低四位写入,所以之后写入其他数据时,LCD仍在等待上一个指令的低四位。这样就导致了不能正常的进行后面的操作。

解决方法:先执行LCD_write_command(0x02)(0x20应该也是可以的),先是写入了8线指令2,再写入8线指令0`,这样就将LCD改为4线传输,在紧跟这步之后,写入0x32,之后按4线写数据时,就没有高低错乱的问题,

以下为用IIC_1602写的代码。普通1602的解决思路是一样的。

void LCD_init(void) 
{ 
	LCD_write_command(0x20);//执行20,先是写入8线指令2x,这时才将LCD改为4线传输
	LCD_write_command(0x32);//将8位转成四位
	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);
}
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1602汉字显示,如有需要可以下载 #include #define uchar unsigned char #define uint unsigned int sbit lcdrs=P1^0; sbit lcden=P1^2; sbit lcdwr=P1^1; uchar CGCODE[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,//"年"代码 0x00 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//"月"代码 0x01 0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00,//"日"代码 0x02 0x07,0x04,0x07,0x04,0x07,0x00,0x04,0x07,//"星"左上半部分代码 0x03 0x1F,0x01,0x1F,0x01,0x1F,0x08,0x08,0x1F,//"星"右上半部分代码 0x04 0x08,0x17,0x00,0x1F,0x00,0x00,0x00,0x00,//"星"左下半部分代码 0x05 0x08,0x1F,0x08,0x1F,0x00,0x00,0x00,0x00//"星"右下半部分代码 0x06 }; uchar tab[]={'0','8',0x00,'0','3',0x01,'0','9',0x02};//显示"08年03月09日" void delay(uint t) { uint x,y; for(x=0;x<t;x++) for(y=0;y<110;y++); } void write_com(uchar com)//向1602写指令 { lcdrs=0; P2=com; delay(5); lcden=1; delay(5); lcden=0; } void write_date(uchar dat)//向1602写数据 { lcdrs=1; P2=dat; delay(5); lcden=1; delay(5); lcden=0; } void init()//程序初始化 { lcdwr=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } void main()//主函数 { int i; init(); lcdrs=0; lcdwr=0; write_com(0x40);//将自定义字符写入CGRAM for(i=0;i<56;i++)//循环56次写入 { write_date(CGCODE[i]); } write_com(0x80);//写入初始地址 for(i=0;i<9;i++) { write_date(tab[i]); } write_com(0x80+9);//用09H和0AH显示"星"上部分 write_date(0x03); write_date(0x04); write_com(0x80+0x40+9);//用49H和4AH显示"星"上部分 write_date(0x05); write_date(0x06); while(1); }
要实现LCD1602电子钟的秒复位功能,你需要使用一个计时器来计算并显示时间。在每一秒钟的时候,你可以通过检测计时器的值来触发秒复位操作。 首先,你需要连接LCD1602显示屏到你的控制器上,并确保能够正常显示时间。接下来,你需要使用一个计时器来计算秒数。根据你使用的控制器和编程语言的不同,具体的实现方式可能会有所不同。 在每一秒钟的时候,你可以在代码中设置一个触发条件来执行秒复位操作。例如,你可以在计时器达到60秒时,将秒数重置为0,并更新LCD显示屏上的时间。 具体的代码实现方式取决于你使用的控制器和编程语言。以下是一个简单的示例,展示了如何使用Arduino控制器和Arduino编程语言来实现秒复位功能: ```c #include <Wire.h> #include <LiquidCrystal_I2C.h> // 初始化LCD显示屏 LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C地址可能要根据你的配置进行修改 // 定义变量 int seconds = 0; void setup() { // 初始化LCD显示屏 lcd.begin(16, 2); // 设置计时器中断 attachInterrupt(digitalPinToInterrupt(2), resetSeconds, RISING); // 将引脚2连接到计时器的输出引脚 // 设置计时器 TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 15624; // 设置计时器比较值,用于1秒钟的计时 TCCR1B |= (1 << WGM12); // 使用CTC模式 TCCR1B |= (1 << CS10) | (1 << CS12); // 分频系数为1024 TIMSK1 |= (1 << OCIE1A); // 允许比较中断 } void loop() { // 显示时间 lcd.setCursor(0, 0); lcd.print("Time: "); lcd.print(seconds); delay(1000); // 延迟1秒钟 } // 秒复位中断处理函数 void resetSeconds() { seconds = 0; } // 定时器中断处理函数 ISR(TIMER1_COMPA_vect) { seconds++; // 每秒增加一秒 } ``` 这是一个简单的示例,你可以根据你的具体需求进行修改和扩展。记得根据你实际的硬件和编程环境进行相应的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值