YangHY 发表于 2025-12-28 13:36:00

就是这个表:

YangHY 发表于 2025-12-28 13:37:37

最后就是课后小练,

就结束了第十课的学习!

YangHY 发表于 2025-12-29 08:33:23

今天开始学习 第十一集 矩阵按键

先看看电路图:

YangHY 发表于 2025-12-29 08:34:33

那么像这种矩阵式的按键, 它和独立按键的区别就是它的端可是可以复用的,
可以看到这里有8个按键, 如果说按照独立按键的接法, 他是不是应该接在8个10口上?但是这里可以看到他只有6个,是不是能发现他横着4个,接在一个脚上。
这里两行占了两个竖的一列,竖的1列接在了一个引脚上,对不对这里有4列,所以有4个端口,他总共用了6个端口,他就可以实现我们8个按键。如果是16个按键,他是不是只要4列加4行都可以?这种就是一个矩阵按键。

YangHY 发表于 2025-12-29 08:37:03

最大的好处在哪里呢?就是它可以用有限的端口,去实现我们更多的按键。
这个按键检测,会比这个独立按键比较慢,因为独立按键他单个端口就检测一个引脚对不对,那么这里的话他要反复的去扫描。先一列一列的扫过去,然后再一行一行的扫过去。好那我们来看一下这个原理这个矩阵按键的原理是什么呢?

YangHY 发表于 2025-12-29 08:37:42

按键识别原理:端口默认为高电平,实时读取到引脚为低电平是表示按下。
①        第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的10就会变成低电平,就可以判断出哪一行按下了。
②        第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的10就会变成低电平,就可以判断出哪一列按下了。
③        第三步:行列组合一下就可以判断出是哪个按键按下了。

YangHY 发表于 2025-12-29 08:40:52

就是说是通过横纵扫描来推断,你按下了那颗按钮

YangHY 发表于 2025-12-29 08:45:24

程序实现:

先定义端口:

YangHY 发表于 2025-12-29 09:00:52

水平占2个IO口P06P07

竖直占4个IO口P00P01P02P03

先把源程序放上来:

u8 key_num = 0xff;

//任务1:数码管显示当前的按键号
void Task_1(void)
{
        //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的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 )) || (( ROW1 ==0 )&&( ROW2 ==1 )))        //如果有按键按下,而且只有一颗
                {
                        if( ROW1 ==0 )                                //判断哪一行,输出行开始的序号
                                key_num = 0;
                        else if( ROW2 ==0 )
                                key_num = 4;
                               
                        //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
                        COL1 = 1;
                        COL2 = 1;
                        COL3 = 1;
                        COL4 = 1;
                        ROW1 = 0;
                        ROW2 = 0;
                       
                        if( COL1 ==0 )                                //判断哪一列,叠加按键的序号
                        {
//                                key_num = key_num ;   //③第三步:行列组合一下就可以判断出是哪个按键按下了。

                        }
                        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;
                        }
                }
                COL1 = 0;
                COL2 = 0;
                COL3 = 0;
                COL4 = 0;
                ROW1 = 1;
                ROW2 = 1;               
        }
        else
        {
                key_num = 0xff;
        }
       
       
}

YangHY 发表于 2025-12-29 09:18:36

大致逻辑是先判断是哪行,

第一行key_num=0,第二行key_num=4

再判断是哪列,第一列+0,第二列+1, 第三列+2,第四列+3

这样最后key_num的值就和下图对上了:

页: 32 33 34 35 36 37 38 39 40 41 [42] 43 44 45 46 47 48 49 50 51
查看完整版本: 第一课 序言《AI8051U的特点》