微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于51单片机1602的疑问

关于51单片机1602的疑问

时间:10-02 整理:3721RD 点击:
这是一个51单片机1602的时分秒累加时钟,其中我有一个地方不懂,在显示子程序中“ write_data(0x30+shi1);”必须加0x30,写成 write_data(shi1);显示不了,位什么要加0x30;恳请各位大湿,同道,有经验者,为小弟解答
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P1^1;
sbit lcdrs=P1^0;
uchar code table[]={0,1,2,3,4,5,6,7,8,9,10};
uchar shi,fen,miao,num;
void delay(uint xms)
{
        uchar i;
        while(xms--)for(i=50;i>0;i--);
}
void write_com(uchar com)//1602写指令
{
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void write_data(uchar date)//1602写数据
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void lcd_shi(uchar num1,num2,num3)//lcd,显示程序
{
        uchar shi1,shi2,shi3,ge1,ge2,ge3;
        shi1=num1/10;
        ge1=num1%10;
        shi2=num2/10;
        ge2=num2%10;
        shi3=num3/10;
        ge3=num3%10;
        write_com(0x80+0x40+2);
       write_data(0x30+shi1); //时 ,显示的十位
        write_com(0x80+0x40+3);
        write_data(0x30+ge1);  //时,显示的个位
        write_com(0x80+0x40+5);
        write_data(0x30+shi2);        //分,显示的十位
               
        write_com(0x80+0x40+6);          //分,显示的个位
        write_data(0x30+ge2);
        write_com(0x80+0x40+8);          //秒,显示的十位
        write_data(0x30+shi3);
        write_com(0x80+0x40+9);          //秒,显示的个位
        write_data(0x30+ge3);
}
void init()//初始化子程序
{
        shi=0;
        fen=0;
        miao=0;
        TMOD=0x01;
        EA=1;
        ET0=1;
        TH0=19664/256;
        TL0=19664%256;
        TR0=1;
        lcden=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x01);
        write_com(0x06);
        write_com(0x80+0x44);
        write_data(':');
        delay(5);
        write_com(0x80+0x47);
        write_data(':');
        delay(5);
}

void sfm()//时分秒累加子程序
{
        lcd_shi(shi,fen,miao);
        if(miao==60)
        {
                miao=0;
                fen++;
        }
        if(fen==60)
        {
                fen=0;
                shi++;
        }
        if(shi==24)
        {
                shi=0;
        }
}
void T0_time() interrupt 1 ///中断子程序;
{
        TH0=19664/256;
        TL0=19664%256;
        num++;
        if(num==20)
        {
                num=0;
                miao++;
        }
}
void main()
{
        init();
        while(1)
        {
                sfm();
        }
}

0x30对应ascll码的  ‘0’ ,随后从0x31到0x39对应的是 ‘1’到‘9’;

原来如此,找到原因了,是我在转换时弄错了,,谢谢了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top