wlb2026 发表于 2026-1-15 08:15:56

第19集

本集实现了多功能按键(单击,双击,长安),程序采用了模块化设计,需要新建C文件及相应的H文件,主函数中,需要增加调用新建的H头文件。

unsigned char key_multi(void);   //带有char型返回函数的格式。

static//为静态变量,只运行一次。

if与else ifd的用法

swith case 用法中,记得一定要加break,不然会一直执行

return//返回关键字

以下为多功能按键的扫描函数

unsigned char key_multi(void)//key_return
{
       unsigned char key_state;                                                                        
        static unsigned int key_time;                                                                                
        static unsigned char key_press_nums;                                                                       
        static unsigned int key_time_double;                                                       
        static unsigned char keynum;                                                                                       
        static unsigned char new_keynum;                                                                       
        unsigned char key_press, key_return;                                                       
       
        key_return = None_click;                                                                        
        key_delayms(10);
        switch(keyscan())
        {
                case 1:key_press = KEY1;new_keynum = 1;break;               
                case 2:key_press = KEY2;new_keynum = 2;break;               
                case 3:key_press = KEY3;new_keynum = 3;break;               
                case 4:key_press = KEY4;new_keynum = 4;break;               
                default:key_press = 1;break;
        }
        if(key_press_nums > 0)                                                                                
        {
                key_time_double++;                                                                                       
                if(key_time_double >= DOUBLE_KEY_TIME && key_time_double < LONG_KEY_TIME) key_state = KEY_STATE_2;
witch (key_state)
        {
                case KEY_STATE_0:                                                                                        
                {
                        if (!key_press)                                                                                        
                        {
                                key_time = 0;                                                                                        
                                key_state = KEY_STATE_1;                                                
                        }
                }break;
                case KEY_STATE_1:                                                                                        
                {
                        if (!key_press)
                        {
                                key_time++;                                                                                                
                                if(key_time>=SINGLE_KEY_TIME)                        
                                {
                                        key_state = KEY_STATE_2;                                        
                                        key_press_nums++;                                                                       
                                }
                        }
                        else key_state = KEY_STATE_0;                                
                }break;
                case KEY_STATE_2:                                                                                        
                {
                        if(key_press)                                                                                                
                        {
                                if(key_time_double < DOUBLE_KEY_TIME ) key_state = KEY_STATE_0;                                                       
                        if(key_time_double >= DOUBLE_KEY_TIME && key_time_double < LONG_KEY_TIME)        
                                {
                                        if(key_press_nums == 1) key_return = Single_click + new_keynum*10;                                
                                        else if(key_press_nums ==2 && new_keynum == keynum) key_return = Double_click + new_keynum*10;        
                                        key_state = KEY_STATE_0;                                        
                                        key_press_nums = 0;                                                               
                                        key_time_double = 0;                                                       
                                }
                        }
                        else
                        {       
                                key_time++;                                                                                                       
                                if(key_time >= LONG_KEY_TIME)                        
                                {
                                        key_return = Long_click + new_keynum*10;        
                                        key_state = KEY_STATE_3;                                        
                                }
                        }
                }break;
                case KEY_STATE_3:                                                                                        
                {
                        if (key_press)
                        {
                                key_state = KEY_STATE_0;                                                
                                key_press_nums = 0;                                                                       
                                key_time_double = 0;                                                               
                        }
                }break;
                default:key_state = KEY_STATE_0;break;       
        }
        keynum = new_keynum;                                                                                       
        return key_return;                                                                                                
}

wlb2026 发表于 2026-1-15 09:03:00

第20集

这一章节讲的是利用翻转发扫描16个矩阵按键

u8 Matrix_key()
{
        u8 temp,keyvalue;               
        u8 keystate;                               
        P2 = 0xF0;                                       
        if(P2 != 0xF0 && keystate == 0)                       
        {
                delayms(5);                               
                if(P2 != 0xF0 && keystate == 0)               
                {
                        keystate = 1;               
                        temp = P2;                       
                        switch(temp)
                        {
                                case 0xE0:keyvalue = 1;break;                       
                                case 0xD0:keyvalue = 2;break;                       
                                case 0xB0:keyvalue = 3;break;                       
                                case 0x70:keyvalue = 4;break;                       
                        }
                        P2 = 0x0F;                               
                        if(P2 != 0x0F)               
                        {
                                temp = P2;                       
                                switch(temp)
                                {
                                        case 0x07:keyvalue += 0;break;               
                                        case 0x0B:keyvalue += 4;break;               
                                        case 0x0D:keyvalue += 8;break;               
                                        case 0x0E:keyvalue += 12;break;               
                                }
                        }
                       
                }
        }
        if(P2 == 0xF0) keystate = 0;               
        return keyvalue;                                                               
}

1.让8个i/o口中,4列为高电平,然后读取到低电平端口,说明有按键按下了
2.8个i/o口,高低电平翻转输出,行为低电平,列为高电平,只有就能得出按键按下的是哪个按键了,返回对应的按键值
页: 1 2 [3]
查看完整版本: 布丁橘长-STC32屠龙刀学习心得