ps2 协议:http://apps.hi.baidu.com/share/detail/15069948
/****************************************************************************************PS2 读电脑键盘实验           *
连接方法 : P0口与J12连接 拔开跳线帽用杜邦线连接左针与P3.2  右针与P1.6  连接       *
使用方法:  用外部中断读取PS2键盘的数据 并在数码管上显示,此程序只处理数字键盘。     **
其余按键功能用户可以自行扩展,为了程序简单便于阅读和学习,程序中没有使用奇偶校验,     *
校验程序请自行添加。            *              **
*****************************************************************************************/#include<REG52.h>       sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4; sbit BEEP = P1^5;sbit Key_Data = P1^6 ;   //定义键盘引脚
sbit Key_CLK = P3^2;     //使用外部中断/******************************************************************/
/*                    函数声明                                    */
/******************************************************************/
void Decode(unsigned char ScanCode);  //解码子程序
void delay(unsigned int i);      //函数声名
void display();
void beep();// 此表为 LED 的字模            // 0    1    2    3    4    5    6   7    8    9    A    b    c    d    E    -    L   P    U    Hidden  _ (20)
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 };
bit BF;
unsigned char KeyV;
unsigned char LedNumVal  ;
int KEY_val,IntNum;/******************************************************************/
/*                    主函数                                      */
/******************************************************************/
void main()
{IT1 = 0;                              //设外部中断1为低电平触发
EA = 1;                               //外部中断开
EX0 = 1;                              //开中断while(1){if (BF){  if (KeyV != 240)  beep();  Decode(KeyV); //解码}elseEA = 1; //开中断  display();}}/******************************************************************/
/*                    外部中断读入信息                            */
/******************************************************************/
void Keyboard_out(void) interrupt 0
{
if ((IntNum > 0) && (IntNum < 9)){ KeyV = KeyV >> 1;                //因键盘数据是低>>高,结合上一句所以右移一位if (Key_Data)KeyV = KeyV | 0x80;          //当键盘数据线为1时到最高位}IntNum++;while (!Key_CLK);                //等待PS/2CLK拉高if (IntNum > 10){ IntNum = 0;                  //当中断11次后表示一帧数据收完,清变量准备下一次接收BF = 1;                      //标识有字符输入完了EA = 0;                      //关中断等显示完后再开中断 }}/******************************************************************/
/*                    解码信息                                    */
/******************************************************************/
void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
{switch (ScanCode){case 0x70 :             // 当收到0xF0,Key_UP置1表示断码开始KEY_val = 0;break;case 0x69 :             KEY_val = 1;break;case 0x72 :             KEY_val = 2;break;case 0x7A :             KEY_val = 3;break;case 0x6B :             KEY_val = 4;break;case 0x73 :             KEY_val = 5;break;case 0x74 :             KEY_val = 6;break;case 0x6c :             KEY_val = 7;break;case 0x75 :             KEY_val = 8;break;case 0x7d :             KEY_val = 9;break;case 0x71 :// dot = 0X7F;break;}BF = 0; //标识字符处理完了
} /***************************************************************************************/
void display( )
{unsigned char i;unsigned int LedOut[8];LedNumVal = KEY_val ;LedOut[0]=Disp_Tab[LedNumVal%10000/1000];LedOut[1]=Disp_Tab[LedNumVal%1000/100];LedOut[2]=Disp_Tab[LedNumVal%100/10];LedOut[3]=Disp_Tab[LedNumVal%10];LedOut[4]=Disp_Tab[LedNumVal%10000/1000];    //千位LedOut[5]=Disp_Tab[LedNumVal%1000/100];  //百位带小数点LedOut[6]=Disp_Tab[LedNumVal%100/10];     //十位LedOut[7]=Disp_Tab[LedNumVal%10];             //个位for( i=0; i<8; i++) {  P0 = LedOut[i];switch(i)       {     case 0:LS138A=0; LS138B=0; LS138C=0; break;         case 1:LS138A=1; LS138B=0; LS138C=0; break;              case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(50);}}/***************************************************************************************
延时程序                      *
****************************************************************************************/
void delay(unsigned int i)
{char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);
}/***************************************************************************************
蜂铃器发声                      *
****************************************************************************************/
void beep()
{unsigned char i;for (i=0;i<255;i++){delay(5);BEEP=!BEEP;                 //BEEP取反} BEEP=1;                      //关闭蜂鸣器
}

PS2 读电脑键盘实验相关推荐

  1. 实验一. RFID自动读卡实验

    实验一. RFID自动读卡实验 实验目的 实验环境 实验内容 实验步骤 实验代码 1) 初始化MFRC531 2) 寻卡 硬件连接 编译.烧录并测试 实验结果 串口设置 实验目的 了解RFID相关知识 ...

  2. 51单片机PS2键盘解码实验--C51源代码

    //地址:http://www.jdgcs.org/wiki/Downloads #include <at89x51.h> #include "KBCODE.H" #d ...

  3. 关于MySQL幻读的实验

    该实验基于 CentOS 7 + MySQL 5.7 进行 打开两个窗口连接到MySQL 第一个连接的事务我们命名为  T1 第二个连接的事务我们命名为 T2 T2 发生在 T1 的 O1 操作结束以 ...

  4. 举例 | 轻松读懂“实验”与“试验”的区别

    1.实验和试验的英文翻译 实验:Experiment 试验:Test 2.实验和试验的定义 实验(experiment): 是一种通过实际操作来探究某自然或社会规律的一种研究方法,主要强调与理论研究的 ...

  5. UHF RFID 读卡实验

  6. B-ICE-EDA/SOPC FPGA创新电子教学实验平台

    简介:北京革新创展科技有限公司B-ICE IEELS系列创新教学实验平台目前主推Intel Cyclone IV/V系列,标准配置如下:主机B-ICE-EDA/SOPC,核心板可选GX-SOPC-EP ...

  7. 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--PS2解码(九)

    声明:本文转载于http://www.cnblogs.com/kingst,版权归akuei2及黑金动力社区(http://www.heijin.org)共同所有. 3.2 实验八:PS2解码 PS2 ...

  8. STM32的can现场总线实验心得

    最近在搞stm32实验板的can现场总线实验,之前只是搞过STC51的串口通信,相比之下,发觉can总线都挺复杂的.开始时,知道自己是新手,只知道can总线跟串行通信,485通信,I2C通信一样都是用 ...

  9. 单片机c语言数码显示实验报告,单片机动态显示技术实验报告.doc

    桂林电子科技大学 实验报告 开 课 单 位 适用年级.专业 机械 课 程 序 号 课 程 代 码 实 验 名 称 <动态显示技术> 动态显示技术实验报告 一.实验目的 1.掌握动态显示技术 ...

最新文章

  1. spark广播变量的原理_spark使用广播变量
  2. FPGA基础知识极简教程(6)UART通信与移位寄存器的应用
  3. html5 自定义属性data-*
  4. RE validation in Java EE
  5. 尽力去帮助一个陌生人
  6. 为什么现在还有很多人喜欢在银行存定期?
  7. 网站SEO域名、URL路径优化
  8. ichariot测试路由器有线转发性能
  9. [windows]JDK安装与环境变量配置
  10. qt qtableview 刷新列表_qt qtableview基本用法
  11. 桥接模式---Bridge
  12. Openwrt无线中继AP设置教程
  13. js:ajax的get方法实现简单的搜索框提示
  14. 吃什么怎么吃关系着民族的命运
  15. Lottie动画(二)Lottie动画制作
  16. 修改xcode字体大小(Mac)
  17. Latex将文中的某一行设置成左对齐、右对齐
  18. Android无法连接设备调试
  19. c语言十全十美游戏规则,十全十美游戏
  20. vue的mounted和created方法的执行

热门文章

  1. 社群营销——新的商业模式
  2. 手把手刷二叉树系列完结篇
  3. Python实现文件夹拷贝
  4. 跑步运动耳机哪个牌子好、适合运动的耳机
  5. linux服务器如何配置qq邮箱,linux用mail往qq邮箱发邮件
  6. jquery抽奖大转盘实例(插件思想)
  7. springboot 中配置Swagger2
  8. 查询分页的几种sql语句
  9. codeforces 496A Minimum Difficulty
  10. nginx服务器性能要求,服务器性能几何,看Nginx就够