历史上的今天
返回首页

历史上的今天

今天是:2024年12月03日(星期二)

正在发生

2018年12月03日 | stm32基础实验2(按键输入—查询模式)

2018-12-03 来源:eefocus

一、实验原理


1、实现步骤 


(1)使能按键对应IO口时钟。调用函数:RCC_APB2PeriphClockCmd(); 


(2) 初始化IO模式:上拉/下拉输入。调用函数:GPIO_Init(); 


(3)扫描IO口电平(库函数/寄存器/位操作)。 


读取IO口输入电平三种方式 

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);(库函数) 

GPIOx_IDR:端口输入寄存器(寄存器) 

PEin(4)-读取GPIOE.4口电平(位操作)


Static申明的局部变量,存储在静态存储区。它在函数调用结束之后,不会被释放。它的值会一直保留下来,具有记忆功能。

 

2、硬件连接 


 这里写图片描述 


如图 

PE3——key1 

PE4——key0 

PA0——WK_UP 


初始化时,按键未按下, 

KEY_UP引脚是低电平,即下拉 

KEY0,KEY1引脚是高电平,即上拉 

GPIO_ReadInputDataBit()函数检测此三个引脚的电平。


3、按键扫描实现思路 


这里写图片描述

这里写图片描述

这里写图片描述


二、实验代码

**key.h**


#ifndef __KEY_H

#define __KEY_H  

#include "sys.h"


//#define KEY0 PEin(4)      //PE4

//#define KEY1 PEin(3)  //PE3 

//#define WK_UP PAin(0) //PA0  WK_UP


#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键0

#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键1

#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键3(WK_UP) 


#define KEY0_PRES   1   //KEY0按下

#define KEY1_PRES     2 //KEY1按下

#define WKUP_PRES   3   //KEY_UP按下(即WK_UP/KEY_UP)


void KEY_Init(void);//IO初始化

u8 KEY_Scan(u8);    //按键扫描函数                        

#endif


**key.c**


#include "stm32f10x.h"

#include "key.h"

#include "sys.h" 

#include "delay.h"


//按键初始化函数

void KEY_Init(void) //IO初始化

    GPIO_InitTypeDef GPIO_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟


    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;//KEY0-KEY1

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入

    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3


    //初始化 WK_UP-->GPIOA.0     下拉输入

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉     

    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0


}

//按键处理函数

//返回按键值

//mode:0,不支持连续按;1,支持连续按;

//0,没有任何按键按下

//1,KEY0按下,见.h文件

//2,KEY1按下

//3,KEY3按下 WK_UP

//注意此函数有响应优先级,KEY0>KEY1>KEY_UP!!

u8 KEY_Scan(u8 mode)

{    

    static u8 key_up=1;//按键按松开标志

    if(mode)key_up=1;  //支持连按         

    if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))

    {

        delay_ms(10);//去抖动 

        key_up=0;

        if(KEY0==0)return KEY0_PRES;

        else if(KEY1==0)return KEY1_PRES;

        else if(WK_UP==1)return WKUP_PRES;

    }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;       

    return 0;// 无按键按下

}




**main.c**


int main(void)

 {

    vu8 key=0;  

    delay_init();            //延时函数初始化    

    LED_Init();             //初始化与LED连接的硬件接口

    BEEP_Init();            //初始化蜂鸣器端口

    KEY_Init();             //初始化与按键连接的硬件接口

    LED0=0;                 //先点亮红灯

    while(1)

    {

        key=KEY_Scan(0);    //得到键值

        if(key)

        {                          

            switch(key)

            {                

                case WKUP_PRES: //控制蜂鸣器

                    BEEP=!BEEP;

                    break; 

                case KEY1_PRES: //控制LED1翻转   

                    LED1=!LED1;

                    break;

                case KEY0_PRES: //同时控制LED0,LED1翻转 

                    LED0=!LED0;

                    LED1=!LED1;

                    break;

            }

        }else delay_ms(10); 

    }    

}

推荐阅读

史海拾趣

CEVA, Inc公司的发展小趣事

CEVA公司一直以来都是无线连接和智能传感技术的领先许可方。公司提供了包括数字信号处理器、人工智能处理器、无线平台以及一系列用于传感器融合、图像增强、计算机视觉、语音输入和人工智能的补充软件。这些技术和产品使得CEVA在多个终端市场,如移动、消费、汽车、机器人、工业和物联网等领域,都能够提供节能、智能和互联的设备解决方案。通过与全球半导体公司和原始设备制造商的紧密合作,CEVA成功地将这些技术应用于实际产品中,推动了相关市场的快速发展。

GuangDong Province MengCo Semiconductor Co., Ltd公司的发展小趣事
对于易发热的元器件(如制动电阻),应加强散热设计,确保其在工作过程中能够正常散热。
Aptiv公司的发展小趣事

Aptiv一直秉持开放合作的理念,积极与产业链上下游企业开展创新合作。公司与多家科技公司、研究机构以及高校建立了战略合作关系,共同推动自动驾驶技术的研发和应用。通过共享资源、优势互补,Aptiv不仅加快了自身的发展步伐,还为整个电子行业的进步做出了积极贡献。

Heatron公司的发展小趣事

进入21世纪后,Heatron公司开始积极寻求国际合作机会,以进一步拓展其全球业务。公司先后与多个国家的知名企业建立了战略伙伴关系,共同开发新产品、新技术。通过资源共享和市场互补,Heatron不仅成功进入了多个新兴市场,还显著提升了其品牌在国际市场上的知名度和影响力。

东通电子公司的发展小趣事

随着全球对环保和可持续发展的重视,东通电子也积极响应号召,推行环保生产。公司在2005年开始推行环保电容生产,并在2007年通过了ISO14001:2004环境管理体系认证。这一举措不仅提升了公司的环保水平,也为客户提供了更加环保、可靠的产品。

Advanced_Linear_Devices_Inc.公司的发展小趣事

随着市场需求的不断增长,ALD不断拓展其产品线。除了最初的CMOS线性集成电路外,公司还研发出了轨到轨运算放大器、双斜率A/D前端转换器、电压比较器等一系列产品。这些产品不仅满足了不同行业的需求,还进一步提升了ALD在电子行业的市场地位。同时,公司还针对特定应用,如医疗仪器和汽车领域,推出了定制化的解决方案,赢得了客户的广泛赞誉。

问答坊 | AI 解惑

课件:低噪放,功放,射频锁相环 设计

[ 本帖最后由 freemanmm 于 2009-3-10 18:50 编辑 ]…

查看全部问答>

如何改进程序提高工作频率

我现在编写了一个数据转换的程序,但是工作频率始终不能达到我的要求,我在程序中需要125MHZ的频率,但是现在只有82MHZ,我现在把程序列出来,希望大家给点改进意见。 我说一下程序的大概意思吧:将连续输入的24个24bit宽的数据重排,将24个数据分 ...…

查看全部问答>

h.264 解码器

本人现在正在研究H.264解码器的verilog 代码,源代码是从网上下的qcif分辨率,baseline的解码器,csnd中已经有人上传过,我现在要把解码器改成cif分辨率,把代码修改之后只能解码一部分数据,其他都是不定态,哪位高手也是研究这方面的,能给指点一 ...…

查看全部问答>

MCU编程的问题,谁能帮我?

我有两个“黑盒”,一个是TX另外一个是RX。每个盒子都链接到我的一个8051 MCU上(就是说我有两个MCU)。 我想在TX 盒子上发送8 bits到RX 盒子。 RX 盒子的MCU需要告诉我在传输过程中收到多少bits和丢失了多少...可以想象8个灯链接到我的RX MCU上。 ...…

查看全部问答>

bootloader的问题

bootloader只是针对处理器的吗? 比如wince5.0自带的2410的Eboot 只要是2410的处理器,不管板子是什么样的,这个Eboot都可以用吗? …

查看全部问答>

貌似版本不匹配

小弟不才,最近安装驱动的时候碰到一个问题, 无法安装驱动 提示如下 Using qq_2440hello_module.ko kernel-module version mismath qq_2440hello_module.ko was complied for kernel version while this kernel is version 2.6.13 是不是KE ...…

查看全部问答>

str711地址问题

菜鸟提问,希望得到帮助!! 最近刚使用STR711,看了DATASHEET和相关例程,收获不少,但是还是有些疑问: 将str711设置为内部FLASH启动,也就是说将FLASH的地址映射到0x0,那么当运用程序读FLASH的地址为什么要使用0x4****x,而不是0;写的 ...…

查看全部问答>

怎么使用uip源代码?

在网上下载的uip源代码。不知道怎么移植实现TCP/IP实现协议栈。 有没有哪位大哥用过?可以具体的讲讲怎么移植的吗?…

查看全部问答>

圆点博士小四轴飞行器之浆的秘密-什么是正浆,什么是反浆

圆点博士小四轴飞行器之浆的秘密-什么是正浆,什么是反浆? ==================顺时针,逆时针================================== 在四轴中,我们需要一对电机顺时针转,一对逆时针转。如圆点博士微型四轴飞行器图片所示。一般的电机会用不同 ...…

查看全部问答>

ucos同步与通信问题

同步用信号量,通信用邮箱 一组方波信号,上升沿时程序开始AD采样与转换,下降沿时将转换后的值进行pid运算,这样循环执行。 方波信号是一个上升沿,接着一个下降沿,所以AD采样一次,再执行一次Pid,这样的先后执行顺序已经固定了。两个都是在中 ...…

查看全部问答>