注册 登录
编程论坛 单片机编程

求助51单片机LCD1602数字显示的问题

ID不见了 发布于 2016-06-28 19:01, 8862 次点击
程序代码:

#include<stc15.h>
#include<intrins.h>
#include<gpio.h>
#define uchar unsigned char
#define uint  unsigned int
#include<lcd1602.h>

//uint m,f,s;     //秒、分、时
uint m1,m2;     //秒的个位、十位
uint f1,f2;     
uint s1,s2;
uint aa;
uchar dis1[]={0x30,0x30,0x3a,0x30,0x30,0x3a,0x30,0x30};
uint i;

void Delay1ms()        //@11.0592MHz
{
    unsigned char i, j;

    _nop_();
    _nop_();
    _nop_();
    i = 11;
    j = 190;
    do
    {
        while (--j);
    } while (--i);
}

void Delayxms(uint x)
{
    uint i;
    for(i=0;i<x;i++)
    {
        Delay1ms();
    }
}

 void init()
{
    TMOD=0x01;                //计数器T0计数
    TH0=(65536-50000)/256;    //设置T0  50ms定时的初始值
    TL0=(65536-50000)%256;
    EA=1;                    //开放CPU中断
    ET0=1;                    //允许外部中断
    TR0=1;                    //定时器开始计时
    aa=0;
    m1=0;
}

void timer0() interrupt 1
{
    TH0=(65536-50000)/256; //每50MS产生一次中断,给寄存器装初值并累加aa
    TL0=(65536-50000)%256;
    aa++;
}

void time_add()
{
    /*m1=0,m2=0,f1=0,f2=0,s1=0,s2=0;
    lcd_data(0x30+0x30+0x3a+0x30+0x30+0x3a+0x30+0x30);*/
    if(aa==20)
    {
        aa=0;
        m1++;
        if(m1>9)
        {
            m1=0;
            m2++;
            if(m2>5)
            {
                m2=0;
                f1++;
                if(f1>9)
                {
                    f1=0;
                    f2++;
                    if(f2>5)
                    {
                        f2=0;
                        s1++;
                        if(s1>9)
                        {
                            s1=0;
                            s2++;
                            if(s2>5)
                            {
                                m1=0;
                                m2=0;
                                f1=0;
                                f2=0;
                                s1=0;
                                s2=0;
                            }
                        }
                    }
                }
            }
        }
    }
}

void main()
{
    gpio();
    lcd_init();      //初始化
    Delayxms(20);
    m1=0,m2=0,f1=0,f2=0,s1=0,s2=0;
    init();      //定时器
    while(1)
    {
        time_add();
        dis1[7]=m1+'0';
        dis1[6]=m2+'0';
        dis1[4]=f1+'0';
        dis1[3]=f2+'0';
        dis1[1]=s1+'0';
        dis1[0]=s2+'0';
        i=0;
        while(i<8)
        {
            lcd_start(4+i);
            lcd_data(dis1[i]);
            i++;
        }
    }
}

请问红色部分的代码是怎么回事?是加上'0'就能将数字转换成ASCII码了吗?
9 回复
#2
ID不见了2016-06-28 19:02
dis1[7]=m1+'0';
dis1[6]=m2+'0';
dis1[4]=f1+'0';
dis1[3]=f2+'0';
dis1[1]=s1+'0';
dis1[0]=s2+'0';


这里
#3
hu9jj2016-06-29 07:30
“0”的ASII码是32,“1”是33,余类推。加上32的基数之后,就可以显示出m1、m2、f1、f2、s1、s2等变量的数值(仅限于0-9,大于9则不能正确显示)。
#4
ID不见了2016-06-29 09:59
回复 3楼 hu9jj
那如果我想其他的字符也能正常显示,我应该怎么做啊?
#5
wmf20142016-06-29 20:47
“0”的ASII码是十进制数48(30H),32是空格的asc码
查了下LCD1602资料,该模块自带字符集,只需向对应寄存器写字符asc码即可,要显示其他的也很简单,如下:即显示“AB:CD:EF”了。
dis1[7]='F';
dis1[6]='E';
dis1[4]='D';
dis1[3]='C';
dis1[1]='B';
dis1[0]='A';

[此贴子已经被作者于2016-6-29 20:50编辑过]

#6
hu9jj2016-06-29 20:54
以下是引用ID不见了在2016-6-29 09:59:11的发言:

那如果我想其他的字符也能正常显示,我应该怎么做啊?

在C下面可以直接将显示的字符发送给LCD显示屏,编译后会自动转换为ASCII码。也可以直接将字符的ASCII码发送给显示屏,只是要从对照表中查出代码。
#7
hu9jj2016-06-29 21:01
这是1602LCD的资料,里面有其自带的字符集:
只有本站会员才能查看附件,请 登录

#8
东方灵将22016-07-20 14:32
'0' 是取ascill, dis1[7]=m1+'0';实际就是取m1数值的ascill,m1为偏移量
#9
hu9jj2016-07-21 07:28
5楼说的极是,‘0’的ASCII码是48,是我记错了,在此表示歉意!
#10
q9137942862017-04-27 08:09
1602的字符显示都是assic查表,理解下,没啥好说的
1