📄 kbsub.c
字号:
/*-----------------------------------------------------*
*文件描述:本文件包含了H08C键盘中断子函数,分别为: *
*(1)KB_Init:键盘初始化函数 *
* void KB_Init(void) *
*(2)KB_Scan:扫描读取键值函数 *
* unsigned char KB_Scan(void) *
*(3)KB_Def:键值转为定义值函数 *
* unsigned char KB_Def(unsigned char KB_valve) *
*-----------------------------------------------------*/
/*[以下为子程序源代码]*/
/*[头文件]*/
#include "GP32C.H"
#include "KB.h"
/*KB_Init:键盘初始化函数-------------------------------*
*功 能:初始化键盘中断的引脚,但未开放键盘中断 *
*参 数:无 *
*返 回:无 *
*-----------------------------------------------------*/
void KB_Init(void)
{
KB_P=0x00; //复位KB_P
KB_D=0b00001111; //定定义7-4为输入,3-0为输出
KB_PUE=0b11110000; //定义输入引脚有内部上拉电阻
INTKBSCR|= (1<<IntBit);//屏蔽键盘中断(IMASKk=1)
INTKBIER=0b11110000; //允许输入引脚的中断可进入
INTKBSCR|= (1<<ACKKBit); //清键盘中断请求(ACKK=1)
}
void KB_Init1(void)
{
KB_P=0x00; //复位KB_P
KB_D=0b11110000; //定定义3-0为输入,7-4为输出
KB_PUE=0b00001111; //定义输入引脚有内部上拉电阻
INTKBSCR|= (1<<IntBit);//屏蔽键盘中断(IMASKk=1)
INTKBIER=0b00001111; //允许输入引脚的中断可进入
INTKBSCR|= (1<<ACKKBit); //清键盘中断请求(ACKK=1)
}
/*KB_Scan:扫描读取键值函数-----------------------------*
*功 能:扫描一次4*4键盘上的按键,读取键值->*p *
* 若无按键,*p为0xff *
*参 数:无 *
*返 回:扫描到的键值 *
*-----------------------------------------------------*/
unsigned char KB_Scan(void)
{
unsigned char line,i,j,tmp,tmp1,line1;
KB_Init();
line=0b11111110; //使第一根行线为0(低电平)
for(i=1;i<=4;i++) //将扫描4根行线
{
tmp=KB_P; //取KB_P->tmp
tmp|=0b00001111; //KB_P.7-4保留,KB_P.3-0为1
KB_P=tmp&line; //令KB_P.n=0,n=0、1、2、3
asm("NOP"); //等待,消除按键抖动
asm("NOP");
tmp=KB_P;
tmp&=0b11110000; //看第n行是否有键按下
if(tmp!=0xf0) //本行有键按下
{
tmp=KB_P;
if(KB_P==0xE7||KB_P==0xB7)
{
while(1)
{
//*/
KB_Init1();
line1=0b11101111; //使第一根列线为0
for(j=1;j<=3;j++) //扫描3列,确定有无1~~~7键按下
{
tmp1=KB_P; //取KB_P->tmp
tmp1|=0b11110000; //KB_P.1-3保留,KB_P.4-7为1
KB_P=tmp&line1; //令KB_P.n=0,n=0、1、2、3
asm("NOP"); //等待,消除按键抖动
asm("NOP");
tmp1=KB_P;
tmp1&=0b00001111; //看第n行是否有键按下
if(tmp1!=0x0f) //本行有键按下
{
if(KB_P==0xEE&&tmp==0xE7) tmp=0xE6;
else if(KB_P==0xED&&tmp==0xE7)tmp=0xE5;
else if(KB_P==0xEB&&tmp==0xE7)tmp=0xE3;
else if(KB_P==0xBE&&tmp==0xE7)tmp=0xA6;
else if(KB_P==0xBD&&tmp==0xE7)tmp=0xA5;
else if(KB_P==0xDD&&tmp==0xe7)tmp=0xc5;
else if(KB_P==0xDE&&tmp==0xe7)tmp=0xc6;
else if(KB_P==0xEE&&tmp==0xB7)tmp=0xAA;
else if(KB_P==0xED&&tmp==0xB7)tmp=0x55;
else if(KB_P==0xEB&&tmp==0xB7)tmp=0xA3;
else if(KB_P==0xBE&&tmp==0xB7)tmp=0xB6;
else if(KB_P==0xBD&&tmp==0xB7)tmp=0xB5;
else if(KB_P==0xDD&&tmp==0xB7)tmp=0x95;
else if(KB_P==0xDE&&tmp==0xB7)tmp=0x96;
break;
}
else //本行无键按下,扫描下一列
line1=(line1<<1)+0x10;
}
if(j==4) tmp=0xff;
break;
}
return(tmp);
//*/
}
break;
}
else //本行无键按下,扫描下一行
line=(line<<1)|0x01;
}
if(i==5) tmp=0xff;
return(tmp);
}
/*KB_Def:键值转为定义值函数----------------------------*
*功 能:键值转为定义值 *
*参 数:键值 *
*返 回:键定义值 *
*-----------------------------------------------------*/
//键盘定义表
const unsigned char KB_Table[]=
{0xEE,'1',0xDE,'2',0xBE,'3',0xED,'4',0xDD,'5',0xBD,'6',0xEB,'7',0xE7,'*',0xB7,'#',
0xE6,'a',0xC6,'b',0xA6,'c',0xE5,'d', 0xC5,'e', 0xA5,'f',0xE3,'g',//按键*1,*2,*3,*4,*5,*6,*7
0xAA,'A',0x96,'B',0xB6,'C',0x55,'D', 0x95,'E', 0xB5,'F',0xA3,'G',//按键#1,#2,#3,#4,#5,#6,#7
0x00};
unsigned char KB_Def(unsigned char KB_valve)
{
unsigned char KeyPress;
unsigned char i;
unsigned char j;
i=0;
while(1)
{
j=KB_Table[i];
//与0(定义表结束标志)相比较
if (j==0) //=0,即表中无次定义值
{KeyPress=0xff; break;} //返回0xff
else
//与键值相比较
if (j==KB_valve) //找到
{KeyPress=KB_Table[i+1];break;} //取键定义值
else
i+=2; //指向下一个键值,继续判断
};
return KeyPress;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -