0.png (64.54 KB, 下載次數(shù): 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] //數(shù)據(jù)口地址
- #define COM_ADDR XBYTE[0xF100] //命令口地址
- uchar xdata *C_ADDR,*D_ADDR;//指向命令口和數(shù)據(jù)口的地址指針
- 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; //存放第一參數(shù)的變量
- uchar data DAT2; //存放第二參數(shù)的變量
- 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寫入要顯示的字符的函數(shù)
- void WRITE_ZIFU()
- {
- D_ADDR=&DATA_ADDR;//取數(shù)據(jù)口地址
- *D_ADDR=DAT2;//將顯示的字符寫入LCD的數(shù)據(jù)單元
- DELAY();
- C_ADDR= &COM_ADDR;//取命令口地址
- *C_ADDR=COM;//將命令寫入LCD的命令單元
- DELAY();
- }
- //向LCD寫入無參數(shù)命令的函數(shù)
- void WRITE_COM_DATA0()
- { C_ADDR=&COM_ADDR;//取命令口地址
- *C_ADDR=COM;//將命令寫入LCD的命令單元
- DELAY();
- }
- //向LCD寫入只有一個參數(shù)命令的函數(shù)
- void WRITE_COM_DATA1()
- { D_ADDR= &DATA_ADDR;//取數(shù)據(jù)口地址
- *D_ADDR=DAT1;//將參數(shù)或者數(shù)據(jù)寫入LCD的數(shù)據(jù)單元
- DELAY();
- C_ADDR= &COM_ADDR;//取命令口地址
- *C_ADDR=COM;//將命令寫入LCD的命令單元
- DELAY();
- }
- //向LCD寫入有2個參數(shù)命令的函數(shù)
- void WRITE_COM_DATA2()
- { D_ADDR=&DATA_ADDR;//取數(shù)據(jù)口地址
- *D_ADDR=DAT1;//將參數(shù)1或者數(shù)據(jù)1寫入LCD的數(shù)據(jù)單元
- DELAY();
- *D_ADDR=DAT2;//將參數(shù)2或者數(shù)據(jù)2寫入LCD的數(shù)據(jù)單元
- DELAY();
- C_ADDR=&COM_ADDR;//取命令口地址
- *C_ADDR=COM;//將命令寫入LCD的命令單元
- DELAY();
- }
- //LCD初始化函數(shù)
- void LCD_InIt()
- {
- //顯示區(qū)域設(shè)置
- DAT1=0x00;//設(shè)置文本顯示區(qū)首地址,首地址為屏幕的左上角
- DAT2=0x00;
- COM=0x40;//設(shè)置文本顯示區(qū)首地址的命令
- WRITE_COM_DATA2();//雙參數(shù)函數(shù)。將文本顯示區(qū)首地址寫入LCD
- DAT1=16;//設(shè)置文本顯示區(qū)域?qū)挾?即一行顯示所占字節(jié)數(shù).每行16個字符
- DAT2=0;
- COM=0x41;//設(shè)置文本顯示區(qū)域?qū)挾鹊拿?br />
- WRITE_COM_DATA2();//雙參數(shù)函數(shù)。將文本顯示區(qū)寬度寫入LCD
- DAT1=0x00;//設(shè)置顯示區(qū)域首地址,或文本屬性區(qū)域首地址
- DAT2=0x00;
- COM=0x42;//設(shè)置顯示區(qū)域首地址或文本屬性區(qū)域首地址的命令
- WRITE_COM_DATA2();//雙參數(shù)函數(shù)。顯示區(qū)域首地址或文本屬性區(qū)域首地址寫入LCD
- DAT1=0x10;/ /設(shè)置圖形顯示區(qū)域?qū)挾然驗(yàn)槲谋緦傩詤^(qū)域?qū)挾?即一行顯示所占字節(jié)數(shù)
- DAT2=0x00;
- COM=0x43;//設(shè)置圖形顯示區(qū)域?qū)挾然驗(yàn)槲谋緦傩詤^(qū)域?qū)挾鹊拿?br />
- WRITE_COM_DATA2();//雙參數(shù)函數(shù)。顯示區(qū)域首地址或文本屬性區(qū)域首地址寫入LCD
- //顯示光標(biāo)設(shè)置
- COM=0xA1;//光標(biāo)形狀設(shè)置命令
- WRITE_COM_DATA0();//無參數(shù)函數(shù)。光標(biāo)形狀設(shè)置命令寫入LCD
- //設(shè)置光標(biāo)初始位置,是字符行和字符列,第0行第0列
- DAT1=0x00;//設(shè)置光標(biāo)列位置
- DAT2=0x00;//設(shè)置光標(biāo)行位置
- COM=0x21;//設(shè)置光標(biāo)行和列位置的命令
- WRITE_COM_DATA2();//雙參數(shù)函數(shù)。光標(biāo)行和列位置寫入LCD
- //顯示方式設(shè)置,使用內(nèi)部字符發(fā)生器
- COM=0x80;//顯示方式設(shè)置,邏輯"或"合成
- WRITE_COM_DATA0();//無參數(shù)函數(shù)。顯示方式設(shè)置命令寫入LCD
- //顯示開關(guān)方式
- COM=0x97;//僅用文本顯示
- WRITE_COM_DATA0();//無參數(shù)函數(shù)。僅用文本顯示方式命令寫入LCD
- }
- //LCD在規(guī)定位置顯示字符。行為Y,列為X,要顯示的字符預(yù)先放在zifu變量中
- void LCD_DISP(uchar y,uchar x,uchar zifu)
- {
- DAT1=y*16+x;//設(shè)置顯示RAM首地址,水平方向字符數(shù)
- DAT2=0;//固定送0
- COM=0x24;//設(shè)置將要進(jìn)行操作的顯示緩沖區(qū)(RAM)的一個單元地址
- WRITE_COM_DATA2();//雙參數(shù)函數(shù)。設(shè)置將要顯示的字符位置
- DAT2=zifu;//要顯示的字符
- COM=0xc4;//數(shù)據(jù)寫,地址不變
- WRITE_ZIFU();//單參數(shù)函數(shù)。將要顯示的字符在規(guī)定的(x,y)位置寫入LCD ,在LCD上顯示該字符
- }
- //清顯示緩沖區(qū)(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初始化設(shè)置
- clear();//清顯示緩沖區(qū)(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;//設(shè)置光標(biāo)列位置
- DAT2=0x00;//設(shè)置光標(biāo)行位置
- }
- else if(k2==1)
- {
- DAT1=0x09;//設(shè)置光標(biāo)列位置
- DAT2=0x04;//設(shè)置光標(biāo)行位置
- }
- else if(k2==2)
- {
- DAT1=0x06;//設(shè)置光標(biāo)列位置
- DAT2=0x04;//設(shè)置光標(biāo)行位置
- }
- else if(k2==3)
- {
- DAT1=0x03;//設(shè)置光標(biāo)列位置
- DAT2=0x04;//設(shè)置光標(biāo)行位置
- }
- else if(k2==4)
- {
- DAT1=0x0a;//設(shè)置光標(biāo)列位置
- DAT2=0x03;//設(shè)置光標(biāo)行位置
- }
- else if(k2==5)
- {
- DAT1=0x07;//設(shè)置光標(biāo)列位置
- DAT2=0x03;//設(shè)置光標(biāo)行位置
- }
- else if(k2==6)
- {
- DAT1=0x02;//設(shè)置光標(biāo)列位置
- DAT2=0x03;//設(shè)置光標(biāo)行位置
- }
- COM=0x21;//設(shè)置光標(biāo)行和列位置的命令
- WRITE_COM_DATA2();//雙參數(shù)函數(shù)。光標(biāo)行和列位置寫入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黑下載附件…………
復(fù)制代碼 |