看了网上别人写的一些程序,感觉好麻烦。经过自己的研究和验证进行改进和优化,都已经实现矩阵按键功能。
程序实现功能简要说明:
实现在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
希望对大家有所帮助!!!
|