[疑难问答] 求教1602的问题

[复制链接]
 楼主| suoma 发表于 2010-2-22 19:15 | 显示全部楼层 |阅读模式
本帖最后由 suoma 于 2010-2-23 12:26 编辑

求教1602的问题这是一个1602两行显示的程序
请注意红色while的死循环语句
当我加上这句时,1602不显示。(为什么?)
当去掉这句时,1602循环显示(正确的):
Temperature:
Speed:

还有就是当我主函数中只执行初始化函数时,1602仍然是第一行全黑第二行全白。难道是我的初始化函数有问题?
请教了


#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^4;
sbit RW=P2^5;
sbit E =P2^6;
uchar code table[]="Temperature:";
uchar code table1[]="Speed:";

void delay(uint t);         //函数声明
void SendCommandByte(uchar);
void SendDataByte(uchar);
void InitLcd();
void DisplayMsg(uchar *p);
//==================================================
void main()
{
uchar num;
delay(1000);
  InitLcd();

SendCommandByte(0x80);
for(num=0;num<12;num++)
{
  SendDataByte(table[num]);
  delay(100);
}
SendCommandByte(0x80+0x40);
for(num=0;num<6;num++)
{
  SendDataByte(table1[num]);
  delay(100);
}
while(1);
}
//-----------------------------------------------------
void delay(uint t)                // 延时函数
{
for(;t!=0;t--) ;
}
//------------------------------------------------------
void SendCommandByte(uchar cmd)     // 向LCD写命令;
{
RS=0;
P0=cmd;        
delay(1000);
E=1;
    delay(1000);  
E=0;
}
//-------------------------------------------------------
void SendDataByte(uchar dat)     // 向LCD写数据
{  
RW=0;
RS=1;
P0=dat;
    delay(1000);
E=1;
    delay(1000);
E=0;
   
}
//-------------------------------------------------
void InitLcd()          // 初始化LCD
{
P0=0xff;
E=0;
SendCommandByte(0x38); //设置工作方式,不检测忙信号
delay(100);
SendCommandByte(0x38);
delay(100);
SendCommandByte(0x38);
delay(100);
SendCommandByte(0x38);
SendCommandByte(0x08); //显示关闭
SendCommandByte(0x01); //清屏
SendCommandByte(0x06); //显示状态设置
SendCommandByte(0x0f); //输入方式设置
}
thf2008 发表于 2010-2-22 19:31 | 显示全部楼层
David_ming 发表于 2010-2-22 19:53 | 显示全部楼层
本帖最后由 David_ming 于 2010-2-22 20:16 编辑

建议楼主把帖子搞整齐一点,大括号括的有规律别人看着心不烦,回答的人就会多,不然人家一看心烦了直接就跳过你的帖子。 就KEIL来说,如果你这样写
void main()
{
    main:
        delay(0x2222);
     loop:
        while(1);
}
KEIL会生成
void main()
{
    main:
        delay(0x2222);
     loop:
        goto loop;
}

如果你main里边没有死循环那么KEIL会生成
void main()
{
    main:
        delay(0x2222);
     loop:
        RET;
}
很明显,执行这个最后的 RET 命令后0x08里边的内容就送到了PC,KEIL在开始进入main之前要先清内存,堆栈里边的数字必然是0,所以上面的函数就相当于
void main()
{
    main:
        delay(0x2222);
     loop:
        goto main;
}
程序会反复执行delay

楼主试试用这个初始化试试,要改下函数名:
    WriteCmd(0x02);
    WriteCmd(0x01);
    WriteCmd(0x3f);
    WriteCmd(0x06);
    WriteCmd(0x0f);
    WriteCmd(0x80);//我就记得这个是写首地址,其他的忘了,刚开始学C的时候写的
lovelyegle 发表于 2010-2-22 20:01 | 显示全部楼层
回答好认真
wangwo 发表于 2010-2-23 12:19 | 显示全部楼层
可考虑看看是不是时序问题
linhai1986 发表于 2010-2-23 12:21 | 显示全部楼层
3楼的回答的很快啊,看来是个高手
wangwo 发表于 2010-2-23 12:25 | 显示全部楼层
楼主是不是忘加红色了?
wangwo 发表于 2010-2-23 12:25 | 显示全部楼层
6# linhai1986
过奖了,还是菜鸟
 楼主| suoma 发表于 2010-2-23 12:27 | 显示全部楼层
7# wangwo
是的,谢谢提醒。现在加了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

714

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部

82

主题

714

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部