打印
[51单片机]

请问这是程序问题还是仿真问题

[复制链接]
1274|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Maker_Chan|  楼主 | 2014-8-22 22:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我打算用89c52做个电子表 ,就显示时间就是。显示屏用的是lcd1602.

程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a}; /*CGROM中0~9中的字符码 和 : */
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
uchar hour2,hour1, min2,min1,sec2, sec1,num,num1,num2,aa;

void delay(uint z)  /*延时 z ms*/
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void lcd_com(uchar com) /*在P1口写命令 ,如: lcd_com(0x38) 【初始化命令】*/
{
    rs=0;
    rw=0;
    P1=com;
    delay(1);
    e=1;
    e=0;
}
void lcd_dat(uchar dat) /*在P1口写数据*/
{
    rs=1;
    rw=0;
    P1=dat;
    delay(1);
    e=1;
    e=0;
}
void init()
{
    lcd_com(0x38);    /*置功能: 8位总线、双行显示、5*7点阵字符*/
    delay(1);
    lcd_com(0x0c);    /*显示开关控制:整体显示开、光标无、光标不闪 */
    delay(1);
   lcd_com(0x01);         /*清显示*/
    delay(1);
    TMOD=0X01;                           /*方式寄存器:
                                                             设置定时器0采用16位定时方式,定时器通过TR0置位启动
                                 设置定时器1采用13位定时方式,定时器通过TR1置位启动*/

        /*设初值为50000,定时50ms*/
        TH0=(65536-50000)/256;  /* 高8位,TH1 = 60 (0011 1100)*/
    TL0=(65536-50000)%256;  /* 低8位,TL1 = 176(0001 0000) */

        EA=1;   /*CPU中断总允许位 , CPU开放所有中断源的中断请求*/
    ET0=1;  /*定时器T0中断允许位,允许定时器T0中断*/
    TR0=1;  /*启动定时器0*/


}
void display(uchar hour2,uchar hour1,uchar min2,uchar min1,uchar sec2,uchar sec1)
{

        lcd_com(0x80);       /*在00H地址处显示数据*/
    lcd_dat(table[hour2]);


        lcd_com(0x81);
    lcd_dat(table[hour1]);

    lcd_com(0x82);
    lcd_dat(table[10]);  /*显示 :*/

    lcd_com(0x83);
    lcd_dat(table[min2]);

    lcd_com(0x84);
    lcd_dat(table[min1]);

    lcd_com(0x85);
    lcd_dat(table[10]);  /*显示 :*/

    lcd_com(0x86);
    lcd_dat(table[sec2]);

    lcd_com(0x87);
    lcd_dat(table[sec1]);


}
void main()
{
    init();
    while(1)
    {

    if(aa==20)
    {
        aa=0;
        num++;    /*秒 + 1*/

        if(num==60)
        {
            num=0;
            num1++;

            if(num1==60)
            {
                num1=0;

                num2++;
                if(num2==24)
                {
                num2=0;
               }

            }


        }
        hour2=num2/10;
        hour1=num2%10;
        min2=num1/10;
        min1=num1%10;
        sec2=num/10;
        sec1=num%10;
         }

    display(hour2,hour1,min2,min1,sec2,sec1);

}


}

/*中断服务程序*/
void timer0() interrupt 1         
{
   TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    aa++;

}



仿真时屏幕只是亮却不显示任何数字。
请问是哪出问题了?
附lcd1602中文资料
LCD1602液晶完整中文资料.pdf (344.19 KB)

lcd1.PNG (21.51 KB )

lcd1.PNG

相关帖子

沙发
NE5532| | 2014-8-22 22:32 | 只看该作者
搞不清楚的,先去玩实物,再来做仿真。楼主不会写程序,请参考本版精华《程序调试黑宝书》

使用特权

评论回复
板凳
ningling_21| | 2014-8-23 09:07 | 只看该作者
没用过仿真,两种问题都有可能...

还是用实物调程序比较靠谱...

使用特权

评论回复
地板
NWPU_CHEN| | 2014-8-23 16:00 | 只看该作者
程序和资料都懒得看,调程序的时候自己多想想,如果你确保你硬件连线没问题,测测你的软件,换7段LED试试。你的液晶初始化有问题,其次是显示部分,我只告诉你这两部分没有一个好的延迟处理即使显示出来都是问题

使用特权

评论回复
5
Maker_Chan|  楼主 | 2014-8-24 00:10 | 只看该作者
NWPU_CHEN 发表于 2014-8-23 16:00
程序和资料都懒得看,调程序的时候自己多想想,如果你确保你硬件连线没问题,测测你的软件,换7段LED试试。 ...

请问初始化和显示哪有问题

使用特权

评论回复
6
Maker_Chan|  楼主 | 2014-8-24 00:13 | 只看该作者
NWPU_CHEN 发表于 2014-8-23 16:00
程序和资料都懒得看,调程序的时候自己多想想,如果你确保你硬件连线没问题,测测你的软件,换7段LED试试。 ...

怎么才算是好的延迟处理呢

使用特权

评论回复
7
创隆电子| | 2014-8-24 21:18 | 只看该作者
我不太相信仿真器,除非特出的程序,最好是打接硬件,下载--实验---下载---直到成功

使用特权

评论回复
8
justsuperone| | 2014-8-25 22:20 | 只看该作者
贴上我写的程序,希望能帮到你 1602显示时间.zip (30.67 KB)

使用特权

评论回复
9
Maker_Chan|  楼主 | 2014-10-7 22:49 | 只看该作者
谢谢

使用特权

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

本版积分规则

16

主题

40

帖子

0

粉丝