`
20386053
  • 浏览: 461958 次
文章分类
社区版块
存档分类
最新评论

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); //解码
    
   }
    else
      EA = 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键盘解码基础实验与串口通信进阶实验

    在本实验中,我们主要探讨了两个核心主题:PS2键盘解码基础实验以及串口通信的进阶实验。这两个实验都是围绕着如何处理和传输来自PS2键盘的数据展开的。 首先,基础实验关注的是PS2键盘解码。PS2键盘通过PS2接口与...

    PS2-keyboard-reading-test.rar_reading

    在压缩包中的文件“PS2 读电脑键盘实验”,很可能是包含源代码、文档或者硬件配置信息的文件,用于指导实验的执行。这些文件可能包括C语言或汇编语言的代码示例,详细解释了如何编写中断服务例程,以及如何与PS/2...

    ps2键盘驱动 fpga

    PS2键盘是早期个人电脑上常见的输入设备接口,尽管现在已被USB接口取代,但在学习和实验环境中仍然有其价值。 首先,我们需要理解PS2键盘的工作原理。PS2键盘通过一个6线连接器与主机通信,其中数据线用于传输按键...

    PS2摇杆实验_Arduino配套实验程序_

    1. **PS2接口**:PS2是电脑上的一个古老但通用的接口,最初用于连接键盘和鼠标。这里我们使用它来连接PS2游戏手柄。PS2接口传输的是串行数据,需要理解串行通信的基本原理。 2. **PS2协议解析**:手柄通过PS2接口...

    基于verilog的PS2键盘设计进阶

    本篇文章将深入探讨如何利用Verilog进行PS2(Personal System/2)键盘的设计,这是一种常见于早期个人电脑的接口技术,尽管现在已经被USB取代,但在FPGA(Field-Programmable Gate Array)学习和应用中,PS2键盘仍然...

    ps2键盘LCD1602液晶显示

    首先,PS/2键盘是一种标准的计算机输入设备,广泛用于个人电脑上。它通过PS/2接口与主机通信,发送按键信号。键盘的信号处理通常由控制器完成,该控制器解析按键编码,并将其转化为可识别的ASCII码或扫描码。在本...

    单片机源码学习参考-PS2键盘输入1602液晶显示.zip

    PS2是个人电脑上早期的标准键盘和鼠标接口,虽然现在已经被USB接口取代,但在单片机领域中,由于其简单易用和成本低廉,PS2接口仍然被广泛应用。PS2键盘与单片机的通信通常是通过中断方式实现的,单片机通过读取特定...

    基于51的PS2鼠标检测实验

    PS2接口则是早期个人电脑上常见的外设连接方式,用于连接键盘和鼠标。 首先,我们需要理解51单片机的工作原理。51系列单片机由Intel公司开发,采用8位CPU,内置ROM、RAM和I/O端口,具有丰富的指令集和较低的硬件...

    实战训练12 基于verilog的PS2键盘设计进阶_fpga_

    PS2键盘是早期个人电脑广泛使用的输入设备,尽管现在已经被USB键盘取代,但其简单、实用的特性仍使其在教学和实验中占有一席之地。 首先,我们需要了解Verilog,这是一种硬件描述语言(HDL),用于描述数字系统的...

    AVR单片机解码普通PC键盘码值,解码后通过串口发送到电脑上显示

    7. 实际应用:这样的系统可以用于开发自定义的输入设备,例如特殊的键盘或控制面板,或者用于教学和实验目的,帮助学生理解和实践单片机与PC之间的通信。 8. ps2--可用:这个文件可能是项目中使用的PS/2键盘解码的...

    基于ARM7开发平台设计的PS2鼠标

    PS2接口是早期个人电脑中常见的外设接口,用于连接键盘和鼠标,尽管现在已经被USB接口取代,但在某些特定场景和老旧系统中,PS2接口仍有其应用价值。 首先,理解PS2协议是关键。PS2协议是一种简单的同步串行通信...

    单片机C语言实例--259-ps2键盘LCD1602液晶显示.zip

    1. **PS/2键盘接口**:PS/2键盘是早期个人电脑常用的键盘接口,其数据传输采用串行方式,有6根线连接,包括数据线、时钟线、电源线等。在这个实例中,单片机需要通过解析接收到的PS/2键盘的扫描码来识别按键动作。 ...

    verilog PS2 源程序

    PS/2键盘接口是IBM个人电脑上的一种标准接口,用于连接键盘和鼠标。它使用串行通信协议,尽管速度较慢,但因其简单性和可靠性,在许多嵌入式系统中仍然被使用。这个实验的目标是读取通过PS/2接口发送的键盘按键信号...

    佷好的键盘控制资料已经调试过了

    PS2(Personal System/2)是IBM在1987年推出的一种接口标准,最初用于连接鼠标和键盘到个人电脑。尽管现在已经被USB接口广泛取代,但在某些嵌入式系统和老式设备中,PS2接口仍然常见。 首先,我们需要了解PS2键盘...

    VHDL课程设计PS键盘.docx

    实验设备包括个人电脑、QuartusII软件和基于Cyclone II的EP2C5Q208C8 FPGA实验开发系统。 在PS2解码方案中,学生将针对PS2接口的1脚(数据脚)和5脚(时钟脚)编写VHDL代码。解码的关键在于正确处理数据传输的时序...

    VHDL课程设计PS键盘.pdf

    VHDL课程设计的目标是让学生深入理解并...实验所需设备包括个人电脑、QuartusII软件以及配备Cyclone II EP2C5Q208C8芯片的FPGA实验开发系统。通过这样的实践,学生不仅能够掌握EDA技术,还能培养实际的硬件开发能力。

    基于FPGA设计的贪吃蛇小游戏实验课程设计报告+quartus9.1工程源码.zip

    基于FPGA设计的贪吃蛇小游戏实验课程设计报告+quartus9.1工程源码,可以做为你的学习设计参考。 摘 要 本次电子技术基础课程设计了贪吃蛇游戏,实现了用FPGA来驱动VGA显示贪吃蛇游戏。贪吃蛇的游戏规则是玩家使用PS2...

    ALIENTEK MINISTM32 PS2 Mouse

    在ALIENTEK MINISTM32 PS2鼠标实验中,我们将学习如何利用STM32的GPIO引脚模拟PS/2协议,与PS/2鼠标进行通信。 首先,我们要了解PS/2协议的基本结构。该协议是同步的,由主机发起命令并接收来自鼠标的响应。它包括...

    单片机入门实验(强烈推荐)

    - **实验25**:PS2键盘实验。学习如何与外部设备进行交互。 - **实验26**:SD卡SPI模式实验。掌握高速串行接口的使用。 - **实验27**:485通信实验。深入了解RS-485总线的应用。 - **实验28**:12864液晶显示屏显示A...

    北京博创2410开发板WINCE实验指导书

    本实验指导如何实现鼠标和小键盘的驱动程序,让这些外围设备能够与WINCE系统通信。 #### 3.4 WINCE下PS2键盘驱动程序设计 介绍如何在WINCE操作系统上设计和实现PS2键盘的驱动程序。 #### 3.5 WINCE系统触摸屏实验 ...

Global site tag (gtag.js) - Google Analytics