⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keybord.c

📁 4X4键盘程序C语言源程序适当修改就可以应用
💻 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 + -