#include
#include
#define uchar unsigned char
#define uint unsigned int
//********端口以及变量定义***********//
sbit rs = P2^0; //lcd数据命令选择位
sbit rw = P2^1; //lcd写入读出选择位
sbit ep = P2^2; //lcd使能位
sbit p15=P1^5; //调时模式选择位
sbit p16=P1^6; //+1位
sbit p17=P1^7; //-1位
uint year=2000,month=1,day=1,hour=0,minute=0,second=0; //设置初始显示的时间日期
uchar sec100=0; //1秒的计数变量,加满100为1秒
uchar mod=0; //调时标志位
//延时子程序----------------------------------------------------
delay(uchar ms)
{
uchar i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
//测试LCD忙碌状态----------------------------------------
bit lcd_bz()
{
bit result;
rs = 0;
rw = 1;
ep = 1;
result = (bit)(P0 & 0x80); //读出lcd忙碌标志位
ep = 0;
return result; //函数返回值,返回1表示lcd忙碌,返回0表示lcd空闲
}
//写入指令数据到LCD-----------------------------------------
lcd_wcmd(uchar cmd)
{
while(lcd_bz()); //等待lcd到空闲
rs = 0;
rw = 0;
ep = 0;
P0 = cmd; //将指令写入lcd
ep = 1;
ep = 0;
}
//设定显示位置子程序-----------------------------------------
lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80); //将显示地址写入lcd
}
//写一个字符数据到LCD----------------------------------------
lcd_wdat(uchar dat)
{
while(lcd_bz()); //等待lcd到空闲
rs = 1;
rw = 0;
ep = 0;
P0 = dat; //将数据写入lcd
ep = 1;
ep = 0;
}
//写数据串到LCD----------------------------------------------
//写n位数据到指定posi的位置------------------------------------
lcd_datas(uchar posi,int dat,char n) //在posi的位置显示名字为dat的n位数据
{
uchar i,j,data1;
int s;
lcd_pos(posi);
for(i=1;i<=n;i++) //从第一位开始显示,到第n位显示完毕
{
s=1;
for(j=1;j<=n-i;j++)
s=s*10;
data1=dat/s;
lcd_wdat(data1+'0');
dat=dat%s;
}
}
//LCD初始化--------------------------------------------------
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //
lcd_wcmd(0x0c); //
lcd_wcmd(0x06); //
lcd_wcmd(0x01); //清除LCD的显示内容
}
//显示一屏时间------------------------------------------------
display_lcd()
{
lcd_wcmd(0x01); //清除LCD?
delay(1);
lcd_datas(3,year,4); //显示第一行数据
lcd_wdat('/');
lcd_datas(8,month,2);
lcd_wdat('/');
lcd_datas(11,day,2);
lcd_datas(67,hour,2); //显示第二行数据
lcd_wdat(':');
lcd_datas(70,minute,2);
lcd_wdat(':');
lcd_datas(73,second,2);
}
//显示空字符----------------------------------------------------
no_display(uint pos,char n) //pos:显示的地址。n:要显示的位数
{
lcd_pos(pos);
while(n--)
{
lcd_wdat(' ');
}
}
//年加1子程序---------------------------------------------
void inc_year()
{
year++;
if(year==9999)
year=0000;
lcd_datas(3,year,4);
}
//月加1子程序---------------------------------------------------
void inc_month()
{
month++;
if(month>12)
{
month=01;
inc_year();
}
lcd_datas(8,month,2);
}
//天加1子程序-------------------------------------------
void inc_day()
{
day++;
if(month==4||month==6||month==9||month==11)
{
if(day>30)
day=01;
inc_month();
}
else if(month==2)
{
if((year%400==0)||(year%4==0)&&(year%100!=0))
{
if(day>29)
day=1;
inc_month();
}
else if(day>28)
{day=1;
inc_month();}
}
else
{
if(day>31)
day=01;
inc_month();
}
lcd_datas(11,day,2);
}
//小时加1程序------------------------------------------------------
void inc_hour()
{
hour++;
if(hour > 23)
{
hour = 0;
inc_day();
}
lcd_datas(67,hour,2);
}
//分加1程序-----------------------------------------------
void inc_min()
{
minute++;
if(minute > 59)
{
minute = 0;
inc_hour();
}
lcd_datas(70,minute,2);
}
//秒加1程序-------------------------------------------
void inc_sec()
{
second++;
if(second > 59)
{
second = 0;
inc_min();
}
lcd_datas(73,second,2);
}
//调时闪动程序---------------------------------------------------
flash()
{
switch(mod)
{
case 1: no_display(3,4); break;
case 2: no_display(8,2); break;
case 3: no_display(11,2); break;
case 4: no_display(67,2); break;
case 5: no_display(70,2); break;
}
}
//中断处理程序---------------------------------------------------------------
void timer0() interrupt 1 using 0
{
TH0=0xd8;
TL0=0xf0;
sec100++;
if(sec100 == 50 && mod != 0)
flash();
if(sec100 == 100)
{
sec100 = 0;
inc_sec();
display_lcd();
}
}
//闰年调整--------------------------------------------------------------
void incday()
{
day++;
if(month==4||month==6||month==9||month==11)
{
if(day>30)
day=01;
}
else if(month==2)
{
if((year%400==0)||(year%4==0)&&(year%100!=0))
{
if(day>29)
day=1;
}
else if(day>28)
day=1;
}
else
{
if(day>31)
day=01;
}
}
//时间调整程序----------------------------------------------
bit inc_time()
{
bit t;
t=0;
if(p16==0)
{
delay(10);
if(p16==0)
{
while(p16==0);
t=1;
}
}
return t;
}
bit dec_time()
{
bit m;
m=0;
if(p17==0)
{
delay(10);
if(p17==0)
{
while(p17==0);
m=1;
}
}
return m;
}
//************************************************************//
//*****************主程序*************************************//
//************************************************************//
main()
{
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
lcd_init();
delay(10);
display_lcd();
ET0=1;
TR0=1;
EA=1;
while(1)
{
if(p15==0)
{
delay(10);
if(p15==0)
{
while(p15==0);
mod++;
if(mod>5)
mod=0;
}
}
//--------------------------
if(mod==1)
{
if(inc_time()==1)
{
year++;
if (year==9999)
year=0;
lcd_datas(3,year,4);
}
if(dec_time())
{
year--;
lcd_datas(3,year,4);
}
}
//----------------------------------
else if(mod==2)
{
if(inc_time()==1)
{
month++;
if(month>12)
month=1;
lcd_datas(8,month,2);
}
if(dec_time())
{
month--;
if(month==0)
month=12;
lcd_datas(8,month,2);
}
}
//----------------------------------
else if(mod==3)
{
if(inc_time()==1)
{
incday();
lcd_datas(11,day,2);
}
//------------------------------------------
if(dec_time())
{
day--;
if(month==4||month==6||month==9||month==11)
{
if(day==0)
day=30;
}
else if(month==2)
{
if((year%400==0)||(year%4==0)&&(year%100!=0))
{
if(day==0)
day=29;
}
else if(day==0)
day=28;
}
else
{
if(day==0)
day=31;
}
lcd_datas(11,day,2);
}
}
//------------------------------------------
else if(mod==4)
{
if(inc_time()==1)
{
hour++;
if(hour==24)
hour=0;
lcd_datas(67,hour,2);
}
if(dec_time())
{
hour--;
if(hour==0xffff)
hour=23;
lcd_datas(67,hour,2);
}
}
else if(mod==5)
{
if(inc_time()==1)
{
minute++;
if(minute==60)
minute=0;
lcd_datas(70,minute,2);
}
if(dec_time())
{
minute--;
if(minute>60)
minute=59;
lcd_datas(70,minute,2);
}
}
}
}
阅读(1075) | 评论(0) | 转发(0) |