- #include<reg52.h>
- #include<absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define DATA_ADDR XBYTE[0xF000] //数据口地址
- #define COM_ADDR XBYTE[0xF100] //命令口地址
- uchar xdata *C_ADDR,*D_ADDR;//指向命令口和数据口的地址指针
- uchar count=0;
- uchar second=0,fen=58,hour=23,mounth=2,day=25;
- uint year=2017;
- uchar k2;
- uchar zifuma[10]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19};
- uchar data COM; //存放命令的变量
- uchar data DAT1; //存放第一参数的变量
- uchar data DAT2; //存放第二参数的变量
- void clear(void);
- void LCD_DISP(uchar y,uchar x,uchar zifu);
- void LCD_InIt();
- void DELAY();
- void WRITE_COM_DATA0();
- void WRITE_COM_DATA1();
- void WRITE_COM_DATA2();
- void WRITE_ZIFU();
- //上电延时子程序
- void DELAY()
- { uint i,j;
- for(i=0;i<2;i++)
- {
- for(j=0;j<5;j++);
- }
- }
- //向LCD写入要显示的字符的函数
- void WRITE_ZIFU()
- {
- D_ADDR=&DATA_ADDR;//取数据口地址
- *D_ADDR=DAT2;//将显示的字符写入LCD的数据单元
- DELAY();
- C_ADDR= &COM_ADDR;//取命令口地址
- *C_ADDR=COM;//将命令写入LCD的命令单元
- DELAY();
- }
- //向LCD写入无参数命令的函数
- void WRITE_COM_DATA0()
- { C_ADDR=&COM_ADDR;//取命令口地址
- *C_ADDR=COM;//将命令写入LCD的命令单元
- DELAY();
- }
- //向LCD写入只有一个参数命令的函数
- void WRITE_COM_DATA1()
- { D_ADDR= &DATA_ADDR;//取数据口地址
- *D_ADDR=DAT1;//将参数或者数据写入LCD的数据单元
- DELAY();
- C_ADDR= &COM_ADDR;//取命令口地址
- *C_ADDR=COM;//将命令写入LCD的命令单元
- DELAY();
- }
- //向LCD写入有2个参数命令的函数
- void WRITE_COM_DATA2()
- { D_ADDR=&DATA_ADDR;//取数据口地址
- *D_ADDR=DAT1;//将参数1或者数据1写入LCD的数据单元
- DELAY();
- *D_ADDR=DAT2;//将参数2或者数据2写入LCD的数据单元
- DELAY();
- C_ADDR=&COM_ADDR;//取命令口地址
- *C_ADDR=COM;//将命令写入LCD的命令单元
- DELAY();
- }
- //LCD初始化函数
- void LCD_InIt()
- {
- //显示区域设置
- DAT1=0x00;//设置文本显示区首地址,首地址为屏幕的左上角
- DAT2=0x00;
- COM=0x40;//设置文本显示区首地址的命令
- WRITE_COM_DATA2();//双参数函数。将文本显示区首地址写入LCD
- DAT1=16;//设置文本显示区域宽度,即一行显示所占字节数.每行16个字符
- DAT2=0;
- COM=0x41;//设置文本显示区域宽度的命令
- WRITE_COM_DATA2();//双参数函数。将文本显示区宽度写入LCD
- DAT1=0x00;//设置显示区域首地址,或文本属性区域首地址
- DAT2=0x00;
- COM=0x42;//设置显示区域首地址或文本属性区域首地址的命令
- WRITE_COM_DATA2();//双参数函数。显示区域首地址或文本属性区域首地址写入LCD
- DAT1=0x10;/ /设置图形显示区域宽度或为文本属性区域宽度,即一行显示所占字节数
- DAT2=0x00;
- COM=0x43;//设置图形显示区域宽度或为文本属性区域宽度的命令
- WRITE_COM_DATA2();//双参数函数。显示区域首地址或文本属性区域首地址写入LCD
- //显示光标设置
- COM=0xA1;//光标形状设置命令
- WRITE_COM_DATA0();//无参数函数。光标形状设置命令写入LCD
- //设置光标初始位置,是字符行和字符列,第0行第0列
- DAT1=0x00;//设置光标列位置
- DAT2=0x00;//设置光标行位置
- COM=0x21;//设置光标行和列位置的命令
- WRITE_COM_DATA2();//双参数函数。光标行和列位置写入LCD
- //显示方式设置,使用内部字符发生器
- COM=0x80;//显示方式设置,逻辑"或"合成
- WRITE_COM_DATA0();//无参数函数。显示方式设置命令写入LCD
- //显示开关方式
- COM=0x97;//仅用文本显示
- WRITE_COM_DATA0();//无参数函数。仅用文本显示方式命令写入LCD
- }
- //LCD在规定位置显示字符。行为Y,列为X,要显示的字符预先放在zifu变量中
- void LCD_DISP(uchar y,uchar x,uchar zifu)
- {
- DAT1=y*16+x;//设置显示RAM首地址,水平方向字符数
- DAT2=0;//固定送0
- COM=0x24;//设置将要进行操作的显示缓冲区(RAM)的一个单元地址
- WRITE_COM_DATA2();//双参数函数。设置将要显示的字符位置
- DAT2=zifu;//要显示的字符
- COM=0xc4;//数据写,地址不变
- WRITE_ZIFU();//单参数函数。将要显示的字符在规定的(x,y)位置写入LCD ,在LCD上显示该字符
- }
- //清显示缓冲区(16*8单元)
- void clear(void)
- {
- uchar i,j;
- for(i=0;i<8;i++)
- {
- for(j=0;j<16;j++)
- LCD_DISP(i,j,0x00);
- }
- }
- void main()
- {
- TMOD = 0x01;
- TH0 = (65536-20000)/256;
- TL0 = (65536-20000)%256;
- ET0 = 1;
- TR0 = 1;
- EX1 = 1; //中断int1
- IT1 = 1;
- EX0 = 1; //中断int0
- IT0 = 1;
- EA = 1;
- SP=0x60;
- DELAY();//上电延时
- DELAY();
- LCD_InIt();//LCD初始化设置
- clear();//清显示缓冲区(16*8单元),屏幕全黑
- while(1)
- {
- LCD_DISP(3,2,zifuma[year/1000]);
- LCD_DISP(3,3,zifuma[year%1000/100]);
- LCD_DISP(3,4,zifuma[year%1000%100/10]);
- LCD_DISP(3,5,zifuma[year%1000%100%10]);
- LCD_DISP(3,6,0x0D);
- LCD_DISP(3,7,zifuma[mounth/10]);
- LCD_DISP(3,8,zifuma[mounth%10]);
- LCD_DISP(3,9,0x0D);
- LCD_DISP(3,10,zifuma[day/10]);
- LCD_DISP(3,11,zifuma[day%10]);
- LCD_DISP(4,3,zifuma[hour/10]);
- LCD_DISP(4,4,zifuma[hour%10]);
- LCD_DISP(4,5,0x0D);
- LCD_DISP(4,6,zifuma[fen/10]);
- LCD_DISP(4,7,zifuma[fen%10]);
- LCD_DISP(4,8,0x0D);
- LCD_DISP(4,9,zifuma[second/10]);
- LCD_DISP(4,10,zifuma[second%10]);
- P1=k2;
- }
- }
- int_1k2() interrupt 2
- {
- if(k2==6)
- k2=0;
- else
- k2++;
- if(k2==0)
- {
- DAT1=0x00;//设置光标列位置
- DAT2=0x00;//设置光标行位置
- }
- else if(k2==1)
- {
- DAT1=0x09;//设置光标列位置
- DAT2=0x04;//设置光标行位置
- }
- else if(k2==2)
- {
- DAT1=0x06;//设置光标列位置
- DAT2=0x04;//设置光标行位置
- }
- else if(k2==3)
- {
- DAT1=0x03;//设置光标列位置
- DAT2=0x04;//设置光标行位置
- }
- else if(k2==4)
- {
- DAT1=0x0a;//设置光标列位置
- DAT2=0x03;//设置光标行位置
- }
- else if(k2==5)
- {
- DAT1=0x07;//设置光标列位置
- DAT2=0x03;//设置光标行位置
- }
- else if(k2==6)
- {
- DAT1=0x02;//设置光标列位置
- DAT2=0x03;//设置光标行位置
- }
- COM=0x21;//设置光标行和列位置的命令
- WRITE_COM_DATA2();//双参数函数。光标行和列位置写入LCD
- }
- int_0k1() interrupt 0
- {
- if(k2==1)
- {
- if(second==59)
- second=0;
- else
- second++;
- }
- else if(k2==2)
- {
- if(fen==59)
- fen=0;
- else
- fen++;
- }
- else if(k2==3)
- {
- if(hour==23)
- hour=0;
- else
- hour++;
- }
- else if(k2==4)
- {
- if(year%4==0)
- {
- if(mounth==2)
- {
- if(day==29)
- day=1;
- else
- day++;
- }
- else if(mounth==1|mounth==3|mounth==5|mounth==7|mounth==8|mounth==10|mounth==12)
- {
- if(day==31)
- day=1;
- else
- day++;
- }
- else if(mounth==4|mounth==6|mounth==9|mounth==11)
- {
- if(day==30)
- day=1;
- else
- day++;
- }
- }
- else if(year%4!=0)
- {
- if(mounth==2)
- {
- if(day==28)
- day=1;
- else
- day++;
- }
- else if(mounth==1||mounth==3||mounth==5||mounth==7||mounth==8||mounth==10||mounth==12)
- {
- if(day==31)
- day=1;
- else
- day++;
- }
- else if(mounth==4||mounth==6||mounth==9||mounth==11)
- {
- if(day==30)
- day=1;
- else
- day++;
- }
- }
- }
- else if(k2==5)
- {
- if(mounth==12)
- mounth=1;
- else
- mounth++;
- }
- else if(k2==6)
- year++;
- }
- timer0() interrupt 1
- {
-
- TH0 = (65536-20000)/256;
- TL0 = (65536-20000)%256;
- if(year%4==0)
- {
- if(mounth==2)
- {
- if(count==49)
- {
- count=0;
- if(second==59)
- {
- second=0;
- if(fen==59)
- {
- fen=0;
- if(hour==23)
- {
- hour=0;
- if(day==29)
- {
- day=1;
- if(mounth==12)
- {
- mounth=1;
- year++;
- }
- else
- mounth++;
- }
- else
- day++;
- }
- else
- hour++;
- }
- else
- fen++;
- }
- else
- second++;
- }
- else
- count++;
- }
- else
- ;
- }
- if(year%4!=0)
- {
- if(mounth==2)
- {
- if(count==49)
- {
- count=0;
- if(second==59)
- {
- second=0;
- if(fen==59)
- {
- fen=0;
- if(hour==23)
- {
- hour=0;
- if(day==28)
- {
- day=1;
- if(mounth==12)
- {
- mounth=1;
- year++;
- }
- else
- mounth++;
- }
- else
- day++;
- }
- else
- hour++;
- }
- else
- fen++;
- }
- else
- second++;
- }
- else
- count++;
- }
- else
- ;
- }
- if(mounth==1||mounth==3||mounth==5||mounth==7||mounth==8||mounth==10||mounth==12)
- {
- if(count==49)
- {
- count=0;
- if(second==59)
- {
- second=0;
- if(fen==59)
- {
- fen=0;
- if(hour==23)
- {
- hour=0;
- if(day==31)
- {
- day=1;
- if(mounth==12)
- {
- mounth=1;
- year++;
- }
- else
- mounth++;
- }
- else
- day++;
- }
- else
- hour++;
- }
- else
- fen++;
- }
- else
- second++;
- }
- else
- count++;
- }
- if(mounth==4||mounth==6||mounth==9||mounth==11)
- {
- if(count==49)
- {
- count=0;
- if(second==59)
- {
- second=0;
- if(fen==59)
- {
- fen=0;
- if(hour==23)
- {
- hour=0;
- if(day==30)
- {
- day=1;
- if(mounth==12)
- {
- mounth=1;
- year++;
- }
- else
- mounth++;
- }
- else
- day++;
- }
- else
- hour++;
- }
- else
- fen++;
- }
- else
- second++;
- }
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码 |