搜索
bottom↓
回复: 114

转发网上矩阵键盘(stm32)感觉还行!

  [复制链接]

出0入0汤圆

发表于 2010-12-24 20:16:01 | 显示全部楼层 |阅读模式
写个矩阵键盘发现stm32全是函数,看到帖子上的方案,感觉不错,特此转发。
希望对需要的人有个参考!
以下是作者的介绍:
stm32f103ze蜘蛛版上6*6矩阵键盘程序的改进
hohai_abc 发表于: 2009-9-15 11:09 来源: IC开发网

这是上个版本的改进,经过改进后可以检测几个键盘一起按下的效果,可以制作像电脑一样的三键一起按重启的效果。

下面是common.h文件内容
#ifndef __COMMON_H
#define __COMMON_H
#include "stm32f10x.h"

/* 6*6矩阵键盘 */
void keyboard_init(void);
void update_key(void);
extern unsigned char key[6][6];


#include "common.h"
struct io_port {
GPIO_TypeDef *GPIO_x;
unsigned short GPIO_pin;
};
static struct io_port key_output[6] = {
{GPIOB, GPIO_Pin_9}, {GPIOB, GPIO_Pin_8},
{GPIOB, GPIO_Pin_7}, {GPIOB, GPIO_Pin_6},
{GPIOB, GPIO_Pin_5}, {GPIOG, GPIO_Pin_15}
};
static struct io_port key_input[6] = {
{GPIOG, GPIO_Pin_14}, {GPIOG, GPIO_Pin_13},
{GPIOG, GPIO_Pin_11}, {GPIOG, GPIO_Pin_9},
{GPIOD, GPIO_Pin_7}, {GPIOD, GPIO_Pin_6}
};
unsigned char key[6][6];
void keyboard_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
unsigned char i;
/* 键盘扫描输出线 输出低电平 */
/* PB9 PB8 PB7 PB6 PB5 PG15 输出*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8 | GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOG, &GPIO_InitStructure);
/* 键盘扫描输入线 键被按时输入低电平 放开输入高电平 */
/* PG14 PG13 PG11 PG9 PD7 PD6 输入*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_11 | GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
for(i = 0; i < 6; i++)
{
  GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);
}
}
void update_key(void)
{
unsigned char i, j;
for(i = 0; i < 6; i++)
{
  GPIO_SetBits(key_output.GPIO_x, key_output.GPIO_pin);
  for(j = 0; j < 6; j++)
  {
   if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 1)
   {
    key【i】【j】 = 1; //这里用【】代替[],因为论坛不好显示。
   }else{
    key【i】【j】 = 0;
   }
  }
  GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);
}
}

使用键盘就用TIM2设置成150ms一个周期运行下update_key();
然后接下来直接读取key[x][y]的值判断按键是否被按下。

if(key[5][5] == 1) 单键按下
    {
        do_something();
    }

if((key[0][0] == 1) && (key[0][1] == 1) && (key[0][2] == 1)) 多键按下
    {
        do_something();
    }

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2010-12-24 21:20:52 | 显示全部楼层
有用的东西

出0入0汤圆

发表于 2010-12-24 21:24:59 | 显示全部楼层
好东西啊

出0入0汤圆

 楼主| 发表于 2010-12-24 21:50:25 | 显示全部楼层
做矩阵键盘扫描!端口设置成什么状态最省电!输入为上拉,还是下拉。输出为推挽输出。

出0入0汤圆

发表于 2010-12-25 00:14:05 | 显示全部楼层
收藏

出0入0汤圆

发表于 2010-12-26 22:18:38 | 显示全部楼层
收藏,谢谢!!

出0入0汤圆

发表于 2010-12-27 07:49:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-27 08:31:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-27 09:15:33 | 显示全部楼层
马克~~

出0入0汤圆

发表于 2010-12-27 17:55:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-28 16:21:10 | 显示全部楼层
学习学习

出100入143汤圆

发表于 2010-12-28 16:48:35 | 显示全部楼层
需要

出0入0汤圆

发表于 2010-12-29 12:34:45 | 显示全部楼层
现在不用,不代表以后也不用,看看了先呵呵 !

出0入0汤圆

发表于 2011-1-2 20:35:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-4 09:51:41 | 显示全部楼层
收了,谢谢分享

出0入0汤圆

发表于 2011-1-4 17:18:04 | 显示全部楼层
学习~

出0入0汤圆

发表于 2011-1-4 18:26:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-6 09:58:37 | 显示全部楼层
标记。如果去抖动的呢?150MS的周期执行?

出0入0汤圆

发表于 2011-1-8 11:26:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-8 11:38:33 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-1-8 15:56:11 | 显示全部楼层
自己做个去除抖动啊!调用二次,然后比较!相同就执行,不同,就是误动作

出0入0汤圆

发表于 2011-1-8 16:55:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-21 09:59:33 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-2-10 13:48:14 | 显示全部楼层
mark!!!

出0入0汤圆

发表于 2011-2-10 15:57:51 | 显示全部楼层
好东西啊

出0入0汤圆

发表于 2011-2-12 09:02:42 | 显示全部楼层
作个标志先

出0入0汤圆

发表于 2011-2-12 10:15:13 | 显示全部楼层
如果是stm32 我觉得可以改进一下

stm32的gpio可以做中断,如果用中断做键盘扫描 再加个1pf的电容去抖动

这样效率不就高了吗,省cpu啊

出0入0汤圆

发表于 2011-2-15 00:26:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-17 09:43:30 | 显示全部楼层
保存

出0入0汤圆

发表于 2011-2-17 11:34:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-18 17:19:21 | 显示全部楼层
收藏,感谢楼主

出0入0汤圆

发表于 2011-3-7 19:55:14 | 显示全部楼层
不错,有朋友调试通过了的吗?
我试了出错,

(78): error:  #154: expression must have struct or union type
             GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_Pin);
                                    ^
(78): error:  #154: expression must have struct or union type
             GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_Pin);
                                                                ^

在keil MDK 4.12 lib:V3.4

出0入0汤圆

发表于 2011-3-7 20:18:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-17 14:23:35 | 显示全部楼层
应该改成 GPIO_SetBits(key_output.GPIO_x,key_output.GPIO_pin);

其中i为列循环的参数。

出0入0汤圆

发表于 2011-3-17 14:36:47 | 显示全部楼层
回复【楼主位】changjianfeng  水滴
-----------------------------------------------------------------------

我想问一下楼主,那个多位按键识别怎么不能用啊?怎么也识别不了

出0入0汤圆

发表于 2011-3-17 18:05:05 | 显示全部楼层
mrak

出0入0汤圆

发表于 2011-3-22 23:53:50 | 显示全部楼层
回复【33楼】xuanye  
应该改成 gpio_setbits(key_output.gpio_x,key_output.gpio_pin);
其中i为列循环的参数。
-----------------------------------------------------------------------

谢谢这位朋友,按你的方法,仿真调试OK。

我在网上搜索了一下,全部都是按错就错COPY下来的,对高手倒无所谓,对刚学的就惨了。

出0入0汤圆

发表于 2011-3-23 15:04:18 | 显示全部楼层
上流明的试一下吧

出0入0汤圆

发表于 2011-3-29 08:13:49 | 显示全部楼层
我还是比较喜欢machao先生的状态机

出0入0汤圆

发表于 2011-5-27 23:27:33 | 显示全部楼层
收藏。

出0入0汤圆

发表于 2011-5-27 23:38:50 | 显示全部楼层
不错啊。顶@!

出0入0汤圆

发表于 2011-5-27 23:48:34 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-5-28 00:45:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-7 16:51:45 | 显示全部楼层
不错哦,学习了

出0入0汤圆

发表于 2011-7-13 19:09:39 | 显示全部楼层
这句 if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 1)
为什么是为1 啊?
不是低电平触发么?

出0入0汤圆

发表于 2011-7-13 19:54:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-14 12:59:24 | 显示全部楼层
回复【44楼】mobileangl
这句 if(gpio_readinputdatabit(key_input[j].gpio_x, key_input[j].gpio_pin) == 1)  
为什么是为1 啊?
不是低电平触发么?
-----------------------------------------------------------------------

这个==1只是作为一个判定的条件语句! 因为key_input在设置时就1,所以判定时要检测状态是不是有改变!!

出0入0汤圆

发表于 2011-7-14 14:49:15 | 显示全部楼层
shoucang

出0入0汤圆

发表于 2011-7-14 15:58:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-16 09:16:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-16 09:30:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-16 09:54:50 | 显示全部楼层
收下了,谢谢。

出0入0汤圆

发表于 2011-7-22 09:41:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-22 11:33:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-22 11:41:11 | 显示全部楼层
留着以后用

出0入0汤圆

发表于 2011-7-22 11:48:19 | 显示全部楼层
先收下了。

出0入0汤圆

发表于 2011-7-22 12:02:47 | 显示全部楼层
刚好用~~~

出0入0汤圆

发表于 2011-7-22 12:28:45 | 显示全部楼层
多按键只能是个别的吧,如果想所有按键都能组合,这个困难比较大吧?

出0入0汤圆

发表于 2011-7-24 18:08:46 | 显示全部楼层
好东西,但是有个问题,就是里面有三个地方要改一下把GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);改成GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin); 可以找一下,很容易就发现了

出0入22汤圆

发表于 2011-7-24 18:20:18 | 显示全部楼层
用STM32扫描KEY  真有你的 。。

用一个AD口 扫描128个KEY 可以应该没有问题。程序也简单。

出0入0汤圆

发表于 2011-7-25 21:17:14 | 显示全部楼层
怎么做个按键还要用到定时器

出0入0汤圆

发表于 2011-7-26 22:16:09 | 显示全部楼层
不错,收藏了!

出0入0汤圆

发表于 2011-7-28 10:19:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-28 10:40:32 | 显示全部楼层
hao 纠错更好。

出0入0汤圆

发表于 2011-7-28 10:49:05 | 显示全部楼层
mark矩阵函数

出0入8汤圆

发表于 2011-7-28 21:32:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-28 22:42:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-29 01:27:44 | 显示全部楼层
不错,收藏

出0入0汤圆

发表于 2011-7-29 17:52:34 | 显示全部楼层
没有消抖和按键松开检测啊~~~

出0入0汤圆

发表于 2011-7-29 19:37:50 | 显示全部楼层
感觉还是状态机好,痛骂断码长安断案组合都可

出0入0汤圆

发表于 2011-7-29 20:24:13 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-8-17 21:38:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-17 22:13:48 | 显示全部楼层
还凑合,但是有错误,可见lz压根没有编译过就心急火燎的发到这里来了,呵呵,下次最好仔细点罗。对于c语言不过关的人来说,可能一时半会儿还真找不到错误来。

出0入0汤圆

发表于 2011-8-18 14:52:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-19 18:46:37 | 显示全部楼层
上次网上看到零耗时键盘不错,有机会写个。

出0入0汤圆

发表于 2011-9-22 10:23:38 | 显示全部楼层
马克来也.

出0入0汤圆

发表于 2011-9-26 14:11:37 | 显示全部楼层
标记标记~~

出0入0汤圆

发表于 2011-10-5 09:19:45 | 显示全部楼层
有用

出0入0汤圆

发表于 2011-11-15 09:00:34 | 显示全部楼层
STM32 中断扫描,端口非反转法,依次出1扫描法;可行,但有待改进。程序太长。

出0入0汤圆

发表于 2011-12-8 14:26:40 | 显示全部楼层
正要用

出0入0汤圆

发表于 2011-12-8 16:43:52 | 显示全部楼层
收藏了

出0入0汤圆

发表于 2011-12-9 13:50:56 | 显示全部楼层
mark!!!!

出0入0汤圆

发表于 2012-1-10 10:19:35 | 显示全部楼层
值得参考,谢谢楼主

出0入0汤圆

发表于 2012-1-10 11:20:02 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-1-11 15:16:01 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-1-11 15:22:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-12 11:35:35 | 显示全部楼层
学习,支持

出0入0汤圆

发表于 2012-2-14 23:34:37 | 显示全部楼层
好东西,学习了。顶

出0入0汤圆

发表于 2012-10-1 09:12:25 | 显示全部楼层
学习,支持

出0入0汤圆

发表于 2012-10-3 20:59:22 | 显示全部楼层
其实这个程序还是挺好用的,我没有用这个方法,但是我也是参考和这个程序一样的键盘程序,就是没有识别多个键按下,没有任何问题,这个程序具体我没有试过有没有错误,反正从论坛上下载的那个程序我改完之后就可以用了,其实用不用中断都可以,用了更好,反正中断挺多的,无论是外部中断,还是用定时器中断,这个程序其实根本不复杂,我在stm32f103vct6上面用的,很好用,我也在ucosii中用了,都没有问题,
但是我在stm8s中编译时,有警告,不知道问什么

出0入0汤圆

发表于 2012-10-3 22:15:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-10-6 21:43:30 | 显示全部楼层
正是需要的资料,感谢楼主

出0入0汤圆

发表于 2012-10-7 14:02:04 | 显示全部楼层
感谢分享,收了

出0入0汤圆

发表于 2012-11-28 13:29:53 | 显示全部楼层
好东西,收藏一下

出0入0汤圆

发表于 2013-4-23 11:24:48 | 显示全部楼层
收藏,后面是是凑数的

出0入0汤圆

发表于 2013-4-23 21:42:05 | 显示全部楼层
扫苗法,不过结构体用的不错,反转法快一些

出0入0汤圆

发表于 2013-9-13 10:07:34 | 显示全部楼层
mrak            

出0入0汤圆

发表于 2013-9-13 10:30:20 | 显示全部楼层
   mark   

出0入0汤圆

发表于 2013-9-13 11:10:51 | 显示全部楼层

出0入0汤圆

发表于 2013-9-14 05:09:11 | 显示全部楼层
谢谢分享,MARK
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 05:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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