当前位置:文档之家› 89C52电子万年历12864带字库

89C52电子万年历12864带字库

#include
#include
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/*TS12864A-3 端口定义*/
#define LCD_data P0 //数据口
sbit LCD_RS = P2^4; //寄存器选择输入
sbit LCD_RW = P2^5; //液晶读/写控制
sbit LCD_EN = P2^6; //液晶使能控制
sbit LCD_PSB = P2^0; //串/并方式控制
sbit s1=P3^4;
sbit s2=P3^3;
sbit s3=P3^2;
uchar num=0,i,h=23,m=59,s=54,hl,hr,ml,mr,sl,sr,s1num,n=1;
uint run,year=2011,month=2,day=28,y1,y2,y3,y4,mol,mor,dl,dr;
uchar code tab0[]={" 星期 "};
uchar code tab1[]={"年 月 日"};
uchar code tab2[]={"时 分 秒"};
uchar code tab3[]={" "};
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void change()
{
hl=h/10;
hr=h%10;
ml=m/10;
mr=m%10;
sl=s/10;
sr=s%10;
y1=year/1000;
y2=year/100%10;
y3=year/10%10;
y4=year%10;
mol=month/10;
mor=month%10;
dl=day/10;
dr=day%10;
}
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void delay0(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void wr_com(uchar com)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = com;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/*

*/
/*******************************************************************/
void wr_date(uchar date)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0=date;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void display()
{
change();
wr_com(0x90);
wr_date(y1+48);
delay(10);
wr_date(y2+48);
delay(10);
wr_date(y3+48);
delay(10);
wr_date(y4+48);
delay(10);
wr_com(0x93);
wr_date(mol+48);
delay(10);
wr_date(mor+48);
delay(10);
wr_com(0x95);
wr_date(dl+48);
delay(10);
wr_date(dr+48);
delay(10);
wr_com(0x89);
wr_date(hl+48);
delay(10);
wr_date(hr+48);
delay(10);
wr_com(0x8b);
wr_date(ml+48);
delay(10);
wr_date(mr+48);
delay(10);
wr_com(0x8d);
wr_date(sl+48);
delay(10);
wr_date(sr+48);
delay(10);
wr_com(0x85);
wr_date(0xc8);
delay(10);
wr_date(0xfd);
delay(10);
}

void fistdispay()
{
wr_com(0x80);
for(i=0;i<16;i++)
{
wr_date(tab0[i]);
delay(10);
}
wr_com(0x92);
for(i=0;i<10;i++)
{
wr_date(tab1[i]);
delay(10);
}
wr_com(0x8a);
for(i=0;i<10;i++)
{
wr_date(tab2[i]);
delay(10);
}
wr_com(0x98);
for(i=0;i<14;i++)
{
wr_date(tab3[i]);
delay(10);
}
}
void calendar_change()
{
if((year%400==0)||(year%100!=0&&year%4==0)) run=1;
else run=0;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(day==32)
{
day=1;
month++;
}
}
if(month==4||month==6||month==9||month==11)
{
if(day==31)
{
day=1;
month++;
}
}
if(month==2)
{
if(run==1)
{
if(day==30)
{
day=1;
month++;
}
}
else
if(day==29)
{
day=1;
month++;
}
}
if(month==13)
{
month=1;
year++;
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num==20)
{
num=0;
s++;
if(s>=60) //对于刚开始设定的数值进行处理,如s=78,m=90,h=25;
{
s=0;
m++;
if(m>=60)
{
m=0;
h++;
if(h>=24)
{
h=0;
day++;
}
}
}
}
}
void keyscan()
{
if(s1==0)

{
delay(5);
if(s1==0)
{ while(!s1);
s1num++;
if(s1num==1)
{ while (n)
{
TR0=0;
wr_com(0x0d);
wr_com(0x8d);
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
sr++;
if(sr==10)
{
sr=0;
sl++;
}
if(sl==6)
{
sl=0;
}
s++;
if(s==60)
{
sr=0;
sl=0;
s=0;
}
wr_com(0x8d);
wr_date(sl+48);
delay(10);
wr_date(sr+48);
delay(10);
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
sr--;
if(sr==-1)
{
sr=9;
sl--;
}
if(sl==-1)
{
sl=5;
}
s--;
if(s==-01)
{
sr=9;
sl=5;
s=59;
}
wr_com(0x8d);
wr_date(sl+4

8);
delay(10);
wr_date(sr+48);
delay(10);
}
}

if(s1==0)
{
delay(10);
if(s1==0)
{
while(!s1);
{
s1num++;
n--;
}
}
}
}
}
if(s1num==2)
{
n=1;
while (n)
{
wr_com(0x8b);
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
mr++;
if(mr==10)
{
mr=0;
ml++;
}
if(ml==6)
{
ml=0;
}
m++;
if(m==60)
{
mr=0;
ml=0;
m=0;
}
wr_com(0x8b);
wr_date(ml+48);
delay(10);
wr_date(mr+48);
delay(10);
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
mr--;
if(mr==-1)
{
mr=9;
ml--;
}
if(ml==-1)
{
ml=5;
}
m--;
if(m==-1)
{
mr=9;
ml=5;
m=59;
}

wr_com(0x8b);
wr_date(ml+48);
delay(10);
wr_date(mr+48);
delay(10);
}
}


if(s1==0)
{
delay(10);
if(s1==0)
{
while(!s1);
{
s1num++;
n--;
}
}
}
}
}
if(s1num==3)
{
n=1;
while (n)
{
wr_com(0x89);
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
hr++;
if(hr==10)
{
hr=0;
hl++;
}
h++;
if(h==24)
{
hr=0;
hl=0;
h=0;
}
if(h==24)
{
hr=0;
hl=0;
s=0;
}
wr_com(0x89);
wr_date(hl+48);
delay(10);
wr_date(hr+48);
delay(10);
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
hr--;
if(hr==-1)
{
hr=9;
hl--;
}
h--;
if(h==-01)
{
hr=3;
hl=2;
h=23;
}

wr_com(0x89);
wr_date(hl+48);
delay(10);
wr_date(hr+48);
delay(10);
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
hr--;
if(hr==0)
{
hr=9;
hl--;
}
h--;
if(h==00)
{
hr=3;
hl=2;
h=23;
}

wr_com(0x89);
wr_date(hl+48);
delay(10);
wr_date(hr+48);
delay(10);
}
}

if(s1==0)
{
delay(10);
if(s1==0)
{
while(!s1);
{
s1num++;
n--;
}
}
}
}
}
if(s1num==4)
{
n=1;
while (n)
{
wr_com(0x95);
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
dr++;
if(month==4||month==6||month==9||m

onth==11)
{
if(dr==10)
{
dr=0;
dl++;
}
day++;
if(day==31)
{
dr=1;
dl=3;
day=1;
}
}
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(dr==10)
{
dr=0;
dl++;
}
day++;
if(day==32)
{
dr=1;
dl=0;
day=1;
}
}
if(month==2)
{
if(dr==10)
{
dr=0;
dl++;
}
day++;
if(run==1)
{
if(day==30)
{
dr=1;
dl=0;
day=1;
}
}
else
if(day==29)
{
dr=1;
dl=0;
day=1;
}
}

wr_com(0x95);
wr_date(dl+48);
delay(10);
wr_date(dr+48);
delay(10);
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
dr--;
if(month==4||month==6||month==9||month==11)
{
if(dr==-1)
{
dr=9;
dl--;
}
day--;
if(day==0)
{
dr=0;
dl=3;
day=30;
}
}
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(dr==-1)
{
dr=9;
dl--;
}
day--;
if(day==0)
{
dr=1;
dl=3;
day=31;
}
}
if(month==2)
{
if(dr==-1)
{
dr=9;
dl--;
}
day--;
if(run==1)
{
if(day==0)
{
dr=9;
dl=2;
day=29;
}
}
else
if(day==0)
{
dr=8;
dl=2;
day=28;
}
}
wr_com(0x95);
wr_date(dl+48);
delay(10);
wr_date(dr+48);
delay(10);
}
}


if(s1==0)
{
delay(10);
if(s1==0)
{
while(!s1);
{
s1num++;
n--;
}
}
}
}
}
if(s1num==5)
{
n=1;
while (n)
{
wr_com(0x93);
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
mor++;
if(mor==10)
{
mor=0;
mol++;
}
month++;
if(month==13)
{
mor=1;
mol=0;
month=1;
}
wr_com(0x93);
wr_date(mol+48);
delay(10);
wr_date(mor+48);
delay(10);
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
mor--;
if(mor==-1)
{
mor=9;
mol--;
}
month--;
if(month==0)
{
mor=2;
mol=1;
month=12;
}

wr_com(0x93);
wr_date(mol+48);
delay(10);
wr_date(mor+48);
delay(10)

;
}
}


if(s1==0)
{
delay(10);
if(s1==0)
{
while(!s1);
{
s1num++;
n--;
}
}
}
}
}
if(s1num==6)
{
n=1;
while (n)
{
wr_com(0x91);
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
y4++;
if(y4==10)
{
y4=0;
y3++;
}
if(y3==10)
{
y3=0;
y2++;
}
if(y2==10)
{
y2=0;
y1++;
}
if(y1==10)
{
y1=0;
}
year++;
}
wr_com(0x90);
wr_date(y1+48);
delay(10);
wr_date(y2+48);
delay(10);
wr_date(y3+48);
delay(10);
wr_date(y4+48);
delay(10);
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
y4--;
if(y4==-1)
{
y4=9;
y3--;
}
if(y3==-1)
{
y3=9;
y2--;
}
if(y2==-1)
{
y2=9;
y1--;
}
if(y1==-1)
{
y1=0;
}
year++;
}
wr_com(0x90);
wr_date(y1+48);
delay(10);
wr_date(y2+48);
delay(10);
wr_date(y3+48);
delay(10);
wr_date(y4+48);
delay(10);
}
if(s1==0)
{
delay(10);
if(s1==0)
{
while(!s1);
{
s1num++;
n--;
}
}
}
}
}
if(s1num==7)
{
s1num=0;
wr_com(0x0c);
TR0=1;
n=1;
}
}
}
}

void lcd_init()
{
LCD_PSB = 1; //并口方式

wr_com(0x34); //扩充指令操作
delay(5);
wr_com(0x30); //基本指令操作
delay(5);
wr_com(0x0C); //显示开,关光标
delay(5);
wr_com(0x01); //清除LCD的显示内容
delay(5);
}
void main()
{
init();
lcd_init();
fistdispay();
while(1)
{
keyscan();
display();
calendar_change();
}
}


相关主题
文本预览
相关文档 最新文档