|
1602顯示器成本低廉使用簡單,是單片機(jī)理想的顯示設(shè)備。但是,1602顯示器同時只能顯示32個字符的內(nèi)容,顯示信息明顯偏少,而且自然顯示的話顯示內(nèi)容很快就會超出顯示范圍而看不見。直到第一行顯示滿64個字符后才回到第二行開頭顯示重現(xiàn)顯示內(nèi)容。為了避免出現(xiàn)顯示內(nèi)容超出顯示范圍而不可見,程序要適時換行,但在程序中使用顯示器的地方有很多個模塊,其中有些還是中斷模塊,各模塊實(shí)際往顯示器送了多少個字符很難判斷,很難適時換行導(dǎo)致顯示內(nèi)容進(jìn)入不可見顯示區(qū)而影響顯示效果,特別是有些時候要輸入數(shù)字,還會用到退格鍵刪除內(nèi)容,這更增加了顯示控制的難度。有的程序員為了避免出現(xiàn)這種情況就采用固定地點(diǎn)顯示方法,就只在顯示器幾個固定地方顯示內(nèi)容,這樣雖然不會出現(xiàn)顯示內(nèi)容不可見的情況,但往往只能安排少數(shù)幾個顯示地點(diǎn),會出現(xiàn)很多顯示單元沒利用,使本來不多的顯示資源便顯緊張,影響程序運(yùn)行效果,特別是一些顯示數(shù)據(jù)刷新率高的場合,往往前一個數(shù)據(jù)還沒看清,下一下數(shù)據(jù)已將其履蓋。所以固定地點(diǎn)顯示的方法也不是最優(yōu)。根據(jù)本人的體會,要充分利用1602顯示器的顯示資源,要固定地點(diǎn)顯示與自然顯示方法相結(jié)合,在顯示器中的一些特定區(qū)域設(shè)為固定顯示點(diǎn),如將顯示器的每行兩端兩到四個顯示單元作為固定顯示點(diǎn),用于較固定的顯示需求,其余地方作為自然顯示區(qū),編寫一個專門顯示模塊,統(tǒng)一管理顯示資源,正確設(shè)置顯示光標(biāo),使顯示內(nèi)容能在自然顯示區(qū)內(nèi)合理顯示,而又不會影響其他區(qū)域的顯示。這樣就能最大限度發(fā)揮顯示器的作用。
為了說明本方法對顯示器的使用,本人設(shè)計了一個簡單的例子。在本例中,有一個簡單的算術(shù)測試程序,在100個時間單位內(nèi),單片機(jī)不斷出一些簡單的算術(shù)題,由用戶答題,正確則正確答題數(shù)加分,錯誤則錯題數(shù)加分,在顯示器的左上角實(shí)時顯示答對題數(shù)字,左下角實(shí)時顯示答錯題數(shù)字,右上角則實(shí)時顯示所剩的時間數(shù)字,右下角則用于輸入數(shù)字顯示用,支持退格刪除字符。
下面是程序運(yùn)行時的截圖:
單片機(jī)源程序如下:
- #include<reg51.h>
- sbit kx0=P2^0;
- sbit kx1=P2^1;
- sbit kx2=P2^2;
- sbit kx3=P2^3;
- sbit ky0=P2^4;
- sbit ky1=P2^5;
- sbit ky2=P2^6;
- sbit ky3=P2^7;
- sbit rs=P3^5;
- sbit rw=P3^6;
- sbit E=P3^7;
- #define StartA 3
- #define StartB 3
- #define EndA 13
- #define EndB 13
- char shifkey,ok,error,xl,yl;
- int Timenum,temp;
- //===========================================================
- void delay(int ii){int i;for(i=0;i<ii;i++);}
- //===========================================================
- void writeCmd(unsigned char c){E=0;rw=0;rs=0;delay(50);delay(50);P1=c;delay(50);E=1;delay(50);E=0; }
- void writeDat(unsigned char c){E=0;rw=0;rs=1;delay(50);delay(50);P1=c;delay(50);E=1;delay(50);E=0;}
- void Putxychar(char x,char y,char c){if(y>0)writeCmd(0x80+0x40+x);else writeCmd(0x80+x);writeDat(c);}
- void Prtstr(char *cp){char i=0;while(cp[i]!=0){writeDat(cp[i]);i++;}}
- void Mplaychar(char c)
- {int i;Putxychar(xl,yl,c);
- xl++;
- if((xl>=EndA)&&(yl==0)){xl=StartB;yl=1;for(i=StartA;i<EndA;i++)Putxychar(i,1,' ');}
- else if(xl>=EndB){xl=StartA;yl=0;for(i=StartB;i<EndB;i++)Putxychar(i,0,' ');}
- }
- void Mplaystr(char *cp){char i=0;while(cp[i]!=0){Mplaychar(cp[i]);i++;}}
- //-----------------------------------------------------------
- void dispnum(int x,int y,int num)
- {if(y>0)writeCmd(0x80+0x40+x);else writeCmd(0x80+x);
- writeDat((num%100)/10+0x30);writeDat((num%100)%10+0x30);
- }
- //===========================================================
- void Timeinit()
- {EA=1;ET1=1;TMOD|=0x20;
- TH1=0;TL1=0;TR1=1;
- }
- //=========================================================
- void Time1Pro()interrupt 3
- {temp++;
- if(temp==3000){temp=0;if(Timenum>0)Timenum--;dispnum(14,0,Timenum);}
- }
- //==========================================================
- int KeyDown()
- {char v,x,y;
- x=4;y=4;
- P2=0x0f;v=P2;
- if(v!=0x0f){if(kx0==0)x=0;if(kx1==0)x=1;if(kx2==0)x=2;if(kx3==0)x=3;
- P2=0xf0;if(ky0==0)y=0;if(ky1==0)y=1;if(ky2==0)y=2;if(ky3==0)y=3;
- }
- return x*4+y;
- }
- //==========================================================
- unsigned int GetNum()
- {char w,pos=0,key;
- unsigned int num;
- w=0;
- writeCmd(0x80+0x40+EndB+1);
- Prtstr(" ");
- writeCmd(0x80+0x40+EndB+1);
- while(1)
- {key=KeyDown();
- if(key<12)
- {key=KeyDown();while(key==KeyDown());
- if(key<10){Putxychar(EndB+pos+1,1,key+0x30);pos++;if(w==0)num=key;else num=num*10+key;w++;}
- else if(key==10){num=num/10;if(pos>0)pos--;Putxychar(EndB+pos+1,1,' ');writeCmd(0x80+0x40+EndB+pos+1);}
- else if(key==11)return num%100;
- }
- }
- }
- //=========================================================
- void Game()
- {int a,b,c;
- while(Timenum)
- {a=rand()%10;
- b=rand()%10;
- Mplaychar(a+0x30);
- Mplaychar('+');
- Mplaychar(b+0x30);
- Mplaychar('=');
- c=GetNum();
- if((c%100)/10)Mplaychar((c%100)/10+0x30);
- Mplaychar((c%100)%10+0x30);
- Mplaychar(';');
- if(c==(a+b)){dispnum(0,0,++ok);}
- else{{dispnum(0,1,++error);}}
- }
- }
- //##########################################################
- void main()
- {int i;
- Timeinit();
- Timenum=100;
- Putxychar(2,0,'[');
- Putxychar(2,1,'[');
- Putxychar(13,0,']');
- Putxychar(13,1,']');
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
附件有完整程序及proteus設(shè)計:
P7.zip
(109.73 KB, 下載次數(shù): 7)
2019-3-18 23:16 上傳
點(diǎn)擊文件名下載附件
附件
|
評分
-
查看全部評分
|