PS2接口键盘显示实验

合集下载

键盘显示程序设计实验

键盘显示程序设计实验

实验四键盘显示程序设计实验目的1、理解串行接口键盘单片机汇编语言程序的基本结构2、了解单片机汇编语言程序的设计和调试方法3、掌握几个的基本的传送类、控制类指令的使用方法实验仪器单片机开发板、万利仿真机、稳压电源、计算机实验原理1、键盘接口电路工作原理串行接口键盘盘电路如图4-15所示。

键盘扫描线与显示位选扫描信号共用。

键盘输入只需要一根线,电路简单。

键盘扫描信号从74LS164输出,低电平有效。

当扫描到某个键时,若按键按下,在KEY端得到低电平,否则得到高电平。

通过判断KEY的电平就可以知道相应键盘是否按下。

图4-15 键盘接口电路图2、读键盘程序设计从上面工作原理分析可知,读键程序可以和显示程序结合在一起,也可以单独设计。

这种结构的键盘同样存在抖动问题。

为了减少程序误动作,程序设计时也要考虑去抖动问题。

这里设计一个把键值显示在LED上的程序。

为了简化问题,把读键程序与显示结合起来。

程序流程图如图4-16所示。

图4-16 键盘扫描程序流程图实验内容1、设计程序把键值显示在数码管。

#include<reg52.h>#include"display.h"extern uchar point;extern uchar table[8];uchar t,temp,time;char num;bit flag1;/*void main(){uchar i;table[0]=0x0;for(i=1;i<8;i++)table[i]=0x11;while(1){num=dispkey();if(flag==1)table[0]=num;delay_1ms(2);}}*//************************************************************2、设计程序按不同键时实现不同功能。

功能:按向上键:最右边一位数码管数值加1(0-9),到9时加1回到0 按向下键:最右边一位数码管数值减加1(9-0),到0时减1回到9按向左键:显示数字左移一位按向右键:显示数字右移一位keypointr:短按小数点右移,长按显示学号;接口:上下左右keypointrkeypointl**************************************************************/ void main(){uchar i,j=7,k=0;for(i=0;i<8;i++)table[i]=0x11;TMOD=0x01;EA=1;TH0=(65536-20000)/256;TL0=(65536-20000)%256;ET0=1;TR0=1;table[7]=0x1;while(1){delay_1ms(5);temp=dispkey();switch(temp){case 5: if ( flag==0){num=++table[j];//加1if(num==10)num=0;table[j]=num;delay_1ms(1);}; flag=1; break;case 4:if ( flag==0){num=--table[j];//减1if(num==-1)num=9;table[j]=num;delay_1ms(1);};flag=1;break;case 2: if ( flag==0) //右移{if(j==7){table[0]=table[7];table[7]=0x11;j=0;continue;}table[j+1]=table[j];//左边赋给右边j++;table[j-1]=0x11;delay_1ms(1);//关闭左一位};flag=1;break;case 8:if ( flag==0){ //左移if(j==0){table[7]=table[0];table[0]=0x11;j=7;continue;}table[j-1]=table[j];//右边赋给左边j--;table[j+1]=0x11;delay_1ms(1);//关闭右一位};flag=1;break;case 1:if ( flag==0) //小数点右移{if(flag1==1){table[0]=0x9;table[1]=0x4;table[2]=0x0;table[3]=0x8;table[4]=0x1;table[5]=0x0;table[6]=0x3;table[7]=0x1;}else{if(k==7){ point=tablepoint[7];k=0;continue;}point=tablepoint[k];k++;delay_1ms(1);}};flag=1;break;default:flag=0; break;}}}void timer0() interrupt 1{TH0=(65536-20000)/256;TL0=(65536-20000)%256;t++;time++;if(temp==1){if(time==50){if(temp==1)flag1=1;time=0;}}}/*******************************************************显示函数*******************************************************///#define __DISPLAY_H__#include"display.h"uchar code disptable[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,0xfe,0xff};//0~F数码代码uchar code tablepoint[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 }; uchar point;uchar table[8];void delay_1ms(uchar z){uint x,y;for(x=z;x>0;x--)for(y=123;y>0;y--);}uchar dispkey(void){uchar i,keynum=0;i=8;DA T=disptable[table[i-1]];if(point&tablepoint[i-1])DA T=DA T&0xfe; //加入小数点DISPDIN =0;DISPCLK =0;DISPCLK =1;DISPDIN =1;delay_1ms(1);if(!key){delay_1ms(5);if(!key) keynum=i;}for (i=7;i>0;i--){DA T =0xff;DA T =disptable[table[i-1]];if(point&tablepoint[i-1])DA T=DA T&0xfe; //加入小数点DISPCLK =0;DISPCLK =1;delay_1ms(1);if(!key){delay_1ms(5);if(!key) keynum=i;}}DA T=0xff;return keynum;}思考题1、当按加1键时,每按一次数码管值变化可能超过1,是什么原因?答:原因是机械按键会有抖动现象,所以每按一次数码管值变化可能超过1。

实验(二十一)PS2键盘控制LCD12864显示

实验(二十一)PS2键盘控制LCD12864显示

华南理工大学无线电爱好者协会F D R 工作室实验二十一:PS2键盘控制LCD12864实验一. 实验目的:1. 认识ps2键盘协议2. 掌握12864液晶模块的使用方法。

3. 学会利用12864实现小型可视化图形界面 二. 实验原理:12864与单片机连接原理图12864跟ps2键盘的底层通讯较为复杂,我们在文件夹里提供了相应的资料给读者。

在此不再累述。

提醒读者一下:12864 驱动电流加大,使用时请先调lcd 座旁的蓝色可调电阻,使lcd 上能显示一个一个的小方格。

然后才能正常显示。

12864有并行跟串行两种通讯方式。

当psb 脚为高平时是并行,反之为串行。

华南理工大学F D R 工作室华南理工大学无线电爱好者协会F D R 工作室键盘要注意通码(按下键盘时发出)跟断码(松开键盘时发出)之间的联系。

三.硬件链接图:12864连线:如图所示的红线排针连到单片机各IO口,12864的几个控制脚都是连接在P0口上,从右到左依次是RS、RW、E、PSB、NC(我们提供的12864用不到该引脚)、RST,依次连接到P0^0,P0^1,P0^2,P0^3,P0^4,P0^5; 而数据线则直接接到P1口。

键盘连线:键盘的两条控制线在排针P7靠近红外接收头的两根上,最后一根是时钟线sclk,上边一根是数据线dat,将数据线接到单片机P3^2上靠近单片机一侧的排针上,将时钟线接到单片机INT1上。

12864连线图四.实验程序:#include<AT89X52.h>#include"led.h" //该头文件包含数码管显示数字驱动 #include"tg12864p.h"//该头文件包含lcd12864驱动sbit dat =P3^2;//DATA IN华南理工大学F D R 工作室华南理工大学无线电爱好者协会F D R 工作室#define uchar unsigned char // 即 uchar 等同与unsigned char #define uint unsigned int uchar sp2key_scan();/*****************常量声明区******************************************/ uchar code key_table[47]={'0','1','2','3','4','5','6','7','8','9', 'a','b','c','d','e','f','g','h','i','j', 'k','l','m','n','o','p','q','r','s','t', //说明:存放键盘上按键的as2码值 'u','v','w','x','y','z',' ','-','=',']', ';','"',',','.','/','[',' ' //作用:方便日后传值到液晶上 };/****************全局变量声明区************************************/ uchar key=0; //用于存放键盘解码函数的解码结果 uchar key_temp=0; bit BF=0; //接收到通码的标志位uchar key_count=0; //记录键盘传任一个数据时传来时钟脉冲个数 uchar key_buffer[5]={0,0,0,0,0};//接收键盘传来数据的缓冲区uchar key_num=0;//一个按键动作,键盘会发出通码,段吗,这用于记录收到编码个数。

FPGA实验十一 PS2键盘控制LCD显示实验

FPGA实验十一 PS2键盘控制LCD显示实验

高性能软件无线电平台X6-面向高性能SoC验证和科学仿真主要特性支持PCI Express® Gen2 ×8 (但IP另配)搭载DDR3 SDRAM SO-DIMM系统搭载FMC连接器,可使用大部分RocketI/O(GTX)利用FMC可选基板能够对应各种接口提供PCI Express和DMA等参考设计无限扩展行业应用下一代软件无线电平台微软研究院软件无线电(Sora)是一种新型基于PC 的可编程无线电平台架构。

Sora 结合了可编程性和通用处理器(GPP )平台的性能和灵活性,同时使用的硬件和软件技术,以满足高性能的无线通信算法的计算挑战。

Sora 平台提供 Soft WiFi 开源代码。

SoftWiFi 目前支持率的802.11a/b/g 全部协议,无缝地与商业802.11网卡实现互操作,并达到商业网卡相当的性能。

Sora 是第一平台真正的软件无线电平台,支持用户开发的802.11a/b/g ,如物理层和MAC ,软件完全是标准PC 架构。

典型应用: White Spaces Mobile Phones Public Safety Radio Land MobileBroadcast TV and FM Radio Satellite navigationCovers 6 Amateur Radio Bands 射频部分主要特性: Dull-duplex Transceiver50 MHz to 5.8 GHz coverage50-100mW (17-20dBm) from 50 MHz to 1.2 GHz 30-70mW (15-18dBm) from 1.2 GHz to 2.2 GHz25+ dB Output power control range under software control Receive Specs:Noise figure of 5-7 dBIIP3 of 5-10 dBm;IIP2 of 40-55 dBm全频带射频收发模块实验十一 PS/2键盘显示LCD 实验一 实验目的1掌握PS/2键盘控制端口协议;2通过编写程序实现PS/2键盘控制LCD 的显示。

9_PS2键盘实验

9_PS2键盘实验

广州致远电子有限公司
MagicARM270教学实验开发平台
3.实验内容
按照PS/2时序协议,不断地读取PS/2输出的键值,然 后通过串口发送到PC机显示。
广州致远电子有限公司
MagicARM270教学实验开发平台
4.实验预习要求
仔细阅读参考文献 [2] 第 24 节的 PXA27x 的 GPIO 模块说 明; 仔仔细阅读 <<MagicARM270 实验理论指导书 >> 第 2 章的 内容,了解MagicARM270实验箱的硬件结构,注意PS/2接 口电路。
MagicARM270教学实验开发平台
PS/2键盘实验
1.实验目的
掌掌握PS/2键盘接口时序协议,并读取键盘键值。
广州致远电子有限公司
MagicARM270教学实验开发平台
2.实验设备
硬件: PC机 1台 MagicARM270教学实验开发平台 1套 软件: Windows 98/2000/XP操作系统 ADS 1.2集成开发环境 超级终端程序(Windows系统自带)
广州致远电子有限公司
MagicARLeabharlann 270教学实验开发平台6.实验步骤
(10) 按MagicARM270实验箱的RST键复位系统,运行程 序,按 PS/2 键盘上的按键,观察 PC 机上的“超级终端” 主窗口是否显示出按键的键值 。
广州致远电子有限公司
MagicARM270教学实验开发平台
7.思考题
广州致远电子有限公司
MagicARM270教学实验开发平台
6.实验步骤
(6) 使 用 JFlashMM 软 件 将 flash.bin 烧 写 到 片 外 NOR FLASH ,操作方法请参考 <<MagicARM270 实验理论指导 书 >> 第 5 章“ ADS 集成开发环境应用及 JTAG 烧写方法” 的说明。 (7) 使用 PS/2 键盘插入 MagicARM270 实验箱的 CZ4 接口, 使用串口延长线把实验箱上的CZ1与PC机的COM1连接。 (8) 将 MagicARM270 实验箱上 SW1 的开关 1 拔到“ PS2” 端(即开关断开)。 (9) PC机上运行“超级终端”程序 ,设置串口波持率 为115200, 8位数据位,无奇偶校验位,1位停止位。

51单片机 PS2口电脑键盘输入液晶显示

51单片机 PS2口电脑键盘输入液晶显示

#include <reg52.h>sbit LCM_RS= P2^0;//定义LCD引脚sbit LCM_RW= P2^1;sbit LCM_E= P2^2;sbit Key_Data = P3^4; //定义Keyboard引脚sbit Key_CLK = P3^3;#define LCM_Data P0#define Busy 0x80 //用于检测LCM状态字中的Busy标识unsigned char code UnShifted[59][2] = {0x1C, 'a',0x32, 'b',0x21, 'c',0x23, 'd',0x24, 'e',0x2B, 'f',0x34, 'g',0x33, 'h',0x43, 'i',0x3B, 'j',0x42, 'k',0x4B, 'l',0x3A, 'm',0x31, 'n',0x44, 'o',0x4D, 'p',0x15, 'q',0x2D, 'r',0x1B, 's',0x2C, 't',0x3C, 'u',0x2A, 'v',0x1D, 'w',0x22, 'x',0x35, 'y',0x1A, 'z',0x45, '0',0x16, '1',0x1E, '2',0x26, '3',0x25, '4',0x2E, '5',0x36, '6',0x3D, '7',0x46, '9',0x0E, '`',0x4E, '-',0x55, '=',0x5D, '\\',0x29, ' ',0x54, '[',0x5B, ']',0x4C, ';',0x52, '\'',0x41, ',',0x49, '.',0x4A, '/',0x71, '.',0x70, '0',0x69, '1',0x72, '2',0x7A, '3',0x6B, '4',0x73, '5',0x74, '6',0x6C, '7',0x75, '8',0x7D, '9',};unsigned char code Shifted[59][2] = { 0x1C, 'A',0x32, 'B',0x21, 'C',0x23, 'D',0x24, 'E',0x2B, 'F',0x34, 'G',0x33, 'H',0x43, 'I',0x3B, 'J',0x42, 'K',0x4B, 'L',0x3A, 'M',0x31, 'N',0x44, 'O',0x4D, 'P',0x15, 'Q',0x1B, 'S',0x2C, 'T',0x3C, 'U',0x2A, 'V',0x1D, 'W',0x22, 'X',0x35, 'Y',0x1A, 'Z',0x45, '0',0x16, '1',0x1E, '2',0x26, '3',0x25, '4',0x2E, '5',0x36, '6',0x3D, '7',0x3E, '8',0x46, '9',0x0E, '~',0x4E, '_',0x55, '+',0x5D, '|',0x29, ' ',0x54, '{',0x5B, '}',0x4C, ':',0x52, '"',0x41, '<',0x49, '>',0x4A, '?',0x71, '.',0x70, '0',0x69, '1',0x72, '2',0x7A, '3',0x6B, '4',0x73, '5',0x74, '6',0x6C, '7',0x75, '8',0x7D, '9',};/*void Delay5Ms(void);void LCMInit(void);void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData);void Decode(unsigned char ScanCode);void WriteDataLCM(unsigned char WDLCM);void WriteCommandLCM(unsigned char WCLCM,BuysC);unsigned char ReadDataLCM(void);unsigned char ReadStatusLCM(void);*/unsigned char code cdle_net[] = {"1602LCD PS2 TEST"};unsigned char code email[] = {"fjbysj@"};unsigned char code Cls[] = {" "};static unsigned char IntNum = 0; //中断次数计数static unsigned char KeyV; //键值static unsigned char DisNum = 0; //显示用指针static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识static unsigned char BF = 0; //标识是否有字符被收到//5ms延时void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}//400ms延时void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--) {TempCycB=7269;while(TempCycB--); }}//读状态unsigned char ReadStatusLCM(void){ LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 1;while(LCM_Data & Busy); //检测忙信号return(LCM_Data);}//写数据{ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高可以在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}//写指令void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{ if(BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}/*//读数据unsigned char ReadDataLCM(void){ LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 1;return(LCM_Data);}*/void LCMInit(void) //LCM初始化{ LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();Delay5Ms();WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0F,1); // 显示开及光标设置}//按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if(Y)X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCM(X, 1); //发命令字WriteDataLCM(DData); //发数据}//按指定位置显示一串字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>0x19) {//若到达字串尾则退出if(X <= 0xF) {//X坐标应小于0xFDisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}void Keyboard_out(void) interrupt 2{if((IntNum > 0) && (IntNum < 9)) {KeyV >>= 1; //因键盘数据是低>>高,结合上一句所以右移一位if(Key_Data) {KeyV |= 0x80; //当键盘数据线为1时为1到最高位}}IntNum++;while(!Key_CLK); //等待PS/2CLK拉高if(IntNum > 10) {IntNum = 0; //当中断10次后表示一帧数据收完,清变量准备下一次接收BF = 1; //标识有字符输入完了EA = 0; //关中断等显示完后再开中断(注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声明为再入函数)}}void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码{unsigned char TempCyc;if(!Key_UP) { //当键盘松开时switch(ScanCode) {case 0xF0 : //当收到0xF0,Key_UP置1表示断码开始Key_UP = 1;break;case 0x12: // 左SHIFTShift = 1;break;case 0x59: // 右SHIFTShift = 1;break;default:if(DisNum > 15) {DisplayListChar(0,1,Cls); //清LCD第二行DisNum = 0;}if(Shift == 1) { //如果按下SHIFTfor(TempCyc = 0;(Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示if(Shifted[TempCyc][0] == ScanCode) {DisplayOneChar(DisNum,1,Shifted[TempCyc][1]);}DisNum++;}else { //没有按下SHIFTfor(TempCyc = 0; (UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59);TempCyc++); //查表显示if(UnShifted[TempCyc][0] == ScanCode) {DisplayOneChar(DisNum,1,UnShifted[TempCyc][1]);}DisNum++;}break;}}Key_UP = 0;switch(ScanCode) { //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理case 0x12: // 左SHIFTShift = 0;break;case 0x59: // 右SHIFTShift = 0;break;default:break;}}BF = 0; //标识字符处理完了}void KeyScan(void)/* 键盘扫描*/{unsigned char i,j,kv0,kv1,kv2,kv3,kv4,kvn,kvc,kvo,CLEAR;i = 0;j = 0;P1 = 0xEF;kv0=P1; /* 读入键值*/P1 = 0xDF;kv1=P1;P1 = 0xBF;kv2=P1;P1 = 0x7F;kv3=P1;P1 = 0xFF;kv4=P1;kvn = 0;for(i=0; i<4; i++) { /* 键值分析*/if((kv0&0x01)==0) {kvn = i*4 + 1;j++;}if((kv1&0x01)==0) {kvn = i*4 + 2;j++;}if((kv2&0x01)==0) {kvn = i*4 + 3;}if((kv3&0x01)==0) {kvn = i*4 + 4;j++;}if((kv4&0x01)==0) {kvn = 17 + i;j++;}kv0 /= 2;kv1 /= 2;kv2 /= 2;kv3 /= 2;kv4 /= 2;}if(j>1) {kvn = 0; /* 同时按下多键则键值无效*/}if(kvn==0) {kvc = 0;kvo = 0;}else { /* 若键值有效*/if(kvn==kvo) { /* 若键值与上次键值相同*/if(kvc<253)kvc++; /* 同键值计数延时*/if(kvc>2)kvn=0; /* 以前键值已有效,则本次无效*/ if(kvo == CLEAR) {if(kvc==20)kvn = 0x55; /* 连按清零键达120*10ms 则置全清*/ }}else { /* 若键值与上次键值不同*/ kvo = kvn; /* 记下键值*/kvc = 1;kvn = 0; /* 本次键值无效*/}}if(kvc==0) {kvn=0;}}void main(void){ unsigned char TempCyc;Delay400Ms(); //启动等待,等LCM讲入工作状态LCMInit(); //LCM初始化//Delay5Ms(); //延时片刻(可不要)DisplayListChar(0, 0, cdle_net);DisplayListChar(0, 1, email);//ReadDataLCM();//测试用句无意义for(TempCyc=0; TempCyc<10; TempCyc++) {Delay400Ms(); //延时}DisplayListChar(0, 1, Cls);IT1 = 0; //设外部中断1为低电平触发EX1 = 1; //开中断EA = 1;while(1) { KeyScan();if(BF)Decode(KeyV);else {EA = 1; //开中断}}}。

PS2键盘接口设计

PS2键盘接口设计

研究生课程设计报告课程名称:基于FPGA的现代数字系统设计设计名称: PS/2键盘接口设计姓名:学号:课程教师:起止日期: 2016,西南科技大学信息工程学院制设计任务书学生班级:学生姓名:学号:设计名称:PS/2键盘接口设计起止日期: 2016,12,21至2016,12,28 课程教师:设计题目一、设计目的和意义键盘是嵌入式系统的最重要的输入设备之一,是实现人机交互的重要途径。

除了可以自行设计扫描式矩阵键盘之外,还可以选择标准 PS/2键盘实现人机交互。

扫描式矩阵键盘虽然电路简单,但不具有通用性,当需要使用较多的按键输入时,则会占用较多的I/O 端口,在软件上则要进行上电复位、按键扫描及通信的处理,而且还要加上按键的去抖动处理,增大了系统软、硬件的开销,开发周期较长。

标准PS/2 键盘由于接口通信协议简单,在系统中占用软硬件资源少,高可靠性,表达信息量大而得到了越来越广泛的应用本设计根据PS/2键盘的通信时序,利用Verilog HDL硬件描述语言来设计PS/2接口键盘的输入识别电路,并在CPLD/FPGA上实现,避免了硬件电路的焊接与测试。

Verilog HDL语言满足数字系统设计和综合的所有要求,设计中充分运用Verilog HDL层次化与模块化的思想,使整个设计过程简单、灵活。

同时运用EDA工具ISE Design Suite10.1验证设计。

经过对系统进行编译、仿真、测试,完成把键盘按键扫描码转的通码的显示,成功实现PS/2接口键盘的输入识别及显示的功能。

本设计具有较好的通用性和可移植性,可取代自行设计扫描式矩阵键盘而用于许多嵌入式系统设计中。

二、设计原理1 PS/2模块1.1、SP/2键盘接口PS/2通信协议是一种双向同步串行通迅协议。

通迅的两端通过CLOCK(时钟信号端)同步,并通过DATA(数据端口)交换数据。

任何一方如果想要抑制另外一方的通迅时,只需要把CLOCK 拉到低电平。

实验25 PS2键盘实验

实验25 PS2键盘实验

实验 25 PS2 键盘实验在单片机系统中,经常使用的键盘都是专用键盘.此类键盘为单独设计制 作的,成本高、使用硬件连接线多,且可靠性不高,这一状况在那些要求键盘按键 较多的应用系统中更为突出.与此相比,在 PC 系统中广泛使用 PS/2 键盘具有价格 低、 通用可靠,且使用连接线少(仅使用 2 根信号线)的特点,并可满足多种系统的 要求.因此在单片机系统中应用 PS/2 键盘是一种很好的选择. 下面给出了一个在单片机上实现对 PS/2 键盘支持的硬件连接与驱动程序设计实 现.该设计实现了在单片机系统中对 PS/2 标准 104 键盘按键输入的支持.使用 Keil C51 开发的驱动程序接口和库函数可以方便地移植到其他单片机或嵌入式 系统中.所有程序在 Keil uVision2 上编译通过,在单片机 AT89s52 上测试通过. 协议: PS/2 协议: 目前,PC 机广泛采用的 PS/2 接口为 mini-DIN 6pin 的连接器,如图 1 所示:PS/2 设备有主从之分,主设备采用 Female 插座,从设备采用 Male 插头. 现在广泛使用的 PS/2 键盘鼠标均在从设备方式下工作.PS/2 接口的时钟与数据 线都是集电极开路结构,必须外接上拉电阻(一般上拉电阻设置在主设备中).主 从设备之间数据通信采用双向同步串行方式传输,时钟信号由从设备产生。

1.1 从设备到主设备的通信当从设备向主设备发送数据时,首先检查时钟线,以确认时钟线是否为高电 平.如果是高电平,从设备就可以开始传输数据;反之,从设备要等待获得总线的 控制权,才能开始传输数据.传输的每一帧由 11 位组成,发送时序及每一位的含 义如图 2 所示:每一帧数据中开始位总是为 0,数据校验采用奇校验方式,停止位始终为 1. 从设备到主设备通信时,从设备总是在时钟线为高时改变数据线状态,主设备在 时钟下降沿读人数据线状态。

1.2 主设备到从设备的通信 主设备与从设备进行通信时,主设备首先将时钟线和数据线设置为“请求 发送”状态,具体方式为:首先下拉时钟线至少 100us 抑制通信,然后下拉数据线 “请求发送”,最后释放时钟线.在此过程中,从设备在不超过 10us 的间隔内必 须检查这个状态,当设备检测到这个状态时,它将开始产生时钟信号.此时数据传 输的每一帧由 12 位构成,其时序和每一位含义如图 3 所示:与从设备到主设备通信相比,其每帧数据多了一个 ACK 位.这是从设备应答接收到字节的应答位,由从 设备通过拉低数据线产生,应答位 ACK 总是为 0.主设备到从设备通信过程中,主设备总是在时钟线为低电平时改变数据线的状态,从设备在时钟上升沿读人数据线状态. 2、PS/2 键盘的编码与命令集 2.1 PS/2 键盘的编码 目前,PC 机使用的 PS/2 键盘都默认采用第 2 套扫描码集.扫描码有两种不同的类型:“通码(make code)”和“断码(break code)”.当一个键被按下或持续按住时,键盘会将该键的通码发送给主机;而当一 个键被释放时,键盘会将该键的断码发送给主机.根据键盘按键扫描码的不同,可将按键分为 3 类: 第 1 类按键 第 2 类按键 通码为一个字节,断码为 0xF0+通码形式.如 A 键,其通码为 0x1C;断码为 0xF0 0x1C. 通码为两字节 0xE0+0xXX 形式,断码为 0xE0+0xF0+0xXX 形式.如 Right Ctrl 键,其通码为0xE0 0x14;断码为 0xE0 0xF0 0x14. 第 3 类特殊按键 有两个,Print Screen 键,其通码为 0xE0 0x12 0xE0 0x7C;断码为 0xE0 0xF0 0x7C 0xE00xF0 0x12.Pause 键,其通码为 0xE1 0x14 0x77 0xE1 0xF0 0xl4 0xF0 0x77;断码为空. 组合按键扫描码的发送是按照按键发生的次序,如按下面顺序按左 Shift 十 A 键:① 按下左 Shift 键;② 按下 A 键;③ 释放 A 键;④ 释放左 Shift 键,那么计算机上接收到的一串数据为 0x12 0x1C 0xF0 0x1C 0xF0 0x12.PS2 键盘的硬件原理图,3 脚,5 脚已经连 接到 单片机的 P3.4,P3.3PS2 实验照片,把程序烧写后, 把计算机的键盘插 入 XL2000 的 JP81,液晶屏的 JP41 所有跳线帽全部插入,按电脑键盘 则有相应的显示。

PS2接口键盘显示实验

PS2接口键盘显示实验

PS2接口键盘显示实验一、实验目的1、学习用FPGA设计简单通信协议的方法。

2、学习PS2的工作原理,扫描码的ASCII码的转换。

3、掌握VHDL编写中的一些小技巧。

二、实验原理PS2通信协议是一种双向同步串行通迅协议。

通迅的两端通过CLOCK(时钟信号端)同步,并通过DATA(数据端口)交换数据。

任何一方如果想要抑制另外一方的通迅时,只需要把CLOCK拉到低电平。

PS2标准,规范每笔数据传输包含起始位(start bit)、扫描码(scan code)、奇同位检查(odd parity)、以及终止位(stop bit)共计11位,并以双向串行数据传输的方式,达到通信的目的。

且当主机端(host)或从机端(slave)并无传送或接收数据时,数据传输端口及频率均将升为高电位。

图21-1所示为每一笔数据传输所包含之内容如下:1.起始位(“0”)2.8位数据宽度的扫描码( scan code )。

3.奇同位检查,使扫描码与奇同位加起来1的数字为奇数个。

4.终止位(“1”)图21-1 PS2 串行传输标准Male(Plug)Female(Socket)6-pin Mini-DIN (PS2):1 - Data2 - Not Implemented3 - Ground4 - Vcc (+5V)5 - Clock6 - Not Implemented 图21-2 PS2 端口脚位定义PS2控制接口仅使用到两条传输端口,一为频率端口,另一则为数据端口如图21-2所示,且此传输埠必为三态(Tri-State)并具有双向(bidirectional)特性。

PS2 传输产品上,常见为鼠标与键盘,两者的驱动原理均相同,仅扫描码(scan code)不同。

因此我们以PS2键盘为例进行说明。

键盘其实就是一个大型的按键矩阵,它们由安装在电路板上的处理器(叫做“键盘编码器”)来监视着。

虽然不同的键盘可能采用不同的处理器,但是它们完成的任务都是一样的,即监视哪些按键被按下,哪些按键被释放了,并将这些信息传送到主机。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PS2接口键盘显示实验一、实验目的1、学习用FPGA设计简单通信协议的方法。

2、学习PS2的工作原理,扫描码的ASCII码的转换。

3、掌握VHDL编写中的一些小技巧。

二、实验原理PS2通信协议是一种双向同步串行通迅协议。

通迅的两端通过CLOCK(时钟信号端)同步,并通过DATA(数据端口)交换数据。

任何一方如果想要抑制另外一方的通迅时,只需要把CLOCK拉到低电平。

PS2标准,规范每笔数据传输包含起始位(start bit)、扫描码(scan code)、奇同位检查(odd parity)、以及终止位(stop bit)共计11位,并以双向串行数据传输的方式,达到通信的目的。

且当主机端(host)或从机端(slave)并无传送或接收数据时,数据传输端口及频率均将升为高电位。

图21-1所示为每一笔数据传输所包含之内容如下:1.起始位(“0”)2.8位数据宽度的扫描码( scan code )。

3.奇同位检查,使扫描码与奇同位加起来1的数字为奇数个。

4.终止位(“1”)图21-1 PS2 串行传输标准Male(Plug)Female(Socket)6-pin Mini-DIN (PS2):1 - Data2 - Not Implemented3 - Ground4 - Vcc (+5V)5 - Clock6 - Not Implemented 图21-2 PS2 端口脚位定义PS2控制接口仅使用到两条传输端口,一为频率端口,另一则为数据端口如图21-2所示,且此传输埠必为三态(Tri-State)并具有双向(bidirectional)特性。

PS2 传输产品上,常见为鼠标与键盘,两者的驱动原理均相同,仅扫描码(scan code)不同。

因此我们以PS2键盘为例进行说明。

键盘其实就是一个大型的按键矩阵,它们由安装在电路板上的处理器(叫做“键盘编码器”)来监视着。

虽然不同的键盘可能采用不同的处理器,但是它们完成的任务都是一样的,即监视哪些按键被按下,哪些按键被释放了,并将这些信息传送到主机。

如果有必要,处理器处理所有的去抖动,并在它的16字节的缓冲区里缓冲数据。

主机端包含了一个“键盘控制器”与键盘处理器进行通讯,并解码来自键盘处理器的信息,然后高速系统当前按键对应的处理事情。

主机与键盘之间的通讯仍旧采用IBM的协议。

键盘处理器花费很多时间来扫描或监视按键矩阵。

如果发现有按键按下、释放或长按,键盘就发送“扫描码”的信息到主机。

扫描码有两种不同的类型:“通码”和“断码”。

当一个键被按下去或长按的时候,键盘就发送通码;当一个键被释放的时候,键盘就发送断码。

每个键盘被分配了唯一的通码和断码,这样主机通过查找唯一的扫描码就可以确定是哪个按键被按下或释放。

每个键一整套的通断码组成了“扫描码集”,现在所有的键盘都采用第二套扫描码。

由于没有一个简单的公式可以计算扫描码,所以要知道某个特定按键的通码和断码,只能采用查表的方法来获得。

需要特别注意的是,按键的通码值表示键盘上的一个按键,并不表示印刷在按键上的那个字符,这就意味着通码和ASCII码之间没有任何关联。

另外,第二套通码都只有一个字节宽,但也有少数“扩展按键”的通码是两字节或四字节宽,这类码的第一个字节总是0xE0。

与通码一样,每个按键在释放的时候,键盘就会发送一个断码。

每个键也都有它自己的唯一的断码,不过庆幸的是,断码与断码之间存在着必然的联系。

多数第二套断码有两个字长,它们的第一个字节是0xF0,第二个字节就是对应按键的通码。

扩展按键的断码通常有三个字节,前两个字节0xE0和0xF0,最后一个字节是这个按键通码的最后一个字节。

表21-1列出了键盘按键的通码和断码。

PS2 键盘扫描码键值通码断码键值通码断码键值通码断码A 1C F0,1C 9 46 F0,46 [ 54 F0,54INSERT67 F0,67B 32 F0,32 ` 0E F0,0EHOME 6E F0,6EC 21 F0,21 - 4E F0,4EPG UP 6F F0,6FD 23 F0,23 = 55 F0,55DELETE64 F0,64F0,5CE 24 F0,24 \ 5CBKSP 66 F0,66 END 65 F0,65F 2B F0,2BG 34 F0,34 SPACE 29 F0,29 PG DN 6D F0,6DH 33 F0,33 TAB 0D F0,0DU ARROW 63 F0,63 I 43 F0,48 CAPS 14 F0,14 L ARROW 61F0,61J 3B F0,3B L SHFT12F0,12D ARROW60 F0,60K 42 F0,42 L CTRL 11 F0,11 R ARROW6A F0,6AL 4B F0,4B L WIN 8B F0,8B NUM 76 F0,76 M 3A F0,3A L ALT 19 F0,19 KP / 4A F0,4A N 31 F0,31 R SHFT 59 F0,59 KP * 7E F0,7E O 44 F0,44 R CTRL 58 F0,58 KP - 4E F0,4E P 4D F0,4D R WIN 8C F0,8C KP + 7C F0,7C Q 15 F0,15 R ALT39F0,39KP EN79 F0,79 R 2D F0,2D APPS 8D F0,8D KP . 71 F0,71 S 1B F0,1B ENTER5A F0,5A KP 070 F0,70 T 2C F0,2C ESC 08 F0,08 KP 1 69 F0,69 U 3C F0,3C F1 07 F0,07 KP 2 72 F0,72 V 2A F0,2A F2 0F F0,0F KP 3 7A F0,7A W 1D F0,1D F3 17 F0,17 KP 4 6B F0,6B X 22 F0,22 F4 1F F0,1F KP 5 73 F0,73 Y 35 F0,35 F5 27 F0,27 KP 6 74 F0,74 Z 1A F0,1A F6 2F F0,2F KP 7 6C F0,6C 0 45 F0,45 F7 37 F0,37 KP 8 75 F0,75 1 16 F0,16 F8 3F F0,3F KP 97DF0,7D2 1E F0,1E F9 47 F0,47 ] 5B F0,5B3 26 F0,26 F10 4F F0,4F ; 4C F0,4C4 25 F0,25 F11 56 F0,56 ' 52 F0,52 5 2E F0,2E F12 5E F0,5E , 41 F0,41 6 36 F0,36PRNT SCRN 57F0,57. 49 F0,497 3D F0,3D SCROLL 5F F0,5F / 4A F0,4A 8 3E F0,3E PAUSE62 F0,62表21-1PS2 键盘扫描码三、实验内容本实验的任务就是利用PS2接口将键盘按键的通码在数码管上显示出来。

实验箱中用到PS2键盘接口与FPGA的接口电路如图21-3所示。

其与FPGA的管脚连接请参照用户使用手册附表二。

图21-3 PS2键盘接口电路图四、实验步骤1、打开QUARTUSII软件,新建一个工程。

2、建完工程之后,再新建一个VHDL File,打开VHDL编辑器对话框。

3、按照实验原理和自己的想法,在VHDL编辑窗口编写VHDL程序,用户可参照光盘中提供的示例程序。

示例程序共提供2个VHDL源程序和一个PLL。

每一个源程序完成一定的功能。

其具体的功能如下表21-3所示:文件名称完成功能keyboard.VHD PS2键盘控制器电路设计。

DISPLAY.VHD 七段显示器译码电路设计。

PLL25 提供25M时钟信号表21-3 示例程序功能表4、编写完VHDL程序后,保存起来。

方法同实验一。

5、将自己编写的VHDL程序进行编译并生成模块符号文件,并对程序的错误进行修改,最终所有程序通过编译并生成模块符号文件。

其具体方法请参照实验六。

6、新建一个图形编辑文件,将已生成的模块符号文件放入其中,并根据要求边接起来。

7、将自己编辑好的的程序进行编译仿真,并对程序的错误进行修改,最终通过编译。

8、编译仿真无误后,依照拨动开关、LED与FPGA的管脚连接表或参照用户手册附录表二进行管脚分配。

分配完成后,再进行全编译一次,以使管脚分配生效。

9、用下载电缆通过JTAG口将对应的sof文件加载到FPGA中。

观察实验结果是否与自己的编程思想一致。

五、 实验结果与现象以设计的参考示例为例,将PS2接口的键盘接入PS2接口内。

当设计文件加载到目标器件后,按下PS2键盘上的键,则在实验平台的八位数码管上的中间两位将显示被按键的扫描码。

观察其按下的键值所对应的扫描码是否与表21-1一一对应。

按下复位键则停止对键盘的扫描,数码管上的扫描码不会发生改变。

六、 实验报告1、绘出仿真波形,并作说明。

2、将实验原理、设计过程、编译仿真波形和分析结果、硬件测试结果记录下来。

相关文档
最新文档