找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1685|回复: 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 单片机教程网

快速回复 返回顶部 返回列表