📄 kb.c
字号:
#include "GP32C.H"
#include "DJC.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)
}
/*KB_Scan:扫描读取键值函数-----------------------------*
*功 能:扫描一次4*4键盘上的按键,读取键值->*p *
* 若无按键,*p为0xff *
*参 数:无 *
*返 回:扫描到的键值 *
*-----------------------------------------------------*/
unsigned char KB_Scan(void)
{
unsigned char line,i,tmp,tmp1,data=0x00,isH=0,isL=0;
KB_Init();
line=0b11110111; //取第四行为零,先识别高低键
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) //本行有键按下
{
if((tmp&0b00010000)==0) isL=10;//按下了*
if((tmp&0b00100000)==0)isH=10; //按下了0
}
line=0b11111110; //使第一根行线为0(低电平)
for(i=0;i<3;i++) //将扫描3根行线
{
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) //本行有键按下
{
if(tmp==0b11100000){data=1+3*i;break;}//按下了1,4,7
if(i==2)break;
if(tmp==0b11010000){data=2+3*i;break;}//按下了2,5
if(tmp==0b10110000){data=3+3*i;break;}//按下了3,6
}
else //本行无键按下,扫描下一行
line=(line<<1)|0x01;
}
data=data+10+isH-isL; //自定义按键值,高为21~27,中为11~17,低为1~7
if((data%10)==0) data=0xff;//没有按1~7中的任意一个时,data=0;
return(data);
}
unsigned char KB_ScanD(void)
{
unsigned char line,i,tmp,tmp1,tmp2,data=0xff;
line=0b11111110; //使第一根行线为0(低电平)
for(i=0;i<3;i++) //将扫描3根行线
{
tmp=KB_P; //取KB_P->tmp
tmp|=0b00001111; //KB_P.7-4保留,KB_P.3-0为1
tmp=tmp&line; //令KB_P.n=0,n=0、1、2、3
KB_P=(tmp&(~(1<<MOVEB)));////使第四根行线也为0(低电平)
asm("NOP"); //等待,消除按键抖动
asm("NOP");
tmp1=KB_P;
tmp1&=0b11110000; //看第这两行是否有键按下
if(tmp1!=0xf0) //有键按下
{
KB_P=tmp; //使第四根行线为1
asm("NOP"); //等待,消除按键抖动
asm("NOP");
tmp2=KB_P;
tmp2&=0b11110000;
if(tmp2==0xf0) { //看第这i行是否有独立键按下
tmp&=~(1<<MOVEB);//使第四根行线为0
tmp|=(1<<i); ///使第i根行线为1
KB_P=tmp;
asm("NOP"); //等待,消除按键抖动
asm("NOP");
tmp=KB_P;
tmp&=0b11110000;
if(tmp==0xff){
if(tmp1==0b11100000){data=1+3*i;break;}//按下了1,4,7
if(i==2)break;
if(tmp1==0b11010000){data=2+3*i+20;break;}//按下了2,5
}
}
}
else //本行无键按下,扫描下一行
line=(line<<1)|0x01;
}
return(data);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -