|
年月日可调时钟星期可调
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]=" 2012-02-00 [U]";
uchar code table1[]=" 00:00:00";
sbit rs=P2^5;//设置rs端
sbit en=P2^7;//设置en
sbit d1=P2^6;//设置
sbit s1=P3^2;
sbit s2=P3^3;
sbit s3=P3^4;
uchar num;
uchar count,num,s1num,zhou=7,w;
char shi,fen,miao,nian,yue,ri;
void delay(uchar z)//1ms延时程序
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//1602写入命令子程序
{
rs=0;//rs为低电平
en=0;//en为低
P0=com;//写入命令
delay(2);//延时
en=1;//en高脉冲读入命令
delay(1);
en=0;
}
void write_date(uchar date)//1602写入数据子程序
{
rs=1;//rs为高电平写入疏浚
en=0;//en为低电平
P0=date;//读入数据
delay(2);//延时
en=1;//en高脉冲读入数据
delay(2);
en=0;
}
void init()//初始化子程序
{
en=0;
d1=0;//d1为低时钟向1602写入数据
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(2);//延时
}
write_com(0x80+0x40);//调整光标位置指向下一行
for(num=0;num<12;num++)//判断是否显示完
{
write_date(table1[num]);//写入要显示数据
delay(2);//延时
}
TMOD=0x01;//定时器中断0方式1
TH0=(65536-46000)/256;//付初值
TL0=(65536-46000)%256;
EA=1;//开总中断
ET0=1;//开t0中断
TR0=1;//启动t0
}
void write_sfm(uchar add,uchar date)//写入时、分、秒子函数
{
uchar shi,ge;//将date拆分成两个数
shi=date/10;//date十位数
ge=date%10;//date的个位数
write_com(0x80+0x40+add);//写入date的地址
write_date(0x30+shi);//写入date十位数
write_date(0x30+ge);//写入date个位数
}
void write_zhou(uchar n)
{
write_com(0x80+13);//写入date的地址
write_date(0x30+n);//写入date十位数
}
void write_nyr(uchar ad,uchar da)
{
uchar sh,g;//将date拆分成两个数
sh=da/10;//date十位数
g=da%10;//date的个位数
write_com(0x80+ad);//写入date的地址
write_date(0x30+sh);//写入date十位数
write_date(0x30+g);//写入date个位数
}
void keyscan()//按键扫描子程序
{
if(s1==0)//判断s1是否按下
{
delay(5);//延时消抖
if(s1==0)//s1确实按下
{
s1num++;//s1按下次数加1
while(!s1);//松手检测
if(s1num==1)//s1按下1次,进入秒调模式
{
TR0=0;//关t0时钟停跑
write_com(0x80+0x40+11);//光标指在秒
write_com(0x0f);//光标闪烁
}
if(s1num==2)//s1按下2次,进入分调模式
{
write_com(0x80+0x40+8);//光标指在分
}
if(s1num==3)//s1按下3次,进入时调模式
{
write_com(0x80+0x40+5);//光标指在时
}
if(s1num==4)//s1按下1次,进入秒调模式
{
write_com(0x80+9);//光标指在秒
}
if(s1num==5)//s1按下2次,进入分调模式
{
write_com(0x80+6);//光标指在分
}
if(s1num==6)//s1按下3次,进入时调模式
{
write_com(0x80+3);//光标指在时
}
if(s1num==7)//s1按下3次,进入时调模式
{
write_com(0x80+13);//光标指在时
}
if(s1num==8)//s1按下4次,时钟恢复
{
TR0=1;//开t0
s1num=0;//s1按下次数清零
write_com(0x80+0x40+11);//光标复位
write_com(0x0c);//光标不闪烁
}
}
}
if(s1num!=0)//s1被按下
{
if(s2==0)//s2是否按下?
{
delay(5);
if(s2==0)//s2按下进入加调模式
{
while(!s2);//松手检测
if(s1num==1)//s1被按下1次,调秒。
{
miao++;
if(miao==60)//秒是否溢出
{
miao=0;//清零
fen++;//同时分加1
if(fen==60)//分溢出?
{
fen=0;//清零
shi++;//时加1
if(shi==24)//时溢出
{
shi=0;//清零
}
write_sfm(4,shi);//写入时位数
write_com(0x80+0x40+4);//光标指在时
}
write_sfm(7,fen);//写入分位数
write_com(0x80+0x40+7);//光标指在分
}
write_sfm(10,miao);//写入秒位数
write_com(0x80+0x40+10);//光标指在秒
}
if(s1num==2)//进入分调模式
{
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
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)//s1被按下1次,调秒。
{
ri++;
if(ri==31)//秒是否溢出
{
ri=1;//清零
yue++;//同时分加1
if(yue==13)//分溢出?
{
yue=1;//清零
nian++;//时加1
if(nian==10)//时溢出
{
nian=0;//清零
}
write_nyr(3,nian);//写入时位数
write_com(0x80+3);//光标指在时
}
write_nyr(6,yue);//写入分位数
write_com(0x80+6);//光标指在分
}
write_nyr(9,ri);//写入秒位数
write_com(0x80+9);//光标指在秒
}
if(s1num==5)//进入分调模式
{
yue++;
if(yue==13)
{
yue=1;
nian++;
if(nian==10)
{
nian=0;
}
write_nyr(3,nian);
write_com(0x80+3);
}
write_nyr(6,yue);
write_com(0x80+6);
}
if(s1num==6)//进入时调模式
{
nian++;
if(nian==10)
{
nian=0;
}
write_nyr(3,nian);
write_com(0x80+3);
}
if(s1num==7)//进入时调模式
{
w++;
if(w==8)
{
w=1;
}
write_zhou(w);
write_com(0x80+13);
}
}
}
if(s3==0)//s3按下?
{
delay(5);
if(s3==0)//s3按下进入减调模式
{
while(!s3);//松手检测
if(s1num==1)//秒调
{
miao--;
if(miao==-1)
{
miao=59;
fen--;
if(fen==-1)
{
fen=59;
shi--;
if(shi==-1)
{
shi=23;
}
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)//分调
{
fen--;
if(fen==-1)
{
fen=59;
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
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)//秒调
{
ri--;
if(ri==0)
{
ri=30;
yue--;
if(yue==0)
{
yue=12;
nian--;
if(nian==-1)
{
nian=9;
}
write_nyr(3,nian);
write_com(0x80+3);
}
write_nyr(6,yue);
write_com(0x80+6);
}
write_nyr(9,ri);
write_com(0x80+9);
}
if(s1num==5)//分调
{
yue--;
if(yue==0)
{
yue=12;
nian--;
if(nian==-1)
nian=9;
write_nyr(3,nian);
write_com(0x80+3);
}
write_nyr(6,yue);
write_com(0x80+6);
}
if(s1num==6)//时调
{
nian--;
if(nian==-1)
nian=9;
write_nyr(3,nian);
write_com(0x80+3);
}
if(s1num==7)//时调
{
w--;
if(w==0)
w=7;
write_zhou(w);
write_com(0x80+13);
}
}
}
}
}
void main()
{
init();//初始化程序
while(1)
{
keyscan();
}
}
void time0() interrupt 1//定时器t0中断程序
{
TH0=(65536-46000)/256;
TL0=(65536-46000)%256;
count++;
if(count==20)//是否到1s
{
count=0;//清时间标志位
miao++;//秒数加1
if(miao==60)//秒是否溢出
{
miao=0;//清零
fen++;//分数加1
if(fen==60)//分溢出?
{
fen=0;//分数清零
shi++;//小时数加1
if(shi==24)//小时数溢出
{
zhou++;
w=zhou%7;
if(w==0)
{
write_zhou(7);
}
else
{
write_zhou(w);
}
shi=0;//小时数清零
ri++;
if(ri==30)
{
ri=0;
yue++;
if(yue==13)
{
yue=1;
nian++;
if(nian==10)
{
nian=0;
}
write_nyr(3,nian);
}
write_nyr(6,yue);
}
write_nyr(9,ri);
}
write_sfm(4,shi);//秒位写入新数据
}
write_sfm(7,fen);//分位写入新数据
}
write_sfm(10,miao);//时位写入新数据
}
} |
|