OpenEdv-开源电子网

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

stm32_4*4矩阵按键线反转法的实现

[复制链接]

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2016-9-30 15:49:38 | 显示全部楼层 |阅读模式
看了网上别人写的一些程序,感觉好麻烦。经过自己的研究和验证进行改进和优化,都已经实现矩阵按键功能。
程序实现功能简要说明:
       实现在STM32下的4*4矩阵按键线反转法的实现。
       线反转扫描原理你们可以直接百度一大堆 我就不多说什么了,
       具体实现代码很简单,有点基础的应该都看得懂得哈。
.H文件
#ifndef __KEY_H
#define __KEY_H         
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//按键驱动代码          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/3
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////            
//#define KEY_DATA_IN()          GPIOB->CRH=0x88888888
#define KEY_DATA_HL()          GPIOB->CRH=0x33338888
#define KEY_DATA_INPUT         GPIOB->IDR
//#define KEY_DATA_OUT()         GPIOB->CRH=0x33333333
#define KEY_DATA_LH()         GPIOB->CRH=0x88883333
#define KEY_DATA_OUTPUT GPIOB->ODR

void KEY_Init(void);//IO初始化
void KEY_Scan(void);          //按键扫描函数                                    
#endif



.C文件
#include "key.h"
#include "ocm12864.h"
#include "delay.h"
uchar k_num;                                                                            
//按键初始化函数
void KEY_Init(void)
{
        RCC->APB2ENR|=1<<3;     //使能PORTb时钟
}
/****************
线反转法的实现
B[3:0] 输出高, 读B[7:4]的值,这样可以知道是哪一列
B[7:4] 输出高, 读B[3:0]的值,这样可以知道是哪一行,
********/
void KEY_Scan(void){//这边我因为只用到10个按键,所以就贴10个按键的程序
                u16 n;
                u16 H,L;
                delay_ms(10); //按键消抖
                KEY_DATA_HL();
                KEY_DATA_OUTPUT=0xF000;//高4位输出1111
                delay_us(200);
                L=KEY_DATA_INPUT&0X0F00;  //读低4位的值
                delay_us(10);
               
                KEY_DATA_LH();
                KEY_DATA_OUTPUT=0x0F00;//低4位输出1111
                delay_us(200);
                H=KEY_DATA_INPUT&0XF000;  //读高4位的值
               
                n=(L+H);        //行列相加 得出唯一值
//                disp_8x16(0,3,1,0,(n/0xff)/100);
//                disp_8x16(1,3,1,0,(n/0xff)%100/10);
//                disp_8x16(2,3,1,0,(n/0xff)%10);
                switch(n){                       
                        case 0x4200:
                             k_num=5;
//                                 disp_8x16(2,3,0,1,0);
//                                 disp_8x16(3,3,0,1,5);
                                                            break;       
                        case 0x4800:
                                 k_num=13;
//                                 disp_8x16(2,3,0,1,1);
//                                 disp_8x16(3,3,0,1,3);
                                                            break;
                        case 0x2800:
                                 k_num=14;
//                                  disp_8x16(2,3,0,1,1);
//                                 disp_8x16(3,3,0,1,4);
                                                            break;
                        case 0x1800:
                                 k_num=15;
//                                 disp_8x16(2,3,0,1,1);
//                                 disp_8x16(3,3,0,1,5);
                                                            break;
                        case 0x2200:
                                 k_num=6;
//                                 disp_8x16(2,3,0,1,0);
//                                 disp_8x16(3,3,0,1,6);
                                                            break;
                        case 0x1200:
                                 k_num=7;
//                                 disp_8x16(2,3,0,1,0);
//                                 disp_8x16(3,3,0,1,7);
                                                            break;
                        case 0x8400:
                                 k_num=8;
//                                  disp_8x16(2,3,0,1,0);
//                                 disp_8x16(3,3,0,1,8);
                                                            break;
                        case 0x4400:
                                 k_num=9;
//                                 disp_8x16(2,3,0,1,0);
//                                 disp_8x16(3,3,0,1,9);
                                                            break;
                        case 0x2400:
                                 k_num=10;
//                                 disp_8x16(2,3,0,1,1);
//                                 disp_8x16(3,3,0,1,0);
                                                            break;
                        case 0x1400:
                                 k_num=11;
//                                 disp_8x16(2,3,0,1,1);
//                                 disp_8x16(3,3,0,1,1);
                                                            break;                                 
                }
}


附上我另外一个也是STM32矩阵扫描按键的实现
http://www.openedv.com/thread-84769-1-1.html

希望对大家有所帮助!!!

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

使用道具 举报

346

主题

1466

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
8051
金钱
8051
注册时间
2015-10-15
在线时间
2907 小时
发表于 2016-9-30 18:28:31 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
发表于 2016-11-10 10:20:00 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 02:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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