0.png (64.54 KB, 下載次數: 118)
下載附件
2017-5-5 15:56 上傳
- #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黑下載附件…………
復制代碼 |