lcd1602液晶显示电子时钟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LCD1602液晶显示电子钟
各位大侠,新年好!
小弟学C语言不久,今天编写了一个时钟程序,在调试的时候发现,手动调整完全正常,但在自动走时时,日期和星期与实际不符,请各位大侠帮帮小弟,谢谢,以下为源程序
#include
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0;
sbit RW=P2^1;
sbit lcden=P2^2;
sbit s1=P1^5;
sbit s2=P1^6;
sbit s3=P1^7;
uchar count,s1num;
char miao,shi,fen,w,r,y,a;
uchar code table[]=" 2009-01-29 W4";
uchar code table1[]=" 00:00:00";
void delay(uint z) //延时程序
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //向1602液晶写命令
{
RW=0;
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date) //向1602液晶写数据
{
RW=0;
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //初始化
{
uchar num;
lcden=0;
write_com(0x38); //设置显示模式
write_com(0x0c); //开显示
write_com(0x06); //当写时光标自动加1
write_com(0x01); //清屏显示
write_com(0x80); //数据指针设置
for(num=0;num<15;num++) //设定第一行数字的位置
{
write_date(table[num]); //显示第一行数字
delay(5);
}
write_com(0x80+0x40); //设置下次显示第二行
for(num=0;num<12;num++) //设定第二行数字的位置
{
write_date(table1[num]); //显示第二行数字
delay(5);
}
TMOD=0x01; //设置定时工作方式1
TH0=(65536-50000)/256; //定时器装初置
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开T0定时器中断
TR0=1; //启动定时器
}
void write_sfm(uchar add,uchar date) //时分秒的分离
{
uchar shi,ge; //设定个位,十位变量
shi=date/10; //分出十位
ge=date%10; //分出个位
write_com(0x80+0x40+add); //定位设置
write_date(0x30+shi); //十位数据
write_date(0x30+ge); //个位数据
}
void write_r(uchar add,uchar date)
{
uchar ge; //设定个位
ge=date;
write_com(0x80+add); //定位设置
write_date(0x30+ge); //个位数据
}
void write_ny(uchar add,uchar date) //时分秒的分离
{
uchar shi,ge; //设定个位,十位变量
shi=date/10; //分出十位
ge=date%10; //分出个位
write_com(0x80+add); //定位设置
write_date(0x30+shi); //十位数据
write_date(0x30+ge); //个位数据
}
void keysca
n() //键扫描
{
if(s1==0) //如果S1键按下
{
delay(5); //消抖
if(s1==0) //再一次确认是否真的有键按下,执行内程序
{
s1num++;
while(!s1); //判断S1键是否抬起,如果抬起,则进入设置状态
if(s1num==1) //如果此数为1,则执行内程序
{
TR0=0; //关闭定时器
write_com(0x80+0x40+10); //设置光标在秒位置
write_com(0x0f); //设置光显示并闪烁
}
}
if(s1num==2) //如果此数为2,则执行内程序
{
write_com(0x80+0x40+7); //设置光标在分位置
}
if(s1num==3) //如果此数为3,则执行内程序
{
write_com(0x80+0x40+4); //设置光标在时位置
}
if(s1num==4) //如果此数为4,则执行内程序
{
write_com(0x80+14); //设置光标在周的位置
}
if(s1num==5) //如果此数为5,则执行内程序
{
write_com(0x80+9); //设置光标在日期位置
}
if(s1num==6) //如果此数为6,则执行内程序
{
write_com(0x80+6); //设置光标在月位置
}
if(s1num==7) //如果此数为7,则执行内程序
{
write_com(0x80+3); //设置光标在年位置
}
if(s1num==8) //如果此数为8时,退出设置状态
{
s1num=0; //此数清零
write_com(0x0c); //关闭光标显示
TR0=1; //启动定时器,走时
}
}
if(s1num!=0) //如果此数不为0,则进入调整加、减键
{
if(s2==0) //确认加键是否被按下
{
delay(5); //消抖
if(s2==0) //再一次确认是否真的有键按下
{
while(!s2); //判断S1键是否抬起,如果抬起,则进入加数设置状态
if(s1num==1) //判断设定的位置是否在秒
{
miao++;
if(miao==60) //是否加到60
miao=0; //秒清零
write_sfm(10,miao); //刷新显示
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
if(s1num==4) //判断设定的位置是否在周
{
w++;
if(w==7) //是否加到7
w=0; //周清零
write_r(14,w); //刷新显示
write_com(0x80+14);
}
if(s1num==5) //判断设定的位置是否在天
{
r++;
if(r==32) //是否加到31
r=1; //天清1
write_ny(9,r); //刷新显示
write_com(0x80+9);
}
if(s1num==6) //判断设定的位置是否在月
{
y++;
if(y==13) //是否加到12
y=1; //秒清月
write_ny(6,y); //刷新显示
write_com(0x80+6);
}
if(s1num==7) //判断设定的位置是否在年
{
a++;
if(a==100) //是否加到99
a=0; //年清零
write_ny(3,a); //刷
新显示
write_com(0x80+3);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
if(s1num==4)
{
w--;
if(w==-1)
w=6;
write_r(14,w); //刷新显示
write_com(0x80+14);
}
if(s1num==5) //判断设定的位置是否在天
{
r--;
if(r==0)
r=31;
write_ny(9,r); //刷新显示
write_com(0x80+9);
}
if(s1num==6) //判断设定的位置是否在月
{
y--;
if(y==0)
y=12;
write_ny(6,y); //刷新显示
write_com(0x80+6);
}
if(s1num==7)
{
a--;
if(a==0)
a=99;
write_ny(3,a); //刷新显示
write_com(0x80+3);
}
}
}
}
}
void main() //主程序
{
init();
while(1)
{
keyscan();
}
}
void timer0() interrupt 1 //中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==19)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
w++; //星期加1
r++; //天数加1
if(w==7)
{
w=0;
if(r==32)
{
r=1;
y++; //月份加1
if(y==13)
{
y=1;
a++; //年加1
if(a==100)
{
a=0;
}
write_ny(3,a); //刷新显示
}
write_ny(6,y);
}
write_ny(9,r);
}
write_r(14,w); //刷新显示
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}