#include < reg52.h >
#include < intrins.h >
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
uchar hour=0,min=0,sec=0;
uchar year,year1=20,year2=8,month=7,date=26,week=6,j;
uint count=0,i;
uchar a[ ] = {" - - "};
//0123456789ABCDEF
uchar b[ ] = {"TIME: 00-00-00"};
uchar tab[]={'0','1','2','3','4','5','6','7','8','9'};
/**********************************************************
* 5us 延时子程序
**********************************************************/
void delayNOP()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/**********************************************************
* 延时子程序
**********************************************************/
void delay(uint ms)
{
uchar t;
while(ms--)
{
for(t = 0; t < 120; t++);
}
}
/**********************************************************
* 检查LCD忙状态
* lcd_busy为1时,忙,等待。
* lcd-busy为0时,闲,可写指令与数据
**********************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P2&0x80);
LCD_EN = 0;
return(result);
}
/************************************/
void lcd_writedata( uchar in_data)
{
uchar Hdata,Ldata;
while(lcd_busy());
Hdata=in_data&0xf0; //取高四位
Ldata=(in_data<<4)&0xf7; //取低四位
delayNOP();
P2 = Hdata; //发送高四位
LCD_RS=1; //写入数据
LCD_RW=0;
LCD_EN=0;
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
delay(5);
P2 = Ldata; //发送低四位
LCD_RS=1; //写入数据 ,RS=1,,RW=0时是写入数据
LCD_EN=1;
delay(5);
LCD_EN=0;
delay(5);
}
/*********************************************************
* 写指令或数据
写入命令
*********************************************************/
void lcd_writecom(uchar com)
{
uchar Hdata,Ldata;
while(lcd_busy());
Hdata=com&0xf0; //取高四位
Ldata=(com<<4)&0xf7; //取低四位
delayNOP();
P2 = Hdata; //发送高四位
LCD_RS = 0; //写入命令 ,RS=0,,RW=0时是写入命令
LCD_RW = 0;
LCD_EN = 0;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
delayNOP();
P2 = Ldata; //发送低四位
LCD_RS = 0; //写入命令 ,RS=0,,RW=0时是写入命令
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
delayNOP();
}
/**********************************************************
* 设定显示位置
**********************************************************/
void lcd_pos(uchar pos)
{
lcd_writecom(pos=pos+0x80); //数据指针=80+地址变量
}
/**********************************************************
* 定义display1函数
**********************************************************/
void display1()
{
unsigned char i;
while(lcd_busy());
delayNOP();
lcd_writecom(0x80);
delayNOP();
while(lcd_busy());
delayNOP();
for(i=0;i<16;i++)
{lcd_writedata(a[i]);
delayNOP();
while(lcd_busy());}
}
/**********************************************************
* 定义display2函数
**********************************************************/
void display2()
{
unsigned char i;
while(lcd_busy());
delayNOP();
lcd_writecom(0xc0);
delayNOP();
while(lcd_busy());
delayNOP();
for(i=0;i<16;i++)
{lcd_writedata(b[i]); //display
delayNOP();
while(lcd_busy());}
}
/*************************************************************
* LCD初始化设定
*************************************************************/
void lcd_init()
{
uchar m;
delay(15);
lcd_writecom(0x28); //16*2显示,5*7点阵,4位数据,
delay(5);
lcd_writecom(0x28);
delay(5);
lcd_writecom(0x28);
delay(5);
lcd_writecom(0x0c); //显示开,关光标
delay(5);
lcd_writecom(0x06); //移动光标
delay(5);
lcd_writecom(0x01); //清除LCD的显示内容
delay(25);
lcd_pos(0x00); //设置显示位置为第一行
for(m=0;m<16;m++)
{ lcd_writedata(a[m]); //显示是通过写来实现的
delay(150);}
lcd_pos(0x40); //设置显示位置为第二行
for(m=0;m<16;m++)
{lcd_writedata(b[m]);
delay(50);}
//延时
}
/**********************************************************
* 主函数
**********************************************************/
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-49950)/256;
TL0=(65536-49950)%256;
lcd_init(); //LCD1602初始化
while(1)
{
a[0]=tab[year1/10];
a[1]=tab[year1%10];
a[2]=tab[year2/10];
a[3]=tab[year2%10];
a[5]=tab[month/10];
a[6]=tab[month%10];
a[8]=tab[date/10];
a[9]=tab[date%10];
a[13]=tab[week%10];
display1();
b[15]=tab[sec%10];
b[14]=tab[sec/10];
b[12]=tab[min%10];
b[11]=tab[min/10];
b[9]=tab[hour%10];
b[8]=tab[hour/10];
if(key1==0)
{delay(5);if(key1==0){min=min+10;if(min>=60){min=0;}}}
if(key2==0)
{delay(5);if(key2==0){min++;if(min==60){min=0;};}}
if(key3==0)
{if(key3==0){delay(5);hour++;}}
if(key4==0)
{if(key4==0){delay(5);hour--;}if(hour<=0)hour=24;}
display2();
}
}
void time0()interrupt 1
{
TH0=(65536-49950)/256;
TL0=(65536-49950)%256;
count++;
if(year1>99)
{year1=0;year2++;}
if(year2>99)
year2=0;
if(count==20)
{count=0;sec++;}
if(sec==60)
{sec=0;min++;}
if(min==60)
{min=0;hour++;}
if(hour==24)
{ hour=0;date++;week++; }
if(week>7)
{week=1;}
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: if(date>31)
{date=1;month++;}
if(month>12)
{ month=1;year2++;}
if(year2>99)
{year2=0;year1++;}
break;
case 2: year=year1*100+year2;
if(year%4==0)
{if(year%100==0)
{if(year%400==0)
j=13;
else
j=14;}
else
j=13;}
else
j=14;
switch(j)
{case 13:if(date>29)
{date=1; month++;}
break;
case 14:if(date>28)
{date=1;month++;}
break;}
break;
case 4:
case 6:
case 9:
case 11:if(date>30)
{date=1;month++;}
break;
}
}
评论0