久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2597|回復(fù): 0
收起左側(cè)

1602顯示器顯示規(guī)劃優(yōu)化體會 附單片機(jī)程序+仿真圖

[復(fù)制鏈接]
ID:404797 發(fā)表于 2019-3-18 23:18 | 顯示全部樓層 |閱讀模式
    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)行時的截圖:
p7.JPG

單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. sbit kx0=P2^0;
  3. sbit kx1=P2^1;
  4. sbit kx2=P2^2;
  5. sbit kx3=P2^3;
  6. sbit ky0=P2^4;
  7. sbit ky1=P2^5;
  8. sbit ky2=P2^6;
  9. sbit ky3=P2^7;

  10. sbit rs=P3^5;
  11. sbit rw=P3^6;
  12. sbit E=P3^7;
  13. #define StartA 3
  14. #define StartB 3
  15. #define EndA  13
  16. #define EndB  13
  17. char shifkey,ok,error,xl,yl;
  18. int Timenum,temp;
  19. //===========================================================
  20. void delay(int ii){int i;for(i=0;i<ii;i++);}
  21. //===========================================================
  22. 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; }
  23. 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;}
  24. void Putxychar(char x,char y,char c){if(y>0)writeCmd(0x80+0x40+x);else writeCmd(0x80+x);writeDat(c);}
  25. void Prtstr(char *cp){char i=0;while(cp[i]!=0){writeDat(cp[i]);i++;}}
  26. void Mplaychar(char c)
  27. {int i;Putxychar(xl,yl,c);
  28. xl++;
  29. if((xl>=EndA)&&(yl==0)){xl=StartB;yl=1;for(i=StartA;i<EndA;i++)Putxychar(i,1,' ');}
  30. else if(xl>=EndB){xl=StartA;yl=0;for(i=StartB;i<EndB;i++)Putxychar(i,0,' ');}
  31. }
  32. void Mplaystr(char *cp){char i=0;while(cp[i]!=0){Mplaychar(cp[i]);i++;}}
  33. //-----------------------------------------------------------
  34. void dispnum(int x,int y,int num)
  35. {if(y>0)writeCmd(0x80+0x40+x);else writeCmd(0x80+x);
  36. writeDat((num%100)/10+0x30);writeDat((num%100)%10+0x30);
  37. }
  38. //===========================================================
  39. void Timeinit()
  40. {EA=1;ET1=1;TMOD|=0x20;
  41. TH1=0;TL1=0;TR1=1;
  42. }
  43. //=========================================================
  44. void Time1Pro()interrupt 3
  45. {temp++;
  46. if(temp==3000){temp=0;if(Timenum>0)Timenum--;dispnum(14,0,Timenum);}
  47. }
  48. //==========================================================
  49. int KeyDown()
  50. {char v,x,y;
  51. x=4;y=4;
  52. P2=0x0f;v=P2;
  53. if(v!=0x0f){if(kx0==0)x=0;if(kx1==0)x=1;if(kx2==0)x=2;if(kx3==0)x=3;
  54.              P2=0xf0;if(ky0==0)y=0;if(ky1==0)y=1;if(ky2==0)y=2;if(ky3==0)y=3;
  55.              }
  56. return x*4+y;
  57. }
  58. //==========================================================
  59. unsigned int GetNum()
  60. {char w,pos=0,key;
  61. unsigned int num;
  62.   w=0;
  63.   writeCmd(0x80+0x40+EndB+1);
  64.   Prtstr("  ");
  65.   writeCmd(0x80+0x40+EndB+1);
  66.   while(1)
  67.   {key=KeyDown();
  68.    if(key<12)
  69.    {key=KeyDown();while(key==KeyDown());
  70.     if(key<10){Putxychar(EndB+pos+1,1,key+0x30);pos++;if(w==0)num=key;else num=num*10+key;w++;}
  71.         else if(key==10){num=num/10;if(pos>0)pos--;Putxychar(EndB+pos+1,1,' ');writeCmd(0x80+0x40+EndB+pos+1);}
  72.         else if(key==11)return num%100;
  73.    }
  74.    }
  75. }
  76. //=========================================================
  77. void Game()
  78. {int a,b,c;
  79.   while(Timenum)
  80.   {a=rand()%10;
  81.    b=rand()%10;
  82.    Mplaychar(a+0x30);
  83.    Mplaychar('+');
  84.    Mplaychar(b+0x30);
  85.    Mplaychar('=');
  86.    c=GetNum();
  87.    if((c%100)/10)Mplaychar((c%100)/10+0x30);
  88.    Mplaychar((c%100)%10+0x30);
  89.    Mplaychar(';');
  90.    if(c==(a+b)){dispnum(0,0,++ok);}
  91.    else{{dispnum(0,1,++error);}}
  92.   }
  93.   }
  94. //##########################################################
  95. void main()
  96. {int i;
  97. Timeinit();
  98. Timenum=100;
  99. Putxychar(2,0,'[');
  100. Putxychar(2,1,'[');
  101. Putxychar(13,0,']');
  102. Putxychar(13,1,']');
  103. ……………………

  104. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
0.png
附件有完整程序及proteus設(shè)計:
P7.zip (109.73 KB, 下載次數(shù): 7)

評分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产在线观看一区二区三区 | 久久久久久久久久久丰满 | 久草青青草| 国产精品看片 | 国产高清视频一区 | 日韩中文在线视频 | 成人做爰www免费看视频网站 | 欧美激情99 | 天天干天天想 | 天天精品在线 | 日本天天操 | av免费在线观看网站 | 91福利在线导航 | 羞羞视频在线观看网站 | 欧美日一区二区 | 成av在线 | 一区二区三区韩国 | 成人午夜在线 | 国产高清一二三区 | 国产日韩欧美综合 | 久久日韩精品 | 国产精品永久久久久 | 久久蜜桃av | 亚洲激情一区二区三区 | 国产精品一区二区三区久久 | 日韩中文字幕在线观看 | www视频在线观看 | 婷婷桃色网 | 精精精精xxxx免费视频 | 欧美在线亚洲 | 亚洲精品一区二区三区四区高清 | 天天插天天搞 | 亚洲第一福利视频 | 欧美二区在线 | 亚洲视频在线观看 | 天天干夜夜拍 | 999久久久久久久久 国产欧美在线观看 | 毛色毛片免费看 | 久久精品国产亚洲 | 国产在线激情视频 | 欧洲一级黄|