PS2 读电脑键盘实验
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 读电脑键盘实验相关推荐
- 实验一. RFID自动读卡实验
实验一. RFID自动读卡实验 实验目的 实验环境 实验内容 实验步骤 实验代码 1) 初始化MFRC531 2) 寻卡 硬件连接 编译.烧录并测试 实验结果 串口设置 实验目的 了解RFID相关知识 ...
- 51单片机PS2键盘解码实验--C51源代码
//地址:http://www.jdgcs.org/wiki/Downloads #include <at89x51.h> #include "KBCODE.H" #d ...
- 关于MySQL幻读的实验
该实验基于 CentOS 7 + MySQL 5.7 进行 打开两个窗口连接到MySQL 第一个连接的事务我们命名为 T1 第二个连接的事务我们命名为 T2 T2 发生在 T1 的 O1 操作结束以 ...
- 举例 | 轻松读懂“实验”与“试验”的区别
1.实验和试验的英文翻译 实验:Experiment 试验:Test 2.实验和试验的定义 实验(experiment): 是一种通过实际操作来探究某自然或社会规律的一种研究方法,主要强调与理论研究的 ...
- UHF RFID 读卡实验
- B-ICE-EDA/SOPC FPGA创新电子教学实验平台
简介:北京革新创展科技有限公司B-ICE IEELS系列创新教学实验平台目前主推Intel Cyclone IV/V系列,标准配置如下:主机B-ICE-EDA/SOPC,核心板可选GX-SOPC-EP ...
- 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--PS2解码(九)
声明:本文转载于http://www.cnblogs.com/kingst,版权归akuei2及黑金动力社区(http://www.heijin.org)共同所有. 3.2 实验八:PS2解码 PS2 ...
- STM32的can现场总线实验心得
最近在搞stm32实验板的can现场总线实验,之前只是搞过STC51的串口通信,相比之下,发觉can总线都挺复杂的.开始时,知道自己是新手,只知道can总线跟串行通信,485通信,I2C通信一样都是用 ...
- 单片机c语言数码显示实验报告,单片机动态显示技术实验报告.doc
桂林电子科技大学 实验报告 开 课 单 位 适用年级.专业 机械 课 程 序 号 课 程 代 码 实 验 名 称 <动态显示技术> 动态显示技术实验报告 一.实验目的 1.掌握动态显示技术 ...
最新文章
- spark广播变量的原理_spark使用广播变量
- FPGA基础知识极简教程(6)UART通信与移位寄存器的应用
- html5 自定义属性data-*
- RE validation in Java EE
- 尽力去帮助一个陌生人
- 为什么现在还有很多人喜欢在银行存定期?
- 网站SEO域名、URL路径优化
- ichariot测试路由器有线转发性能
- [windows]JDK安装与环境变量配置
- qt qtableview 刷新列表_qt qtableview基本用法
- 桥接模式---Bridge
- Openwrt无线中继AP设置教程
- js:ajax的get方法实现简单的搜索框提示
- 吃什么怎么吃关系着民族的命运
- Lottie动画(二)Lottie动画制作
- 修改xcode字体大小(Mac)
- Latex将文中的某一行设置成左对齐、右对齐
- Android无法连接设备调试
- c语言十全十美游戏规则,十全十美游戏
- vue的mounted和created方法的执行