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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2597|回復: 0
收起左側

1602顯示器顯示規劃優化體會 附單片機程序+仿真圖

[復制鏈接]
ID:404797 發表于 2019-3-18 23:18 | 顯示全部樓層 |閱讀模式
    1602顯示器成本低廉使用簡單,是單片機理想的顯示設備。但是,1602顯示器同時只能顯示32個字符的內容,顯示信息明顯偏少,而且自然顯示的話顯示內容很快就會超出顯示范圍而看不見。直到第一行顯示滿64個字符后才回到第二行開頭顯示重現顯示內容。為了避免出現顯示內容超出顯示范圍而不可見,程序要適時換行,但在程序中使用顯示器的地方有很多個模塊,其中有些還是中斷模塊,各模塊實際往顯示器送了多少個字符很難判斷,很難適時換行導致顯示內容進入不可見顯示區而影響顯示效果,特別是有些時候要輸入數字,還會用到退格鍵刪除內容,這更增加了顯示控制的難度。有的程序員為了避免出現這種情況就采用固定地點顯示方法,就只在顯示器幾個固定地方顯示內容,這樣雖然不會出現顯示內容不可見的情況,但往往只能安排少數幾個顯示地點,會出現很多顯示單元沒利用,使本來不多的顯示資源便顯緊張,影響程序運行效果,特別是一些顯示數據刷新率高的場合,往往前一個數據還沒看清,下一下數據已將其履蓋。所以固定地點顯示的方法也不是最優。根據本人的體會,要充分利用1602顯示器的顯示資源,要固定地點顯示與自然顯示方法相結合,在顯示器中的一些特定區域設為固定顯示點,如將顯示器的每行兩端兩到四個顯示單元作為固定顯示點,用于較固定的顯示需求,其余地方作為自然顯示區,編寫一個專門顯示模塊,統一管理顯示資源,正確設置顯示光標,使顯示內容能在自然顯示區內合理顯示,而又不會影響其他區域的顯示。這樣就能最大限度發揮顯示器的作用。
    為了說明本方法對顯示器的使用,本人設計了一個簡單的例子。在本例中,有一個簡單的算術測試程序,在100個時間單位內,單片機不斷出一些簡單的算術題,由用戶答題,正確則正確答題數加分,錯誤則錯題數加分,在顯示器的左上角實時顯示答對題數字,左下角實時顯示答錯題數字,右上角則實時顯示所剩的時間數字,右下角則用于輸入數字顯示用,支持退格刪除字符。

下面是程序運行時的截圖:
p7.JPG

單片機源程序如下:
  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黑下載附件…………
復制代碼
0.png
附件有完整程序及proteus設計:
P7.zip (109.73 KB, 下載次數: 7)

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日操夜夜操天天操 | 免费激情网站 | 一区二区三区亚洲 | 国产羞羞视频在线观看 | 视频三区 | 日韩欧美三区 | 99视频免费播放 | 久久一区二区三区四区 | 欧美精品乱码久久久久久按摩 | 亚洲精品乱码 | 亚洲日韩中文字幕一区 | 国产成在线观看免费视频 | 欧美不卡视频 | 欧美一区二区大片 | 日韩在线中文字幕 | 一区二区高清在线观看 | 欧美成年网站 | 狠狠久久 | 九九久久精品 | 久久夜色精品国产 | 午夜电影网 | 亚洲午夜视频 | 久久亚洲国产 | 中文字幕久久精品 | 日本精品在线播放 | 国产精品久久99 | 国产精品久久国产精品 | 欧美性生活视频 | 自拍视频网站 | 九色在线观看 | 在线一区二区观看 | 精品国产青草久久久久福利 | 精品乱码一区二区三四区 | 美女黄网| 国产精品一区在线 | 亚州精品天堂中文字幕 | 欧美人妇做爰xxxⅹ性高电影 | 中文久久 | 四虎影视免费观看 | 丁香五月网久久综合 | 欧美一区二区三区在线观看 |