C51单片机,用LCD1602显示6位密码时最高位无效

C51单片机,用LCD1602显示6位密码时最高位无效,显示五位时却没有问题?本人采用的是除10的n次方在对十取余得到每一位的数。

img

img

img

推測:
如果使用的數字是 int16, 範圍是 -32'768~ +32'767 / 0 ~ 65'535.
六位數超過了 int16 的最大範圍。
五位數,超過範圍也會出現同樣的問題。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 请看👉 :C51编程21-应用篇(LCD1602显示-2)
  • 除此之外, 这篇博客: C51单片机实验-LCD1602显示实验中的 代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #include <reg51.h>
    typedef unsigned char uchar;
    typedef unsigned int uint;
    
    #define out P0
    sbit E=P1^5;
    sbit RW=P1^6;
    sbit RS=P1^7;
    
    void delay(uint j); //延时
    void delay_ms(uchar t); //ms级延时
    void check_busy(); //查忙
    void write_command(uchar com); //写命令
    void write_data(uchar wdata); //写数据
    void lcd_initial(); //LCD初始化
    void string(uchar address,uchar *s); //将字符串显示在LCD的指定位置
    
    void main(){
    	lcd_initial();
    	while(1){
    		string(0x80,"Hello world!"); //从第一行第一处开始显示(80H + 00H)
    		string(0xc0,"Welcome ZZULI!"); //从第二行第一处开始显示(80H + 40H)
    		delay(100);
    	}
    }
    
    void delay(uint j){
    	uchar i = 60;
    	for(; j>0; j--){
    		while(--i);
    		i = 59;
    		while(--i);
    		i = 60;
    	}
    }
    
    void delay_ms(uchar t){
    	uchar j;
    	for(;t!=0; t--){
    	  for (j=0;j<225;j++);
      }
    }
    
    void check_busy(){
    	uchar flag=0xff;
    	do{
    		E=0;
    		RS=0;
    		RW=1;
    		E=1; //E=1时可以读LCD状态
    		flag=out;
    	}while(flag&0x80); //检查BF位
    	E=0;
    }
    
    void write_command(uchar com){
    	check_busy();
    	E=0;
    	RS=0;
    	RW=0;
    	out=com;
    	delay_ms(5);
    	E=1; //当上升沿到来时,写入状态字
    	delay_ms(5);
    	E=0;
    	delay(1);
    }
    
    void write_data(uchar wdata){
    	check_busy();
    	E=0;
    	RS=1;
    	RW=0;
    	out=wdata;
    	delay_ms(5);
    	E=1; //当上升沿到来时,写入数据
    	delay_ms(5);
    	E=0;
    	delay(1);
    }
    
    void lcd_initial(){
    	write_command(0x38);//8位总线,双行显示,5X7的点阵字符
    	write_command(0x0C);//开整体显示,光标关,无闪烁
    	write_command(0x06);//光标右移
    	write_command(0x01);//清屏
    	delay(1);
    }
    
    void string(uchar address,uchar *s){
    	write_command(address); //找显示数据RAM地址
    	while(*s>0) write_data(*s++); //循环写入数据
    }
    
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^