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. 当我们在谈深度学习时,到底在谈论什么(二)--转
  2. Visual Studio 2013开发 mini-filter driver step by step (2) - 编译,部署,运行
  3. tomcat上部署CGI
  4. Java 反射 mdc失效,log4j中MDC使用陷阱
  5. 【转】使用CSS 禁止文本选择
  6. Javascript实践-去除数组的重复元素
  7. mysql vc调用时内存错误
  8. Android mc怎么和win10联机,大更新!我的世界手机版/win10版联机完美互通
  9. 渗透测试工程师面试题大全(一)
  10. windows系统镜像修复计算机,为你详解win7系统还原及映像修复功能
  11. 手把手教你用Python分析微信聊天内容
  12. 【回文串问题】分割回文串
  13. 本地配置多个 Git 账户信息,满足不同的 Git 平台
  14. Ubuntu14.04 使用本地摄像头跑ORB SLAM2
  15. 鸿蒙系统敏感应用,鸿蒙系统特性“揭晓”!一次开发灵活使用,生态构建难题被解决?...
  16. swagger knife4j 解决接口下载文件响应乱码问题
  17. 开了留言,欢迎关注我的公众号【bigsai】唠唠嗑
  18. 电子合同渐成主流,君子签以区块链技术打造合同签约新生态
  19. Virginia(维吉尼亚)无密钥解密
  20. 陶瓷充电电池行业研究及十四五规划分析报告

热门文章

  1. WPF_MVVM实现Command绑定获取事件参数EventArgs
  2. Python 三维数组升为四维数组
  3. Linux中查看系统版本(内核和发行)、CPU信息以及修改主机名
  4. 同步异步半同步分离式通信
  5. 那辆开了三年的车成了你真正的家
  6. python递归实现二分查找_python二分查找算法的递归实现方法
  7. 【Android 逆向】x86 汇编 ( 使用 IDA 解析 x86 架构的动态库文件 | x86 汇编语言分析 )
  8. 施密特触发器运算放大电路
  9. riscv引导程序及仿真记录
  10. 6大服务网格工具比较