htmwldex 发表于 2026-1-1 15:01:58

《矩阵按键》求助帖子,密码锁功能 | 先用官方的程序测试,从正确开始

《矩阵按键》
出现的问题:


按键只可以控制LED的灯,数码管无法显示??

##今天编写过程中发现并解决了一个代码顺序的问题,


导致出现这种问题:


原因在于没有第一时间把单独按键的功能加在前面。所以出现这种情况

求助:
我编写的代码前面都能正常显示和编译,但是按键按下后,没有反应,数码管无变化不知道是哪里的问题,希望论坛大佬给一些解决方案,
代码如下,编译没报错

源代码:


void Task_1(void)                              //后面需要调度这个任务,所以存储io里面
{
      //矩阵按键任务调度的一个板块
                              COL1 = 0;
                            COL2 = 0;
                            COL3 = 0;
                            COL4 = 0;
                            ROW1 = 1;
                            ROW2 = 1;
                        //按键检测
      if((ROW1==0) || (ROW2==0))                        //检测到有按键按下。
      {
                if((ROW1 == 0) && (ROW2==0))      //
                {
                }
                else if (((ROW1 ==1)&&(ROW2 ==0) )|| ((ROW2 ==1)&&(ROW1==0)))
                {
                        if(ROW1 == 0)
                              Key_num = 0;
                        else if(ROW2 == 0)
                              Key_num = 4;
                              COL1 =1;
                            COL2 =1;
                            COL3 =1;
                            COL4 =1;
                            ROW1 =0;
                            ROW2 =0;
               
                if(COL1==0)
                {
//                        key_num = key_num+0;
                }
                else if((COL2==0))
                {
                        Key_num = Key_num+1;
                }
                else if((COL3==0))
                {
                        Key_num = Key_num+2;
                }
                else if((COL4==0))
                {
                        Key_num = Key_num+3;
                }
                }
      }
}




u8 password = {16,16,16,16,16,16,16,16};                //密码锁
u8 SEG_no = 0;
void SEG_Task(void)                                                      //数码管对外显示函数
{

      if(SEG_no == 0)                                                                        //数码管的多端口显示
      {
                Display_Seg(SEG_num],~T_num);      //SEG_no指索引的密码的第1位
      }
      else if(SEG_no == 1)
      {
               
                Display_Seg(SEG_num],~T_num);      //SEG_no指索引的第零位
      }
      else if(SEG_no == 2)
      {
                Display_Seg(SEG_num],~T_num);      //SEG_no指索引的第零位
      }
      else if(SEG_no == 3)
      {
                Display_Seg(SEG_num],~T_num);      //SEG_no指索引的第零位
      }
      else if(SEG_no == 4)
      {
               
                Display_Seg(SEG_num],~T_num);      //SEG_no指索引的第零位
      }
      else if(SEG_no == 5)
      {
                Display_Seg(SEG_num],~T_num);      //SEG_no指索引的第零位
      }
      else if(SEG_no == 6)
      {
                                                                     
                Display_Seg(SEG_num],~T_num);      //SEG_no指索引的第零位
      }
      else if(SEG_no == 7)
      {
                Display_Seg(SEG_num],~T_num);      //SEG_no指索引的第零位
      }
      else
      {
      
      }
      SEG_no ++;
      if(SEG_no >7 )
          SEG_no = 0;
}

//加一个按键的判断,代表输入进去以后会发生变化
u8 Key_Vol3 = 0;
u8 Key_no = 0;
void PW_write_Task(void)/*利用独立按键的键值去处理,避免一直出现第一个数一直输入*/
{               
      if( Key_num <0xff)                        //如果小于这个数值代表有按钮按下
      {
                Key_Vol3++;
                if( Key_Vol3 == 5)
                {
                        password = Key_num;                //表示按键按下后是第几位引入,key_no
                        Key_no++;
                if(Key_no == 0)
                {
                        password=16;
                        password=16;      
                        password=16;
                        password=16;
                        password=16;
                        password=16;
                        password=16;
                        password=16;
                }
                        if(Key_no==8)
                        {
                              if((password==1) && (password==2) && (password==3)&&(password==4)&&(password==5)&&(password==6)&&(password==7)&&(password==8))
                              {
                                        password=17;
                                        password=17;      
                                        password=17;
                                        password=17;
                                        password=17;
                                        password=17;
                                        password=17;
                                        password=1;
                              }
                              else
                              {
                                        password=16;
                                        password=16;      
                                        password=16;
                                        password=16;
                                        password=16;
                                        password=16;
                                        password=16;
                                        password=16;
                              }
                              Key_no = 0;
                        }
                }
                else
                {
                        Key_Vol3 = 0;
                }
      }
}


神农鼎 发表于 2026-1-1 15:44:16



深圳国芯人工智能有限公司-实验箱

先用官方的程序测试,从正确开始

htmwldex 发表于 2026-1-1 16:00:37

神农鼎 发表于 2026-1-1 15:44
深圳国芯人工智能有限公司-实验箱

先用官方的程序测试,从正确开始


好的

htmwldex 发表于 2026-1-1 17:21:27

神农鼎 发表于 2026-1-1 15:44
深圳国芯人工智能有限公司-实验箱

先用官方的程序测试,从正确开始


你好,我把官方的测试程序HEX
下到试验箱中后,出现的程序跟姚工讲的内容不一致怎么办呢?有没有之前课上的源码,我烧录一下看看效果

神农鼎 发表于 2026-1-1 17:42:32



《8051U深度入门到32位51大型实战视频》,【免费 + 包邮 送】实验箱@Ai8051U,100万套 - 学习打卡区 ,为集中维护,一个学习专题只发一个贴持续跟贴 国芯人工智能技术交流网站 - AI32位8051交流社区

htmwldex 发表于 2026-1-1 20:26:44

神农鼎 发表于 2026-1-1 17:42
《8051U深度入门到32位51大型实战视频》,【免费 + 包邮 送】实验箱@Ai8051U,100万套 - 学习打卡区 ,为 ...
非常感谢管理员,找到错因了{:liulei:},,,漏了一个括号


-------------------------------------------



错误原因还是括号没有对齐,导致后面那个else语句没有用上,所以按键按下去没有反应

神农鼎 发表于 2026-1-2 09:28:36

是:漏了一个括号;
不是:括号没有对齐

htmwldex 发表于 2026-1-2 16:58:29

神农鼎 发表于 2026-1-2 09:28
是:漏了一个括号;
不是:括号没有对齐

管理员你好,我有个问题想请教一下,
在《周期性任务调度》中数码管章节里面的

#define ROW1 P06
#define ROW2 P07
#define COL1 P00
#define COL2 P01
#define COL3 P02
#define COL4 P03

这些定义的引脚不也是控制LED灯的吗,是不是不能重复定义呀?这样会导致无法显示?
但是编译过程中,也没出现报错。
我的疑问点是,周期型调度的引脚控制,与中断里面重新定义灯的引脚,怎样可以做到互不影响?既让数码管可以按下,也可以控制外部中断1的操作

ercircle 发表于 2026-1-3 16:43:15

htmwldex 发表于 2026-1-2 16:58
管理员你好,我有个问题想请教一下,
在《周期性任务调度》中数码管章节里面的



真正的定义只有P00 P01这些

#define COL1 P00
COL1是宏定义,宏定义的作用是预编译时期替换,也就是预编译时期代码中所有COL1会被编译器替换为P00
页: [1]
查看完整版本: 《矩阵按键》求助帖子,密码锁功能 | 先用官方的程序测试,从正确开始