OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2531|回复: 7

矩阵按键扫描

[复制链接]

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2018-3-8
在线时间
8 小时
发表于 2018-4-18 15:40:21 | 显示全部楼层 |阅读模式
1金钱
最近做了个小菜单,结果在按键这卡住了,卡了很多检测点,还是没发现错误,完全没有逻辑的bug,找不出问题,求教大佬!我都快疯了!

void scankeyboard()
{
                u16 a,b;
                RCC->APB2ENR|=1<<2;//IO&#191;úAê±&#214;óê1&#196;ü
                GPIOA->CRL&=0x00000000;//crlê&#199;0-7è&#231;1&#251;òa&#184;3&#214;μ8-15ó&#195;crh
                GPIOA->CRL|=0x88883333;//í&#198;íìê&#228;3&#246;3 é&#207;&#207;&#194;à-ê&#228;8 &#191;a&#194;&#169;ê&#228;3&#246;7
                GPIOA->ODR&=0xff00;
                GPIOA->ODR|=0x000f;//PA=0x  0f;
                keycode=(GPIO_ReadInputData(GPIOA)&0xff);
//                printf("%x",keycode);
                if(keycode!=0x0f)
         {
                delay_ms(10); //??????
                a=keycode;
                 printf("a:");
                printf("%x",a);
                GPIOA->CRL&=0x00000000;//
                GPIOA->CRL|=0x33338888;//
                GPIOA->ODR&=0xff00;
                GPIOA->ODR|=0x00f0;//PA=0x  f0;
                b=(GPIO_ReadInputData(GPIOA)&0xff);
                  printf("b:");
                printf("%x",b);
                keycode=a&b;
//                 if(keycode!=0x00)
                 printf("key:");
                                printf("%x",keycode);
                while((GPIO_ReadInputData(GPIOA)&0xff)!=0xf0);
                delay_ms(10);
                scanok=1;
                keyflag=1;
         }
               
}

void checkkeycode(void)      
{
    if(scanok)
{
         scanok=0;
        switch(keycode)   
        {
           case 0x18: key_num=0  ;break;  
           case 0x14: key_num=1  ;break;
           case 0x12: key_num=2  ;break;
           case 0x10: key_num=3  ;break;
           case 0x21: key_num=4  ;break;
           case 0x22: key_num=5  ;break;
           case 0x24: key_num=6  ;break;
           case 0x28: key_num=7  ;break;
           case 0x41: key_num=8  ;break;
           case 0x42: key_num=9  ;break;
           case 0x44: key_num=10 ;break;   //
           case 0x48: key_num=11 ;break;   //
           case 0x81: key_num=12 ;break;   //
           case 0x82: key_num=13 ;break;   //
           case 0x84: key_num=14 ;break;   //
           case 0x88: key_num=15 ;break;   //
        }
        if(key_num!=0)
        printf("%d",key_num);
}
}

按键扫描的主要的两个程序,采用的是行列各自拉高一次,进行与或运算得出gpio的值,但是问题在于,如果我用单根杜邦线接行列各一个,可以运行,,可是如果我8根杜邦线就算是什么都不接,串口发送的都是a:ffb:ffkey:ff1  ,另外问问串口调用printf函数可以只让他发送一次吗,不让他重复发数据。希望大佬指点一下,真心感谢

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2018-3-8
在线时间
8 小时
 楼主| 发表于 2018-4-18 15:41:54 | 显示全部楼层
因为mdk5中文备注显示乱码,不好意思啊,发的时候没看见,请忽略备注
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-4-18 16:19:46 | 显示全部楼层
写的不清楚 一会按键一会串口
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2018-3-8
在线时间
8 小时
 楼主| 发表于 2018-4-18 17:09:02 | 显示全部楼层
ssssssssssss 发表于 2018-4-18 16:19
写的不清楚 一会按键一会串口

真是不好意思        那是我放的几个检测点,观察a行值和b列值还有就是他们与运算的值,可以忽略,结果不行他们一直发ff,
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-4-18 17:42:30 | 显示全部楼层
if(key_num!=0)
        printf("%d",key_num);
你这句的意思就是只要按键之不为0,就一直发送。要想按键按一次就发送一次就把if语句的判断条件重改一下。
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2018-3-8
在线时间
8 小时
 楼主| 发表于 2018-4-18 19:32:05 | 显示全部楼层
HXYDJ 发表于 2018-4-18 17:42
if(key_num!=0)
        printf("%d",key_num);
你这句的意思就是只要按键之不为0,就一直发送。要想按 ...

那个是因为我定义了他的key_num的初值为0,不然如果没有按下按键的话,进不了switch语句,他就一直发送0,我要他按下按键了才发,这样防止他一直发送0,
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-4-19 08:57:43 | 显示全部楼层
cfoundation 发表于 2018-4-18 19:32
那个是因为我定义了他的key_num的初值为0,不然如果没有按下按键的话,进不了switch语句,他就一直发送 ...

你这样写,如果按键按下,按键值是1的话,是不是就一直发1,按键按一次发无数次。
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2018-3-8
在线时间
8 小时
 楼主| 发表于 2018-4-19 21:44:08 | 显示全部楼层
HXYDJ 发表于 2018-4-19 08:57
你这样写,如果按键按下,按键值是1的话,是不是就一直发1,按键按一次发无数次。

确实啊,但是这个不是很重要,我只是搞不懂为什么当接上8根线还没按下键盘的时候他一直给我发a:ff   b:ff不应该啊,算了,我没时间找bug了,换了一种算法直接依次拉高行来嵌入switch语句,做好了。这个bug以后有机会在看看,谢谢你们!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 04:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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