找回密码
 立即注册
楼主: wlb2026

布丁橘长-STC32屠龙刀学习心得

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-01-15 08:00:16
已绑定手机

1

主题

19

回帖

53

积分

注册会员

积分
53
发表于 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;                                                                                                
}

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2026-01-15 08:00:16
已绑定手机

1

主题

19

回帖

53

积分

注册会员

积分
53
发表于 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口,高低电平翻转输出,行为低电平,列为高电平,只有就能得出按键按下的是哪个按键了,返回对应的按键值
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-2-12 18:02 , Processed in 0.104555 second(s), 46 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表