欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4147|回復: 0
打印 上一主題 下一主題
收起左側

單片機動態顯示與矩陣鍵盤實驗 Proteus仿真程序

[復制鏈接]
跳轉到指定樓層
樓主
矩陣式鍵盤鍵值分別是0-9,最下面一排鍵位功能鍵,左右兩個鍵分別為“清0鍵”“C,和”“回車鍵”“8 ”,其它鍵無效。未按鍵不顯示,每按鍵一次,鍵值在最低位顯示,原鍵值向高位移一位。按8個鍵后,再按鍵無效。按清0鍵全顯示“0”。按“8 ”后全部熄滅,再按鍵重新開始。
設計思路:
1、 動態顯示
(1)設置8個數據的一維顯示數組disp[],設置位選碼數組sled_bit[]對應每個數碼管;設置2個一維數組,data uchar ar[8]={1,9,4,9,1,0,0,1}data uchar br[8]={2,0,1,4,1,2,1,0};按K1K2鍵進入外部中斷0,在外部中斷程序中根據按鍵將ar[]br[]數據送人disp[]
2T0500us中斷1次,在T0中斷中點亮一個數碼管。在T0中斷函數中,① P1.3=1U1U2輸出高阻;② P1.4=1P0口輸出段碼,P1.4=0U1鎖存輸入的段碼;③ P1.5=1P0口輸出位選碼,P1.5=0U2鎖存輸入的位選碼;④ P1.3=0U1U2同時輸出段碼和位選碼,進行顯示。
2、 矩陣式鍵盤按鍵識別
1行、列輸出后要延時,才讀出相應特征值
2進行鍵值分析前要具備如下條件:
要有鍵按下,設a是得到的鍵值,if(a!=0xff)才繼續進行;
要等鍵彈起,若輸出P2=0x0f,則P2!=0x0f 要等待,while(P2!=0x0f)
每次進行完鍵值分析后,要延時。
3、 功能鍵位
設置功能鍵位時單獨處理,對位選數組disp[]做相應的修改并修改顯示標志位。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. sbit out=P1^3;
  5. sbit page=P1^4;
  6. sbit bite=P1^5;
  7. data uchar a,num,i,j=0,y,b;
  8. //char data *px;
  9. uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  10. data uchar disp[]={16,16,16,16,16,16,16,16};
  11. uchar table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
  12. //uchar table2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
  13. //uchar data b1[]={2,0,1,4,1,2,1,0};
  14. //uchar data b2[]={1,9,4,9,1,0,0,1};
  15. void delay(unsigned int i)
  16. {
  17.         unsigned char j;
  18.         for(;i>0;i--)
  19.         for(j=0;j<125;j++)
  20.         ;                                                                                                                                                                                                                                                                  
  21. }
  22. void main()
  23. {
  24.         TMOD=0x01;           //定時器T0的方式1
  25.         //TMOD=0x50;  定時器T1的方式1
  26.         TH0=65036/256;
  27.         TL0=65036%256;
  28.         ET0=1;
  29.         EA=1;
  30. //        TR0=1;
  31.         EX0=1;        //開關外部中斷
  32.         IT0=1;        //外部中斷0觸發方式為跳變沿觸發
  33.         PX0=1;        //設置外部中斷0優先于1;
  34. //        out=1;
  35. //        P0=0xff;
  36.         while(1){
  37.         TR0=1;
  38.                 P2=0xf0;
  39.                 a=P2;
  40. //                a=~a;
  41.                 P2=0x0f;
  42.                 b=P2;
  43.                 a=a|b;
  44.                 if(a!=0xff)
  45.                 {
  46.                         while(P2!=0x0f);
  47.                         switch(a)
  48.                         {
  49.                                 case 0xee: num=0;break;
  50.                                 case 0xde: num=1;break;
  51.                                 case 0xbe: num=2;break;
  52.                                 case 0x7e: num=3;break;
  53.                                 case 0xed: num=4;break;
  54.                                 case 0xdd: num=5;break;
  55.                                 case 0xbd: num=6;break;
  56.                                 case 0x7d: num=7;break;
  57.                                 case 0xeb: num=8;break;
  58.                                 case 0xdb: num=9;break;
  59.                                 case 0xe7: num=12;break;
  60.                                 case 0x77: num=15;break;
  61.                         }
  62.                         if(num<10&&disp[0]==16){
  63.                         for(i=0;i<7;i++)
  64.                         disp[i]=disp[i+1];
  65.                         disp[7]=num;
  66.                         }
  67.                         else if(num==12)
  68.                         {
  69.                                 for(i=7;i>0;i--)
  70.                                 disp[i]=disp[i-1];
  71.                                 disp[0]=16;
  72.                         }else if(num==15)
  73.                         {
  74.                                 for(i=0;i<8;i++)
  75.                                 disp[i]=16;
  76.                         }else if(disp[0]!=16){
  77.                         for(i=0;i<7;i++)
  78.                                 disp[i]=16;
  79.                         disp[7]=num;
  80.                        
  81.                         }
  82.                 }
  83.                 delay(50);
  84.         }
  85. }
  86. void EXO_int() interrupt 0
  87. {
  88.                
  89. }
  90. void T0_int() interrupt 1
  91. {
  92.         uchar k;
  93.         TH0=65036/256;
  94.         TL0=65036%256;
  95.         out=1;
  96.         k=disp[j];
  97.         P0=table2[k];//顯示的值
  98.         page=1;
  99.         page=0;
  100.         P0=table1[j]; //顯示的位
  101.         bite=1;
  102.         bite=0;
  103.         out=0;
  104.         j++;
  105.         if(j>7) j=0;       
  106. }
復制代碼

所有資料51hei提供下載:
動態顯示與矩陣鍵盤.zip (22.8 KB, 下載次數: 37)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表