哪位大哥耐心的帮我看下这个AVR驱动1602液晶的程序~~我再加分~

来源:百度知道 编辑:UC知道 时间:2024/09/24 12:04:35
void show(unsigned int dis_val)
{

DDRD=0xff;
DDRB=0x07;

write_com(0x38);
delay(5);
write_com(0x01);
delay(5);
write_com(0x0c);
delay(5);
write_com(0x06);
delay(5);
write_com(0x80+0x00);
delay(5);
write_dat(table[(dis_val/1000)%10]);
delay(1);
write_dat(table[(dis_val/100)%10]);
delay(1);
write_dat(table[(dis_val/10)%10]);
delay(1);
write_dat(table[dis_val%10]);
delay(1);

}
void main()
{ uint i=1234;
while(1)
{
show(i);
}
}

前面的端口设置我就省了~应该是正确的~

我的问题是,如果主函数里面不用while(1)的话 执行一次显示是正常的 就是在第一位开始显示 由于我要用来显示动态数字 所以加了个无限循环 可是之后就算是显示一个固定的数字都不行了,液晶上总是在我的数字后面接上一个8,而且不停的移动 并且第二行都有了显示 也是滚动显示 就是定不下来

有没有人也遇到这种问题,或者谁能帮我看下 指点一下 我在这里谢谢啦~~

解决了一定加分~~

你把以下程序作独立,作为1602初始化程序,不需要放在死循环里面;
void int_1602() {
DDRD=0xff;
DDRB=0x07;

write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}

void display(unsigned int dis_val){ //显示程序
write_com(0x80);
write_dat(table[dis_val/1000]);
delay(1);
write_dat(table[dis_val%1000/100]);
delay(1);
write_dat(table[dis_val%1000%100/10]);
delay(1);
write_dat(table[dis_val%1000%100%10]);
delay(1);
}

然后把主程序改成如下:
void main () {
uint i=1234;
int_1602();
while (1)
{ show(i);
delay(100);
}
}
你可以去我博客上找,我有相关1602驱动程序!
http://hi.baidu.com/chinasndw/
你可以照样去试试,不对给我留言!

出现错误的原因是:忽略了AVR单片机与1602的速度差别。也就是说这是由于单片机比1602处理指令快引起的。当单片机执行完一个show函数后又立即执行下一个show函数,而此时,1602并没有完全执行完上一个显示,所以会出现你所描述的现象和问题。