打印
[疑难问答]

求教1602的问题

[复制链接]
1553|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
:P

使用特权

评论回复
板凳
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 | 只看该作者
回答好认真

使用特权

评论回复
5
wangwo| | 2010-2-23 12:19 | 只看该作者
可考虑看看是不是时序问题

使用特权

评论回复
6
linhai1986| | 2010-2-23 12:21 | 只看该作者
3楼的回答的很快啊,看来是个高手

使用特权

评论回复
7
wangwo| | 2010-2-23 12:25 | 只看该作者
楼主是不是忘加红色了?

使用特权

评论回复
8
wangwo| | 2010-2-23 12:25 | 只看该作者
6# linhai1986
过奖了,还是菜鸟

使用特权

评论回复
9
suoma|  楼主 | 2010-2-23 12:27 | 只看该作者
7# wangwo
是的,谢谢提醒。现在加了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

714

帖子

5

粉丝