键盘解码程序.docx

上传人:b****3 文档编号:2907225 上传时间:2022-11-16 格式:DOCX 页数:16 大小:23.35KB
下载 相关 举报
键盘解码程序.docx_第1页
第1页 / 共16页
键盘解码程序.docx_第2页
第2页 / 共16页
键盘解码程序.docx_第3页
第3页 / 共16页
键盘解码程序.docx_第4页
第4页 / 共16页
键盘解码程序.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

键盘解码程序.docx

《键盘解码程序.docx》由会员分享,可在线阅读,更多相关《键盘解码程序.docx(16页珍藏版)》请在冰豆网上搜索。

键盘解码程序.docx

键盘解码程序

PS2键盘解码程序

实测可以使用

但一直搞不懂如何写入键盘。

就是不知道如何通过单片机控制键盘的Caps Lock 、Num Lock 灯的亮灭,希望大虾指点指点。

感谢!

=====================================C文件======================================================== 

#include   

#include "scancodes.h"

#include "ps2kbd.h"

#include "delay.h"

//#include "LCD1602.h"  

/*-----------------------------------------------

  名称:

PS2键盘驱动程序

  日期:

2010.11

  修改:

  内容:

通过单片机读/写PS2键盘

  备注:

本程序需使用外部中断口

------------------------------------------------*/

//---------IO引脚宏定义---------//

sbit Key_Data = P3^0 ;   //定义Keyboard引脚

sbit Key_CLK = P3^2;      //使用中断

 

//-----结构体------//

//--标识特殊按键---//

static struct key_sign

{          

 char Shift:

1;        //上档键

 char CapsLock:

1;  //大小写

 char NumLock:

1;  //小键盘锁

}Button;  

//-----标志----//

bit BF; //解码完毕标志

bit Key_UP;              //定义通码断码标志

bit E0Key=0; //E0开头的键盘码

bit Paritycheck=1; //奇偶校验标志

unsigned char KeyV; //键值

unsigned char IntNum; //中断次数

/******************************************************************/

/*                    函数声明                                    */

/******************************************************************/

void Decode(unsigned char ScanCode);  //解码子程序

void keyVcache(unsigned char keyV);  //键值入口,keyV就是解码后返回的键码

void Keyboard_WRITE(unsigned char sentchar);  //写一字节到PS2键盘  

/*-----------------------------------------------

  名称:

主机读取PS2键盘一字节

  日期:

2010.11

  修改:

  内容:

读取PS2键盘返回值(未解码),外部中断法

  备注:

键值存KeyV

------------------------------------------------*/

void Keyboard_READ(void) interrupt 0

{

if((IntNum > 0) && (IntNum < 9))

   { 

KeyV >>= 1;                //因键盘数据是低>>高,结合上一句所以右移一位

if (Key_Data)

{

     KeyV |= 0x80;             //当键盘数据线为1时到最高位 

 Paritycheck=~Paritycheck; //奇偶校验位,数据奇数1为0

};

   };           

if(IntNum==9)

  {

   if(Key_Data!

=Paritycheck)

     {

      KeyV=0x00;    //奇偶校验错误,清空数据

     };

  }; 

  IntNum++; 

while (!

Key_CLK);     //等待PS/2CLK拉高

if(IntNum > 10)

  { 

   IntNum = 0;                  //当中断11次后表示一帧数据收完,清变量准备下一次接收

   BF = 1;                      //标识有字符输入完了

   EA = 0;                      //关中断等显示完后再开中断

   Paritycheck=1; //一次接收接收,初始化奇偶校验位

  }; 

}

/*-----------------------------------------------

  名称:

PS2键盘解码

  日期:

2010.11

  修改:

  内容:

解码键盘返回值

  传入:

ScanCode 键盘返回值

  传出:

  相关寄存器:

BF,Shift,CapsLock,NumLock,Key_UP,E0_Key

------------------------------------------------*/

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 :

             // 左 SHIFT

Button.Shift = 1;

break;

case 0x58 :

// CapsLock键

    Button.CapsLock = ~Button.CapsLock;

break;

case 0x59 :

             // 右 SHIFT

Button.Shift = 1;

break;

case 0x77 :

// 小键盘锁

    Button.NumLock = ~Button.NumLock;

break;

case 0xe0 :

// 以E0开头的键码

    E0Key = 1;

break;

case 0xFA :

    // 键盘应答信号

    break;

default:

   /*如果数据不是F0,E0或LOCK键,则进行:

查表对比键盘码,输出键值*/

    

if(Button.Shift)           // 如果SHIFT按下

{

for (TempCyc = 0;(kbdasciicode[TempCyc][0]!

=ScanCode)&&(TempCyc<49); TempCyc++); //查表显示

if (kbdasciicode[TempCyc][0] == ScanCode)

{  

keyVcache(kbdasciicode[TempCyc][2]);  //返回大写字母或第二功能键值

break;

     };  

                     } 

else                // 没有按下SHIFT

                    {

for(TempCyc = 0; (kbdasciicode[TempCyc][0]!

=ScanCode)&&(TempCyc<49); TempCyc++); //查表显示

if (kbdasciicode[TempCyc][0] == ScanCode)

                       {

    if(Button.CapsLock&(TempCyc<27))// 如果CapsLock有效且按下字母键

{

  keyVcache(kbdasciicode[TempCyc][2]); // 返回大写字母键值

}

else

{

keyVcache(kbdasciicode[TempCyc][1]); // 否则返回小写或第一功能键值

};

break;

     };

                    };

//带E0开头类按键 查表

if(E0Key)          //如果属于E0开头的键盘码

{

E0Key=0;

for (TempCyc = 0;(E0startedcode[TempCyc][0]!

=ScanCode)&&(TempCyc<18); TempCyc++); //查表显示

if (E0startedcode[TempCyc][0] == ScanCode)

{

   keyVcache(E0startedcode[TempCyc][1]); 

break;

     };

  

                     };

//控制类键以及小键盘按键 查表

   for(TempCyc = 0; (kbdcontrolcode[TempCyc][0]!

=ScanCode)&&(TempCyc<37); TempCyc++); //查表显示

  {

if (kbdcontrolcode[TempCyc][0] == ScanCode)

                       {

    if(Button.NumLock&(TempCyc<14))

{

//NumLock上锁,小键盘不返回键码

}

else

{

      keyVcache(kbdcontrolcode[TempCyc][1]);

};

     };

  };

 };

}

else

Key_UP = 0;

switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理

{

case 0x12 :

 // 左 SHIFT

Button.Shift = 0;

break;

case 0x59 :

 // 右 SHIFT

Button.Shift = 0;

    break;

};

};

BF = 0; //标识字符处理完了

/*-----------------------------------------------

  名称:

主机写PS2键盘

  日期:

2010.11

  修改:

  内容:

写一个字节入PS2键盘

  传入:

sentchar 传入键盘的数据

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1