历史上的今天
今天是:2025年08月19日(星期二)
2019年08月19日 | STM32矩阵键盘4*4扫描程序(无延时消抖,测试稳定)
2019-08-19 来源:eefocus
直接上源码
key.h文件
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#define Read_Lie1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)
#define Read_Lie2 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)
#define Read_Lie3 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)
#define Read_Lie4 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)
void KEY_Init(void);//IO初始化
u8 KEY_Scan(void); //按键扫描函数
void Key_Text(void);
#endif
key.c文件
#include "key.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "lcd.h"
u8 tem;
//按键初始化函数
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
u8 KEY_Scan(void)//扫描函数
{
static u8 key_flag1=1,key_flag2=1,key_flag3=1,key_flag4=1; //按键松开标志
u8 KeyVal;
GPIO_Write(GPIOE,(( GPIOE->ODR & 0xFFC3 )|0x0004)); //0001
if(key_flag1&&(Read_Lie1==1||Read_Lie2==1||Read_Lie3==1||Read_Lie4==1))
{
key_flag1=0;
if (Read_Lie1==1){ KeyVal= 4; printf("key:%drn",KeyVal);}
else if (Read_Lie2==1) {KeyVal= 8; printf("key:%drn",KeyVal);}
else if (Read_Lie3==1) {KeyVal= 12; printf("key:%drn",KeyVal);}
else if (Read_Lie4==1) {KeyVal= 16; printf("key:%drn",KeyVal);}
}
else if(Read_Lie1==0&&Read_Lie2==0&&Read_Lie3==0&&Read_Lie4==0)key_flag1=1;
else return 0;
GPIO_Write(GPIOE,(( GPIOE->ODR & 0xFFC3 )|0x0008));//0010
if(key_flag2&&(Read_Lie1==1||Read_Lie2==1||Read_Lie3==1||Read_Lie4==1))
{
key_flag2=0;
if (Read_Lie1==1){ KeyVal= 3; printf("key:%drn",KeyVal);}
else if (Read_Lie2==1) {KeyVal= 7; printf("key:%drn",KeyVal);}
else if (Read_Lie3==1) {KeyVal= 11; printf("key:%drn",KeyVal);}
else if (Read_Lie4==1) {KeyVal= 15; printf("key:%drn",KeyVal);}
}
else if(Read_Lie1==0&&Read_Lie2==0&&Read_Lie3==0&&Read_Lie4==0)key_flag2=1;
else return 0;
GPIO_Write(GPIOE,(( GPIOE->ODR & 0xFFC3 )|0x0010));//0100
if(key_flag3&&(Read_Lie1==1||Read_Lie2==1||Read_Lie3==1||Read_Lie4==1))
{
key_flag3=0;
if (Read_Lie1==1){ KeyVal= 2; printf("key:%drn",KeyVal);}
else if (Read_Lie2==1) {KeyVal= 6; printf("key:%drn",KeyVal);}
else if (Read_Lie3==1) {KeyVal= 10; printf("key:%drn",KeyVal);}
else if (Read_Lie4==1) {KeyVal= 14; printf("key:%drn",KeyVal);}
}
else if(Read_Lie1==0&&Read_Lie2==0&&Read_Lie3==0&&Read_Lie4==0)key_flag3=1;
else return 0;
GPIO_Write(GPIOE,(( GPIOE->ODR & 0xFFC3 )|0x0020));//1000
if(key_flag4&&(Read_Lie1==1||Read_Lie2==1||Read_Lie3==1||Read_Lie4==1))
{
key_flag4=0;
if (Read_Lie1==1){ KeyVal= 1; printf("key:%drn",KeyVal);}
else if (Read_Lie2==1) {KeyVal= 5; printf("key:%drn",KeyVal);}
else if (Read_Lie3==1) {KeyVal= 9; printf("key:%drn",KeyVal);}
else if (Read_Lie4==1) {KeyVal= 13; printf("key:%drn",KeyVal);}
}
else if(Read_Lie1==0 &&Read_Lie2==0 &&Read_Lie3==0 &&Read_Lie4==0 )key_flag4=1;
else return 0;
return KeyVal;
}
void Key_Text(void)
{
switch(tem)
{
case 1:LCD_Clear(WHITE); break;
case 2:LCD_Clear(BLACK); break;
case 3:LCD_Clear(BLUE); break;
case 4:LCD_Clear(RED); break;
case 5:LCD_Clear(MAGENTA); break;
case 6:LCD_Clear(GREEN); break;
case 7:LCD_Clear(CYAN); break;
case 8:LCD_Clear(YELLOW); break;
case 9:LCD_Clear(BRRED); break;
case 10:LCD_Clear(GRAY); break;
case 11:LCD_Clear(LGRAY); break;
case 12:LCD_Clear(BROWN); break;
case 13:LCD_Clear(DARKBLUE); break;
case 14:LCD_Clear(LIGHTBLUE); break;
case 15:LCD_Clear(LIGHTGREEN); break;
case 16:LCD_Clear(RED); break;
}
}
上一篇:STM32F0 按键程序
下一篇:STM32学习第一周之 按键矩阵
史海拾趣
|
这里面主要介绍了脑电图的基本知识,还有各种脑电图波形,正常脑电图的诊断标准, 异常脑电图的诊断标准,一些专有名词等。有兴趣的朋友可以下来看看!! [ 本帖最后由 charlie1982 于 2009-12-31 15:34 编辑 ]… 查看全部问答> |
|
放假啦,回到家了。上学期遗留了一些问题。 上学期做了一个基于mega8的简易循迹小车,循黑线行驶。车模是淘宝里购买的,控制电路是自己做的。做出来的效果很不好,虽然能沿黑线行驶,但是摇头晃脑的。 大概原理: 采用4对红外对管识别黑线,得到 ...… 查看全部问答> |
|
变压器是常用的一种器件,本软件可以帮助您快速的计算出变压器的各项参数。同时还附带大量的资料以便您在设计变压器时查询。 与同类软件相比具有许多优点: 1、支持初级绕组多种输入电压。 2、支持次级绕组多绕组、多种电压输出。 3、支持 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 一个bmp图片由3大部分组成:BITMAPFILEHEADER结构体,BITMAPINFO结构体,DIB数据区。 Private Type BITMAPFILEHEADER // 14 bytes bfType As Integer bfSize As Long bfReserved1 As I ...… 查看全部问答> |
|
如何在windows XP 下读写4GB memory?有用过WinIO.dll,但只能读写0X000FFFFF以下的物理内在!Memaccess是可以,但要注册,不是免费的! 请教哪位高人有方法可以读写4GB memory,特别是在0XFF000000以上的物理内存。有可用的DLL也行。在网上找了很 ...… 查看全部问答> |
|
招聘职位:渠道拓展 职位描述 工作职责1、负责院校渠道的拓展和建设,洽谈院校合作业务,最终实现教育产品(课程)的销售;2、维护渠道关系并根据情况进行需求分析达成更多合作计划;3、调查分析渠道市场状况,配合公司制定相应的渠道销售策略和 ...… 查看全部问答> |




