历史上的今天
返回首页

历史上的今天

今天是: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;

}

}

推荐阅读

史海拾趣

Component Research Co公司的发展小趣事

随着公司规模的扩大,Component Research Co面临着管理上的挑战。为了提升运营效率,公司引入了一系列创新管理措施,如引入先进的生产管理系统、优化供应链管理、推行员工激励机制等。这些措施的实施使得公司的运营效率得到了显著提升,产品质量也得到了更好的保障。

BELDEN公司的发展小趣事

作为一家拥有百年历史的电子企业,BELDEN公司始终保持着持续创新和可持续发展的理念。公司不断投入研发资金,加强技术研发和创新能力,推出了一系列具有自主知识产权的新产品和技术。同时,公司还注重环保和可持续发展,积极采用环保材料和生产工艺,致力于降低生产过程中的能耗和排放。这些举措不仅提升了公司的竞争力和市场份额,还为公司的长期发展奠定了坚实的基础。

这五个故事从不同角度展示了BELDEN公司在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。这些事实性的描述旨在客观呈现BELDEN公司的历史与现状,不含任何褒贬之意。

得力(deli)公司的发展小趣事

得力公司之所以能够在电子行业中不断发展壮大,离不开其持续创新的企业文化。公司鼓励员工敢于尝试、勇于创新,不断挑战自我和行业极限。同时,得力还注重知识产权保护,积极申请专利和商标,保护自己的创新成果。这种持续创新的企业文化不仅为得力公司带来了源源不断的创新动力,也为其在电子行业中树立了良好的品牌形象。

Gore公司的发展小趣事
在电力系统中,三电平直流变换器可用于直流输电、电力电子变压器等领域,提高电网的稳定性和效率。
DRS Technologies公司的发展小趣事

DRS Technologies公司成立于1968年,由Leonard Newman和David Gross两位工程师共同创立。当时,他们正在Loral Corporation研究反潜战的信号处理技术。然而,当Loral决定转向其他技术方向时,Newman和Gross决定继续他们的研究,并创立了DRS。他们的努力最终导致了AN/SQR-17无源潜艇探测系统的开发,这一系统至今仍在广泛使用。

峰岹(Fortior Tech )公司的发展小趣事

在21世纪初,DRS接受了价值16亿美元的合同,为美国陆军和海军陆战队的部队现代化计划制造加固式计算机。这一合同不仅展示了DRS在军事领域的实力,也进一步巩固了其在全球电子行业的地位。DRS提供的“探索者”MP加固式轻便多平台工作站,为数字战场提供了强大的支持。

问答坊 | AI 解惑

薄膜电容

电容器依着介质的不同,它的种类很多,例如:电解质电容、纸质电容、薄膜电容、陶瓷电容、云母电容、空气电容等。但是在音响器材中使用最频繁的,当属电解电容器和薄膜(Film)电容器。电解电容大多被使用在需要电容量很大的地方,例如主电源部份的滤 ...…

查看全部问答>

脑电图基础知识幻灯片

这里面主要介绍了脑电图的基本知识,还有各种脑电图波形,正常脑电图的诊断标准, 异常脑电图的诊断标准,一些专有名词等。有兴趣的朋友可以下来看看!! [ 本帖最后由 charlie1982 于 2009-12-31 15:34 编辑 ]…

查看全部问答>

基于mega8的简易循迹小车

放假啦,回到家了。上学期遗留了一些问题。 上学期做了一个基于mega8的简易循迹小车,循黑线行驶。车模是淘宝里购买的,控制电路是自己做的。做出来的效果很不好,虽然能沿黑线行驶,但是摇头晃脑的。 大概原理: 采用4对红外对管识别黑线,得到 ...…

查看全部问答>

变压器设计大师 3.0

变压器是常用的一种器件,本软件可以帮助您快速的计算出变压器的各项参数。同时还附带大量的资料以便您在设计变压器时查询。 与同类软件相比具有许多优点: 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 ...…

查看全部问答>

电梯控制器

想用VHDL语言编一个二层的电梯控制器。要求:一,二极管指示灯指示上升和下降。二,用数码管指示所在层数。…

查看全部问答>

windows XP 下读写4GB memory

如何在windows XP 下读写4GB memory?有用过WinIO.dll,但只能读写0X000FFFFF以下的物理内在!Memaccess是可以,但要注册,不是免费的! 请教哪位高人有方法可以读写4GB memory,特别是在0XFF000000以上的物理内存。有可用的DLL也行。在网上找了很 ...…

查看全部问答>

驱动是不是都指pc机上的编程?

毕业设计要做usb驱动 但是这个驱动是指的什么呢? pc机上的编程 还是下位机上的编程?…

查看全部问答>

高薪诚聘嵌入式人才(北京)

招聘职位:渠道拓展 职位描述 工作职责1、负责院校渠道的拓展和建设,洽谈院校合作业务,最终实现教育产品(课程)的销售;2、维护渠道关系并根据情况进行需求分析达成更多合作计划;3、调查分析渠道市场状况,配合公司制定相应的渠道销售策略和 ...…

查看全部问答>

版主,给我们解释一下ifdefinedSTM32F10X_LD_VL

                                 解释一下这些玩意那里定义的,有何用途?那种型号该用那个定义??…

查看全部问答>