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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

PS2讀電腦鍵盤實驗 數碼管顯示

[復制鏈接]
跳轉到指定樓層
樓主
  1. /****************************************************************************************
  2.                           PS2 讀電腦鍵盤實驗                                                                                        *
  3. 連接方法 : P0口與J12連接 拔開跳線帽用杜邦線連接左針與P3.2  右針與P1.6  連接                     *
  4. 使用方法:  用外部中斷讀取PS2鍵盤的數據 并在數碼管上顯示,此程序只處理數字鍵盤。            *
  5.                                                                                                                                                                                  *
  6. 其余按鍵功能用戶可以自行擴展,為了程序簡單便于閱讀和學習,程序中沒有使用奇偶校驗,            *
  7. 校驗程序請自行添加。                   *                                                                                                                *
  8.                                                                                                                                                      *
  9. *****************************************************************************************/

  10. #include<reg52.h>      

  11. sbit LS138A=P2^2;  
  12. sbit LS138B=P2^3;
  13. sbit LS138C=P2^4;

  14. sbit BEEP = P1^5;

  15. sbit Key_Data = P1^6 ;   //定義鍵盤引腳
  16. sbit Key_CLK = P3^2;     //使用外部中斷

  17. /******************************************************************/
  18. /*                    函數聲明                                    */
  19. /******************************************************************/
  20. void Decode(unsigned char ScanCode);  //解碼子程序
  21. void delay(unsigned int i);      //函數聲名
  22. void display();
  23. void beep();


  24. // 此表為 LED 的字模            // 0    1    2    3    4    5    6   7    8    9    A    b    c    d    E    -    L   P    U    Hidden  _ (20)
  25. unsigned char code Disp_Tab[] = { ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff,  ~0xf7 };
  26. bit BF;                                 
  27. unsigned char KeyV;
  28. unsigned char LedNumVal  ;
  29. int KEY_val,IntNum;

  30. /******************************************************************/
  31. /*                    主函數                                      */
  32. /******************************************************************/
  33. void main()
  34. {

  35. IT1 = 0;                              //設外部中斷1為低電平觸發
  36. EA = 1;                               //外部中斷開
  37. EX0 = 1;                              //開中斷

  38.   while(1)
  39. {
  40.    if (BF)
  41.     {  
  42.         if (KeyV != 240)  beep();  
  43.          
  44.        Decode(KeyV);        //解碼
  45.            
  46.           }
  47.     else
  48.       EA = 1; //開中斷         
  49.           display();
  50. }

  51. }

  52. /******************************************************************/
  53. /*                    外部中斷讀入信息                            */
  54. /******************************************************************/
  55. void Keyboard_out(void) interrupt 0
  56. {
  57. if ((IntNum > 0) && (IntNum < 9))
  58.    {
  59.         KeyV = KeyV >> 1;                //因鍵盤數據是低>>高,結合上一句所以右移一位
  60.         if (Key_Data)
  61.             KeyV = KeyV | 0x80;          //當鍵盤數據線為1時到最高位
  62.         }
  63.         IntNum++;
  64.         while (!Key_CLK);                //等待PS/2CLK拉高

  65.         if (IntNum > 10)
  66.            {
  67.                  IntNum = 0;                  //當中斷11次后表示一幀數據收完,清變量準備下一次接收
  68.                  BF = 1;                      //標識有字符輸入完了
  69.                 EA = 0;                      //關中斷等顯示完后再開中斷
  70.                 }

  71.   }

  72. /******************************************************************/
  73. /*                    解碼信息                                    */
  74. /******************************************************************/
  75. void Decode(unsigned char ScanCode) //注意:如SHIFT+G為12H 34H F0H 34H F0H 12H,也就是說shift的通碼+G的通碼+shift的斷碼+G的斷碼
  76. {

  77.           switch (ScanCode)
  78.                         {
  79.                         case 0x70 :             // 當收到0xF0,Key_UP置1表示斷碼開始
  80.                                 KEY_val = 0;
  81.                                 break;

  82.                         case 0x69 :            
  83.                                 KEY_val = 1;
  84.                                 break;

  85.                         case 0x72 :            
  86.                                 KEY_val = 2;
  87.                                 break;

  88.                         case 0x7A :            
  89.                             KEY_val = 3;
  90.                                 break;

  91.                         case 0x6B :            
  92.                                 KEY_val = 4;
  93.                                 break;

  94.                         case 0x73 :            
  95.                                 KEY_val = 5;
  96.                                 break;

  97.                         case 0x74 :            
  98.                                 KEY_val = 6;
  99.                                 break;

  100.                         case 0x6c :            
  101.                                 KEY_val = 7;
  102.                                 break;

  103.                         case 0x75 :            
  104.                                 KEY_val = 8;
  105.                                 break;

  106.                         case 0x7d :            
  107.                                 KEY_val = 9;
  108.                                 break;

  109.                    case 0x71 :
  110.                                 
  111.                         //        dot = 0X7F;
  112.                                 break;
  113.         
  114.         }
  115.          

  116. BF = 0; //標識字符處理完了         
  117. }


  118. /***************************************************************************************/
  119. void display( )
  120. {
  121.    unsigned char i;
  122.    unsigned int LedOut[8];

  123.    LedNumVal = KEY_val ;

  124.          //顯示鍵值
  125.          LedOut[0]=Disp_Tab[KeyV%10000/1000];
  126.      LedOut[1]=Disp_Tab[KeyV%1000/100];
  127.      LedOut[2]=Disp_Tab[KeyV%100/10];
  128.      LedOut[3]=Disp_Tab[KeyV%10];
  129.          
  130.          //顯示對應的字符
  131.          LedOut[4]=Disp_Tab[LedNumVal%10000/1000];           //千位
  132.      LedOut[5]=Disp_Tab[LedNumVal%1000/100];  //百位帶小數點
  133.      LedOut[6]=Disp_Tab[LedNumVal%100/10];                   //十位
  134.      LedOut[7]=Disp_Tab[LedNumVal%10];             //個位
  135.          
  136.         
  137.          for( i=0; i<8; i++)
  138.          {         P0 = LedOut[i];
  139.                         
  140.           switch(i)                                          
  141.              {            
  142.                         case 0:LS138A=0; LS138B=0; LS138C=0; break;         
  143.                 case 1:LS138A=1; LS138B=0; LS138C=0; break;                     
  144.                 case 2:LS138A=0; LS138B=1; LS138C=0; break;
  145.                 case 3:LS138A=1; LS138B=1; LS138C=0; break;
  146.                         case 4:LS138A=0; LS138B=0; LS138C=1; break;
  147.                         case 5:LS138A=1; LS138B=0; LS138C=1; break;
  148.                         case 6:LS138A=0; LS138B=1; LS138C=1; break;
  149.                         case 7:LS138A=1; LS138B=1; LS138C=1; break;
  150.                         
  151.              }
  152.                  
  153.                 delay(50);
  154.           }

  155. }

  156. /***************************************************************************************
  157. 延時程序                                                                                                                                                           *
  158. ****************************************************************************************/
  159. void delay(unsigned int i)
  160. {
  161.     char j;
  162.     for(i; i > 0; i--)
  163.         for(j = 200; j > 0; j--);
  164. }

  165. /***************************************************************************************
  166. 蜂鈴器發聲                                                                                                                                                           *
  167. ****************************************************************************************/
  168. void beep()
  169. {
  170.   unsigned char i;
  171.   for (i=0;i<255;i++)
  172.    {
  173.    delay(5);
  174.    BEEP=!BEEP;                 //BEEP取反
  175.    }
  176.   BEEP=1;                      //關閉蜂鳴器
  177. }
復制代碼


接線圖.jpg (96.94 KB, 下載次數: 66)

讀取鍵盤值

讀取鍵盤值

PS2局部原理圖.jpg (984.37 KB, 下載次數: 65)

PS2局部原理圖.jpg

PS2_數碼管顯示.rar

22.51 KB, 下載次數: 16, 下載積分: 黑幣 -5

PS2知識.doc

42.5 KB, 下載次數: 14, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区在线观看视频 | 国产真实乱对白精彩久久小说 | 免费一区 | 国产精品久久久久久久一区探花 | 国产精品成人久久久久 | 国产色婷婷精品综合在线播放 | 精品欧美一区二区三区精品久久 | 国产精品国色综合久久 | 日本精品裸体写真集在线观看 | 成人av一区 | 久久久久电影 | 国产伦精品一区二区三区视频金莲 | 嫩草视频在线免费观看 | 久久久久亚洲精品 | 久久久国产一区二区三区 | 亚洲精彩视频 | 中文字幕在线免费观看 | 亚洲精品久久久一区二区三区 | 日韩a视频 | 一区二区三区免费观看 | 欧美视频一级 | 成年视频在线观看 | 国内精品99| 国产日韩视频 | 成年人网站国产 | 国产91精品在线 | 国产资源网 | 97超碰免费| 人人干人人干人人干 | 久久精品成人热国产成 | 午夜久久久久久久久久一区二区 | 国产精品久久视频 | 国内精品久久久久 | 中文字幕一区二区三区四区五区 | 欧美一级淫片007 | 成人在线视频网址 | 国产精品久久久久久久免费大片 | 免费观看www | 性色在线 | 麻豆一区一区三区四区 | 东京av男人的天堂 |