📄 keyboard.h
字号:
#ifndef KEYBOARD_H
#define KEYBOARD_H
#include<reg52.h> //该头文件包含lcd12864驱动
/************* io口 及其他宏定义***************************************/
sbit dat =P3^4;//DATA IN
#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; //一个按键动作,键盘会发出通码,段吗,这用于记录收到编码个数。可以参考附带的pse.pdf第54页
/*******************************************************************/
/********************************************************************
*********************************************************************/
/************* 键盘接收解码程序 *******************************
这是本程序的核心函数,用于键盘解码。建议读者参考附带的pse.pdf第54页
了解键盘ps2协议,理解通码、断码概念以及发送编码个数。
******************************************************************/
void key_dec() interrupt 2 using 0
{
if ((key_count>0)&&(key_count<9))
{
key_temp>>=1;
if (dat==1)key_temp|=0x80;
}
key_count++;
if (key_count>10)
{
// if(key_temp<0xf0){key=key_temp;BF=1;key_count=0;key_temp=0;}
key_buffer[key_num]=key_temp; //将获得的数据写入缓冲区
key_temp=0;
key_num++;
key_num%=5; //不会超过五个码
if(key_buffer[0]<0xe0) //收到通码或结束码
{
if(key_num==1) //若是通码
{
if(!BF)
{ //置标志位
BF=1; //清空缓冲区,准备接收下一个按键发来的码
key=key_buffer[0];
}
}
if(key_num>1&&key_buffer[key_num-1]==key_buffer[0])key_num=0; //收到结束码
}
else
{
if(key_num==2) //收到通码或结束码
{ //若是通码
if(!BF)
{ //置标志位若置标志位是通码
BF=1; //清空缓冲区,准备接收下一个按键发来的码
key=key_buffer[1];
}
}
if(key_num>2&&key_buffer[key_num-1]==key_buffer[1])key_num=0;//收到结束码
}
key_count=0;
}
}
/**************** 键盘初始化函数 ***********************/
void init_keyboard()
{
TCON|=0x04; //外部中断下降沿触发
IE|=132; //开启外部中断1
//不修改当前的优先级
}
/********************** 键值转换函数 **********************
主要用于将接收到的编码量化键值,以备以后分类处理。
返回数据: 量化后的键值
*******************************************************************/
uchar sp2key_scan()
{
unsigned char key_temp,k=255;
if(BF==1) //如果收到
{ //清除接收到通码的标志位,键盘可以继续接收数据
BF=0;
key_temp=key;
switch ( key_temp )
{
case 0x45: k=0; break; //0
case 0x16: k=1; break; //1
case 0x1e: k=2; break; //2
case 0x26: k=3; break; //3
case 0x25: k=4; break; //4
case 0x2e: k=5; break; //5
case 0x36: k=6; break; //6
case 0x3d: k=7; break; //7
case 0x3e: k=8; break; //8
case 0x46: k=9; break; //9
case 0x1c: k=10; break; //a
case 0x32: k=11; break; //b
case 0x21: k=12; break; //c
case 0x23: k=13; break; //d
case 0x24: k=14; break; //e
case 0x2b: k=15; break; //f
case 0x34: k=16; break; //g
case 0x33: k=17; break; //h
case 0x43: k=18; break; //i
case 0x3b: k=19; break; //j
case 0x42: k=20; break; //k
case 0x4b: k=21; break; //l
case 0x3a: k=22; break; //m
case 0x31: k=23; break; //n
case 0x44: k=24; break; //o
case 0x4d: k=25; break; //p
case 0x15: k=26; break; //q
case 0x2d: k=27; break; //r
case 0x1b: k=28; break; //s
case 0x2c: k=29; break; //t
case 0x3c: k=30; break; //u
case 0x2a: k=31; break; //v
case 0x1d: k=32; break; //w
case 0x22: k=33; break; //x
case 0x35: k=34; break; //y
case 0x1a: k=35; break; //z
case 0x0e: k=36; break; //~
case 0x4e: k=37; break; //-
case 0x55: k=38; break; //=
case 0x29: k=46; break; //SPACE
case 0x66: k=47;break; //del
case 0x5b: k=39;break; //]
case 0x4c: k=40;break;//;
case 0x52: k=41;break;// '
case 0x41: k=42; break; //,
case 0x49: k=43;break;//.
case 0x4a: k=44;break; // /
case 0x54: k=45; break; //[
case 0x58: k=49; break; //cap
case 0x5a: k=48; break; //回车键
/**************************************小键盘部分 ******************************/
case 112 : k=0 ; break;
case 105 : k=1 ; break;
case 114 : k=2 ; break; //2 down
case 122 : k=3 ; break;
case 107 : k=4 ; break; //4 left
case 115 : k=5 ; break;
case 116 : k=6 ; break; //6 ringht
case 108 : k=7 ; break;
case 117 : k=8 ; break; //8 up
case 125 : k=9 ; break;
case 113 : k=43;break;
case 0xf0: k=89;break;//f0
case 0xe0: k=90;break;//e
case 118 :k=51; break; //esc
case 31 :k=52;break; //win
default : k=255;
}
}
return k;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -