C51单片机,用LCD1602显示6位密码时最高位无效,显示五位时却没有问题?本人采用的是除10的n次方在对十取余得到每一位的数。
推測:
如果使用的數字是 int16, 範圍是 -32'768~ +32'767 / 0 ~ 65'535.
六位數超過了 int16 的最大範圍。
五位數,超過範圍也會出現同樣的問題。
#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++); //循环写入数据
}