📄 keybord.c
字号:
volatile static INT8U KeyVal; // 全局变量
OS_EVENT *KeySem;
/* 用户需要的键对应的键值表 ,可以扩展成8x8*/
const INT8U KeyValMap[4][4] = {
{0x0d,0x0e,0x0f,0x010},
{0x0c,0x03,0x02,0x01},
{0x0b,0x06,0x05,0x04},
{0x0a,0x09,0x08,0x07},
};
/*查找键值的索引 */
const INT8U UnMap[] = {0x00,
0x00, //0x01
0x01, //0X02
0x00, //NULL
0x02, //0x04
0x00,
0x00,
0x00,
0x03}; //0x08
/* get key's value */
INT8U GetKey(void)
{
INT8U buf;
buf = *((volatile unsigned char *)(&PORTD)+1); //备份端口值
/*输入输出端口反转 */
*((volatile unsigned char *)(&TRISD)+1) = 0xF0;
*((volatile unsigned char *)(&PORTD)+1) = 0xF0;
/*此处需要你自己画图验证如果有键盘事件出现时,得到的数值是什么 */
buf |= *((volatile unsigned char *)(&PORTD)+1);
if(buf == 0xFF) // 冗余码
return (KeyVal = NULL);
else
buf = ~buf;
KeyVal = KeyValMap[UnMap[buf>>4]][UnMap[buf&0x0f]]; //关键代码!就这里省时间了
return KeyVal;
}
/* task function */
void KeyTask(void *pdata) //OS的固定格式需要pdata
{
INT8U err; //此处暂时还没用到,给OS处理时返回信息用的变量
INT8U ports;
INT8U wobble; //抖动标记
pdata = pdata; // 让编译器不要抱怨没用过pdata,
err = 0;
wobble = 0;
KeySem = OSSemCreate(0); //建立键值信号量,初始化为空
for(;;) {
//OSTimeDly()会交出CPU的使用权,不是在此傻等!
OSTimeDly(1); // 我设计的一个系统Tick是40ms,在OS里定义;延时一个Tick
*((volatile unsigned char *)(&PORTD)+1) = 0x0F;
/* PORTD[15..12] OutPut & PORTD[11..8] Input */
*((volatile unsigned char *)(&TRISD)+1) = 0x0F;
ports = *((volatile unsigned char *)(&PORTD)+1); //导出高8位
if(ports != 0x0f) { //有压下键盘
if(!wobble) {
wobble += 1; //抖动标记
continue; // 返回等待40ms
}
else {
wobble = 0;
// 如果得到键值就给其他任务发令牌
if(GetKey())
OSSemPost(KeySem);
}
}
OSTimeDly(5); //此后200ms内不必过问键盘任务,交出CPU控制权
}
}
/* 端口4入4出,没有键盘事件,读回的数据一定是0x0f;假如读回0b00000111,
端口反转后,读出0b01110000,"buf |= *((volatile unsigned char *)(&PORTD)+1)"
就会得到0b01110111, "buf = ~buf; "得到0b10001000,
UnMap[buf>>4]得到UnMap[8]=3;
UnMap[buf&0x0f]得到UnMap[8]=3;
KeyVal = KeyValMap[UnMap[buf>>4]][UnMap[buf&0x0f]]; 得到:
KeyVal = KeyValMap[3][3];查表得到:KeyVal =0x07; */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -