关于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();
}
}
#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’;
原来如此,找到原因了,是我在转换时弄错了,,谢谢了