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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
ID:487236 發表于 2019-8-7 20:50 | 顯示全部樓層 |閱讀模式
  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. }
復制代碼


讀取鍵盤值

讀取鍵盤值
PS2局部原理圖.jpg

PS2_數碼管顯示.rar

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

PS2知識.doc

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

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲福利| 国产欧美久久精品 | 国产日韩精品视频 | 国产中文区二幕区2012 | 精品在线99 | 一区二区在线 | 在线播放国产一区二区三区 | 午夜伦理影院 | 日韩中文字幕在线免费 | 亚洲午夜网 | 亚洲欧美一区二区三区国产精品 | 日韩黄色免费 | 黄色大片在线视频 | 午夜成人免费视频 | 亚洲精品9999 | 黄色免费在线观看网址 | 国产精品久久免费观看 | 91福利在线观看视频 | 日韩不卡一区二区三区 | 国产午夜视频 | 日本成人综合 | 99日韩 | 精品一区二区电影 | 国产精品99久久久久久久久 | 精品国产欧美一区二区 | 国产精品亚洲精品日韩已方 | 一级黄色片网址 | 日韩电影中文字幕 | 欧美久久久久久 | 久久精品日产第一区二区三区 | 欧美日本一区 | 亚洲国产成人精品女人久久久野战 | 毛片区| 亚洲精品二区 | 亚洲欧美视频 | 国产91av视频| 久久69精品久久久久久久电影好 | 99精品99 | 亚洲国产精品一区二区第一页 | 日韩一级精品视频在线观看 | 日本免费在线 |