诚求各位前辈帮小弟解惑,拜谢了,1602时间显示,C语言编...
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=" 2013-3-20 thr";
uchar code table1[]=" 23:58:40";
sbit lcdrs=P2^2; // 123456789012
sbit lcdrw=P2^3;
sbit lcden=P2^4;
sbit wela=P2^7;
sbit dula=P2^6;
sbit gnd=P3^7;
sbit s1=P3^3;
sbit s2=P3^2;
sbit s3=P3^1;
uchar i,aa,num;
char shi,fen,miao;
void delay(uchar j) //延时函数
{
uchar i;
while(j--)
for(i=0;i<125;i++);
}
void write_com(uchar com) //1602写指令
{
lcdrs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //1602写数据
{
lcdrs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //初始化
{
wela=0;
dula=0;
lcdrw=0;
lcden=0;
gnd=0;
write_com(0x38);
write_com(0x06);
write_com(0x0c);
write_com(0x01);
for(i=0;i<15;i++) //写时间初值
{
write_data(table);
delay(5);
}
write_com(0x80+0x40);
for(i=0;i<12;i++)
{
write_data(table1);
delay(5);
}
TMOD=0x01; //T0定时器设置
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void write_sfm(uchar address,uchar date) //时间变化时写入数据
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+address);
write_data(0x30+shi);
write_data(0x30+ge);
}
void main() //主函数
{
init();
while(1)
{
}
}
void timer0() interrupt 1 //T0中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==18)
{
aa=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi); //调用写入
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}
小弟是新手,用开发板做的实验,写的1602显示时间,用定时器定时,无按钮控制,程序如上,运行结果是:
一上电,显示时间23:58:40, 然后秒数直接就会变成01,然后从01开始,每秒加1,分钟数不变,即23:58:01. 继续等待,当秒数再次加到60时,分钟数由58直接变为00,小时数却没变,依然是23,即23:01:00. 理论上应是时间秒数由40开始加到59,然后变为00:00:00,为什么我的不对,求各位前辈给小弟指点下啊,不胜感激!
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=" 2013-3-20 thr";
uchar code table1[]=" 23:58:40";
sbit lcdrs=P2^2; // 123456789012
sbit lcdrw=P2^3;
sbit lcden=P2^4;
sbit wela=P2^7;
sbit dula=P2^6;
sbit gnd=P3^7;
sbit s1=P3^3;
sbit s2=P3^2;
sbit s3=P3^1;
uchar i,aa,num;
char shi,fen,miao;
void delay(uchar j) //延时函数
{
uchar i;
while(j--)
for(i=0;i<125;i++);
}
void write_com(uchar com) //1602写指令
{
lcdrs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) //1602写数据
{
lcdrs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //初始化
{
wela=0;
dula=0;
lcdrw=0;
lcden=0;
gnd=0;
write_com(0x38);
write_com(0x06);
write_com(0x0c);
write_com(0x01);
for(i=0;i<15;i++) //写时间初值
{
write_data(table);
delay(5);
}
write_com(0x80+0x40);
for(i=0;i<12;i++)
{
write_data(table1);
delay(5);
}
TMOD=0x01; //T0定时器设置
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void write_sfm(uchar address,uchar date) //时间变化时写入数据
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+address);
write_data(0x30+shi);
write_data(0x30+ge);
}
void main() //主函数
{
init();
while(1)
{
}
}
void timer0() interrupt 1 //T0中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==18)
{
aa=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi); //调用写入
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}
小弟是新手,用开发板做的实验,写的1602显示时间,用定时器定时,无按钮控制,程序如上,运行结果是:
一上电,显示时间23:58:40, 然后秒数直接就会变成01,然后从01开始,每秒加1,分钟数不变,即23:58:01. 继续等待,当秒数再次加到60时,分钟数由58直接变为00,小时数却没变,依然是23,即23:01:00. 理论上应是时间秒数由40开始加到59,然后变为00:00:00,为什么我的不对,求各位前辈给小弟指点下啊,不胜感激!
