|
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit LCD_RS= P2^6;//定義LCD引腳
- sbit LCD_RW= P2^5;
- sbit LCD_E= P2^7;
- uchar codeDIS[]={"NE555-------TEST"};//NE555 測試;
- uchar codedsptab[]={'0','1','2','3','4','5','6','7','8','9'};//字符代表碼;
- uchari,c[4],a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uint s;
- /*====================延時子程序====================*/
- void delay(uint z)
- {
- uchar m;
- for(;z>0;z--)
- for(m=124;m>0;m--);
- }
- void delay400ms(void)////400ms延時
- { uchar z = 5;
- uintm;
- while(z--)
- {m=7269;
- while(m--);
- }
- }
- /*====================LCD1602子程序====================*/
- /*-- 讀狀態(tài) --*/
- //讀狀態(tài)子程序;有返回值;返回值類型為CHAR型;
- //讀回的狀態(tài)通過RETURN返回;
- uchar read_estate(void) //定義有返回值的函數(shù);
- { P0=0Xff; //把LCD端口全置1方便讀取信號;
- LCD_RS=0; //RS置0;
- LCD_RW=1; //RW置1;
- LCD_E=0; //E端置0;
- delay(10); //短延時;
- LCD_E=1; //E端置1;以鎖存數(shù)據(jù);
- while(P0&0x80); //檢測忙,則一直循環(huán);
- return(P0); //返回讀取的信號;
- }
- /*-- 寫數(shù)據(jù) --*/
- //寫數(shù)據(jù)子程序;無返回值;輸入變量I;
- //I為要寫入LCD中的數(shù)據(jù);
- //數(shù)據(jù)類型CHAR形;
- void write_data(uchar i) //定義輸入變量值I;
- {
- read_estate(); //檢測忙信號;
- P0=i; //把I中數(shù)據(jù)送到LCD數(shù)據(jù)端;
- LCD_RS=1; //RS置1;
- LCD_RW=0; //RW置0;
- LCD_E=0; //E置0;
- delay(10); //短延時;
- LCD_E=1; //E置1;以鎖存數(shù)據(jù);
- }
- /*-- 寫指令 --*/
- //寫指令子程序;無返回值;輸入二個變量I和J.
- //I為要寫入LCD的指令;J為判斷要不要檢測忙.
- //如果J為0則不判斷檢測忙;
- //如果J為1則判斷檢測忙;
- void write_dictate(uchar i,j) //定義二個變量;
- {
- if(j)read_estate(); //根據(jù)需要檢測忙;
- P0=i; //把要寫入的數(shù)據(jù)送到LCD數(shù)據(jù)端;
- LCD_RS=0; //RS置0;
- LCD_RW=0; //RW置0;
- LCD_E =1; //E端置0;
- delay(10); //延時;
- LCD_E =0; //E端置1;以鎖存數(shù)據(jù);
- }
- /*-- LCD初始化 --*/
- //LCD初始化程序;主要作用初始化LCD,對LCD進行復(fù)位以及設(shè)置;
- void initialization(void) //定義函數(shù);
- {
- delay(50); //延時5MS;
- write_dictate(0x38,0); //寫指令38H;不檢測忙;
- delay(50); //延時5MS;
- write_dictate(0x38,0); //寫指令38H;不檢測忙;
- delay(50); //延時5MS;
- write_dictate(0x38,0); //寫指令38H;不檢測忙;
- delay(50);
- write_dictate(0x38,1); //顯示模式設(shè)置;檢測忙;
- write_dictate(0x08,1); //關(guān)閉顯示;檢測忙;
- write_dictate(0x01,1); //顯示清屏;檢測忙;
- write_dictate(0x06,1); //顯示光標(biāo)移動設(shè)置;檢測忙;
- write_dictate(0x0C,1); //顯示開及光標(biāo)設(shè)置;檢測忙;
- }
- /*-- 在指定位置顯示一個字符 --*/
- void displayonechar(uchar x, y,ddata)
- {
- y &= 0x01;
- x &= 0x0f; //限制X不能大于15,Y不能大于1
- if (y) x+= 0x40; //當(dāng)要顯示第二行時地址碼+0x40;
- x+= 0x80; //算出指令碼
- write_dictate(x,0); //這里不檢測忙信號,發(fā)送地址碼
- write_data(ddata);
- }
- /*-- 在指定位置顯示一串字符 --*/
- void displaylistchar(uchar x,y,uchar code*ddata)
- {uchar a=0;
- y&=0x01;
- x&=0xf;
- while(ddata[a]>0x20)
- {if(x<=0xff)
- {
- displayonechar(x, y,ddata[a]);
- a++;
- x++;
- }
- }
- }
- /*====================MAIN主程序====================*/
- void main()
- {
- delay400ms();//延時400MS
- initialization();//LCD復(fù)位;
- displaylistchar(0,0,DIS);//顯示NE555 測試;
- displayonechar(0,1,'F'); //在LCD是顯示F=____Hz
- displayonechar(1,1,'=');
- displayonechar(9,1,'H');
- displayonechar(10,1,'z');
- TMOD=0X51; //定義T0為方式一(十六位進制),T1為計數(shù)器(16位)
- TH0=0X3C; //50 ms
- TL0=0XB0;
- TH1=0X00; //初始值
- TL1=0X00;
- TR0=1;
- TR1=1;
- ET0=1;
- ET1=0;
- EA=1;
- i=0;
- /* 顯示 */ // 調(diào)用顯示子程序(顯示位,顯示行,顯示數(shù)據(jù))注:顯示行 “0”為第一行,“1為第二行”
- while(1)
- {
- if(s/10000>=1)
- {
- displayonechar(2,1,dsptab[s/10000]);//萬
- displayonechar(3,1,dsptab[s/1000%10]);//千
- displayonechar(4,1,'.');//點
- displayonechar(5,1,dsptab[s/100%10]);//百
- displayonechar(6,1,dsptab[s/10%10]);//十
- displayonechar(7,1,dsptab[s%10]); //個
- displayonechar(8,1,'K');
- }
- else if(s/1000>=1)
- {
- displayonechar(2,1,' ');
- displayonechar(3,1,dsptab[s/1000%10]);//千
- displayonechar(4,1,'.'); //點
- displayonechar(5,1,dsptab[s/100%10]);//百
- displayonechar(6,1,dsptab[s/10%10]); //十
- displayonechar(7,1,dsptab[s%10]); //個
- displayonechar(8,1,'K');
- }
- else if(s/100>=1)
- {
- displayonechar(2,1,' ');
- displayonechar(3,1,' ');
- displayonechar(4,1,' '); //萬
- displayonechar(5,1,' '); //千
- displayonechar(6,1,dsptab[s/100%10]);//百
- displayonechar(7,1,dsptab[s/10%10]); //十
- displayonechar(8,1,dsptab[s%10]); //個
- }
- else if(s/10>=1)
- {
- displayonechar(2,1,'');
- displayonechar(3,1,'');
- displayonechar(4,1,''); //萬
- displayonechar(5,1,''); //千
- displayonechar(6,1,' ');//百
- displayonechar(7,1,dsptab[s/10%10]); //十
- displayonechar(8,1,dsptab[s%10]); //個
- }
- else
- {
- displayonechar(2,1,'');
- displayonechar(3,1,'');
- displayonechar(4,1,''); //萬
- displayonechar(5,1,''); //千
- displayonechar(6,1,'');//百
- displayonechar(7,1,dsptab[s/10%10]);//十
- displayonechar(8,1,dsptab[s%10]); //個
- }
- }
- }
- /* 中斷 */
- void t0()interrupt 1
- {
- TH0=0X3C;
- TL0=0XB0;
- i++;
- if(i==20) //1 s時間到時
- {
- s=TH1; //555信號發(fā)生器的輸出口接P3.5(T1) 15腳
- s=s<<8;
- s=s+TL1;
- i=0; //清零
- TH1=0X00;
- TL1=0X00;
- }
- }
- /*----------------------------------------------------------------*/
- /*----------------- 1602液晶數(shù)據(jù)讀取子程序 -----------------------*/
- //讀數(shù)據(jù)子程序;有返回值,返回值類型為CHAR型;
- /*uchar read_data(void) //定義有返回值的子函數(shù);
- {
- LCD_DATA=0Xff; //LCD數(shù)據(jù)端口置1;
- LCD_RS=1; //RS置1;
- LCD_RW=1; //RW置1;
- LCD_E=0; //E置0;
- delay(10); //短延時;
- LCD_E=1; //E置1;以鎖存數(shù)據(jù);
- return(LCD_DATA); //返回讀取的值;
- }
- /*----------------------------------------------------------------*/
復(fù)制代碼
|
-
-
測試系統(tǒng).zip
2018-5-27 19:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
36.36 KB, 下載次數(shù): 13, 下載積分: 黑幣 -5
Proteus仿真圖
|