STM32F103——4*4矩阵扫描(极简事件扫描,非主延时)

2019-08-16来源: eefocus关键字:STM32F103  4*4  矩阵扫描  事件扫描

使用扫描事件获取键值,该模块极简


任意取用


#define Keyboard_Line_1         GPIO_Pin_0

#define Keyboard_Line_2          GPIO_Pin_1

#define Keyboard_Line_3 GPIO_Pin_2

#define Keyboard_Line_4 GPIO_Pin_3

#define Keyboard_Row_1 GPIO_Pin_4

#define Keyboard_Row_2 GPIO_Pin_5

#define Keyboard_Row_3 GPIO_Pin_6

#define Keyboard_Row_4 GPIO_Pin_7

#define IOPIN(x)                    ((uint16_t)(1<<(x)))

#define DEBOUNCE_CNT        5       //20ms  默认防抖时间

 

uint16_t KeyValue ;

 

uint8_t Delay_Count[16];

 

// 功能:设置IO为推挽输出

// 输入:port, pin按位(可为组合)

void IoDirOutput(GPIO_TypeDef* port, uint16_t pin)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin   = pin;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;

    GPIO_Init(port, &GPIO_InitStructure);

}

 

 

// 功能:设置IO为下拉输入

// 输入:port, pin按位(可为组合)

void IoDirInputPD(GPIO_TypeDef *port, uint16_t pin)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin   = pin;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPD;

    GPIO_Init(port, &GPIO_InitStructure);

}

 

void IoInit(void)

{

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD

   | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);

IoDirOutput( GPIOE, Keyboard_Line_1 | Keyboard_Line_2 |Keyboard_Line_3 |Keyboard_Line_4);

 

IoDirInputPD(GPIOE, Keyboard_Line_1 | Keyboard_Line_2 | Keyboard_Line_3 | Keyboard_Line_4);

   

}

 

void IoDetectEvent(void)

{

  uint8_t i, j;

uint16_t buff_porte,porte;

        IoSetPin( GPIOE, Keyboard_Row_1 | Keyboard_Row_2 | Keyboard_Row_3 | Keyboard_Row_4);

        porte = IoRead(GPIOE);

for (i = 0; i =0 < 4; i++ ) //读取Line

{

if (porte &  IOPIN(i))

{

for (j = 4;j < 7 ; j++) //读取Row

{

IoClrPin( GPIOE,  Keyboard_Line_1 | Keyboard_Line_2 | Keyboard_Line_3 | Keyboard_Line_4);

 

 

IoSetPin( GPIOE, IOPIN(j));

buff_porte = IoRead(GPIOE);

 

if (buff_porte & IOPIN(i))

{

if (Delay_Count[i * 4 + (j - 3)] >= DEBOUNCE_CNT)   //去抖动小延时 = DEBOUNCE_CNT*4ms

{

Delay_Count[i * 4 + (j - 3)] = 0;

     KeyValue = i * 4 + (j - 3);//1~16

}

else

{

 

Delay_Count[i * 4 + (j - 3)] ++;

 

}

}

else

{

 

Delay_Count[i * 4 + (j - 3)] = 0;//清除误触计数

 

}

 

}

}

}

 

   

}


关键字:STM32F103  4*4  矩阵扫描  事件扫描

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471342.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:ARM开发(4)基于STM32的矩阵键盘按键控制TM1629A LED显示
下一篇:STM32 矩阵键盘通过串口输出

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32f103在使用定时器1重映射引脚输出PWM

在使用stm32f103ZGT6单片机输出PWM时候,各种配置都不能正确输出,后来查看手册,PE11该引脚对应的确实是定时器1的通道2,但是属于该引脚的重映射功能,遇到这种情况,需要多加一条语句。RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 ,ENABLE);      //TIM1时钟使能    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);GPIO_PinRemapConfig(GPIO_FullRemap_TIM1
发表于 2019-08-21
stm32f103在使用定时器1重映射引脚输出PWM

STM32F10x TIM1 CH3/CH4 的重映射PWM输出

TIMx在ARR上的预装载寄存器  TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能,高级定时器必须开启这个  TIM_Cmd(TIM1, ENABLE);  //使能TIM1  }    .H文件#ifndef __TIMER_H#define __TIMER_H#include "stm32f10x.h"  void TIM1_PWM_Init(u16 arr,u16 psc); #endif2.应用版源码   
发表于 2019-08-21

STM32F103ZET定时器TIM1输出六路带死区互补PWM波形

TIM_OCInitStructure;     GPIO_InitTypeDef GPIO_InitStructure;     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;     TIM_BDTRInitTypeDef TIM_BDTRInitStructure;       NVIC_InitTypeDef NVIC_InitStructure;         RCC_APB2PeriphClockCmd
发表于 2019-08-21

STM32F103C8T6定时器TIM4通道1、2输出PWM

这美妙的波形,真好,我他喵的终于把你弄出来了。STM32F103C8T6使用定时器TIM4进行双通道的PWM输出:下面的图是从STM32中文参考手册中截取的,定时器TIM4的通用和复用功能I/O我选用的是TIM4_CH1和TIM4_CH2也就是PB6和PB7输出。注意事项:输出PWM是属于IO口的复用功能,所以在设置GPIO_Mode的时候一定要设置为GPIO_Mode_AF_PP也就是推挽复用。我就是被这个卡了好长时间……,感觉自己蠢到家了。我是用的正点原子的精英板学的32,所以一些写代码的习惯都是学的正点原子的。下面是代码timer.c#include "timer.h"//TIM4 PWM部分初始化
发表于 2019-08-21
STM32F103C8T6定时器TIM4通道1、2输出PWM

STM32 TIM1 F1 四通道完全重映射PWM 配置

void TIM1_PWM_Init(u16 arr,u16 psc){   GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; TIM_OCInitTypeDef  TIM_OCInitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE); 
发表于 2019-08-21

STM32 F1 TIM2 4通道PWM同时出波配置

void TIM2_PWM_Init(u16 arr,u16 psc){   GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; TIM_OCInitTypeDef  TIM_OCInitStructure;  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); 
发表于 2019-08-21

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved