stm32学习笔记——按键(扫描法)

发布者:Yuexiang888最新更新时间:2019-06-24 来源: eefocus关键字:stm32  按键  扫描法 手机看文章 扫描二维码
随时随地手机看文章

目的:利用扫描IO口的方式直接操作按键


 


配置文件:#include "stm32f10x_gpio.h" 


  #include "stm32f10x_rcc.h" 


 


寄存器、结构体定义以及库函数参看流水灯一节


 


程序代码分析:(代码出自FIRE)


Led.c文件再次不在叙述,参看流水灯一节


重点分析key.c文件,其基本结构如下:


 


1、按键io口初始化,这里有两个按键key1和key2,初始化过程完全相同


 


void Key1_GPIO_Config(void)


{


GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO初始化结构体


 


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开GPIO时钟


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选中IO口标号


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //配置IO口速度


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入


GPIO_Init(GPIOA, &GPIO_InitStructure);//利用初始化库函数初始化GPIO


}


 


2、扫描按键


 


uint8_t Key_Scan(GPIO_TypeDef* GPIOx,u16 GPIO_Pin)//该函数将返回一个unsigned char型变量,输入参数为GPIO寄存器结构体(字母),和GPIO端口号(数字)


{


if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ); //利用单个位读取函数读取按键的值


{    


Key_Delay(10000); //延时,消抖


if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  //再次确认按键按下


{  


while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);//等待按键释放


return  KEY_ON;  


}


else


return KEY_OFF;


}


else


return KEY_OFF;


}


其中有两个宏定义


#define KEY_ON 0


#define KEY_OFF 1


 


3、按键按下后的执行函数:按键按下后需要执行相应的操作,所以要列写此函数


 


void Key_Test(void)


{


LED_GPIO_Config();


LED1_ON;


   LED2_ON;


 


/*config key*/


Key1_GPIO_Config();//调用按键GPIO初始化函数


   Key2_GPIO_Config();


while(1)                            


{    


if( Key_Scan(GPIOA,GPIO_Pin_0) == KEY_ON ) // KEY1


{


LED1_TOGGLE;



    


if( Key_Scan(GPIOC,GPIO_Pin_13) == KEY_ON ) // KEY2


{


LED2_TOGGLE;


}    


}


}


其中操作LED灯的几个函数参看流水灯一节


 


小总结:1、在写key.c文件时,除了包含自己的key.h文件,还要包含led.h文件才能调用 流水灯函数。


2、主函数还要包含上述两个头文件


3、延时函数


static void Key_Delay(__IO u32 nCount)


{


for(; nCount != 0; nCount--);



注意函数中static 和__IO的宏定义为volatile,传入参数为无符号32位int型变量


关键字:stm32  按键  扫描法 引用地址:stm32学习笔记——按键(扫描法)

上一篇:STM32F1x系列——按键输入实验
下一篇:STM32 LED灯的另一种写法

推荐阅读最新更新时间:2024-11-17 07:19

关于STM32的ADC/DAC问题集锦
1、STM32的DAC转换是什么开始的呢? 问:STM32的DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢? 答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。 2、STM32的DAC输出电压 问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下: #include stm32f10x_lib.h #define DAC_DHR8R1_Address 0x40007410 DAC_InitTypeDef DAC_InitStructure;
[单片机]
STM32的独立看门狗(IWDG)
一、什么是看门狗: 看门狗就是一种专用定时器。 二、看门狗的功能: 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。 简单来说就是在系统跑飞(程序异常执行)的情况时,系统复位,程序重新执行。 -------------------------------------------------
[单片机]
<font color='red'>STM32</font>的独立看门狗(IWDG)
STM32延时函数的方法
STM32延时函数的方法 1.普通延时法 这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。 2.SysTick 定时器延时 CM3 内核的处理器,内部包含了一个SysTick 定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD寄存器中自动重装载定时初值。 延时函数delay的编写 原理:3层for循环,循环次数是 NUM = 4X5X248 = 4960次,由每次循环都有条件判断(如 i 》0)和自减语句(如 i--),因此每次循环又耗费两个机器周期 所以,总耗费的机器周期为 SUM = NUM x 2 = 9920个。 整合自:CS
[单片机]
STM32实战五 板载LED显示数据
写到第五章,终于有可以看见的结果了。不过磨刀不误砍柴功。正因为前面的基础,才有今天的成果,而且有一定的实用价值。封装一个BoardLED类,主要功能是利用板载LED显示数据,类似于 Morse code 电报码,以点亮时间的长短表示二进制数据的0和1,最多4位二进制,十进制15,可以扩展到更多。下面的程序显示主循环周期时间,单位1us,实际上可以用来显示设置运行状态。购买或开发不同的开发板,LED对应的脚号不同,修改程序对应的IO号即可。 BoardLED.h 代码中用到了前几章的封装类,需要前面的原程序,全部做完以后做一个总的封包,上传到资源库中。 #ifndef __BOARDLED__ #define __BOARD
[单片机]
<font color='red'>STM32</font>实战五 板载LED显示数据
STM32ADC采样时间、采样周期、采样频率计算方法
ADC转换就是输入模拟的信号量,单片机转换成数字量。读取数字量必须等转换完成后,完成一个通道的读取叫做采样周期。采样周期一般来说=转换时间+读取时间 。而转换时间=采样时间+12.5个时钟周期。采样时间是你通过寄存器告诉 STM32 采样模拟量的时间,设置越长越精确 一 STM32 ADC采样频率的确定 1. :先看一些资料,确定一下ADC的时钟: (1),由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)同步。CLK控制器为ADC时钟提供一个专用的可编程预分频器。 (2) 一般情况下在程序 中将 PCLK2 时钟设为 与系统时钟 相同 RCC_HCLKConfig(RCC_SYSCLK_Div1); RC
[单片机]
51单片机(二十六)—— 独立按键数码管显示
在这片文章中,我们对独立按键的使用进行进一步研究,用数码管来显示按键的状态。这个实验的主要代码如下所示。 main() { for(n=0;n 8;n++) //给showdata数组赋初值 showdata =0; KEY1=1; KEY2=1; KEY3=1; KEY4=1; KEY5=1; KEY6=1; KEY7=1; KEY8=1; init_T0(); for(;;) { if(KEY1==0) //按键KEY1按下 { delay1ms(10); //延时10ms去抖 if(KEY1==0) //再次判断按键KEY1按下 {
[单片机]
STM32单片机半主机模式的应用
在keil中编程时常会遇到__use_no_semihosting_swi的警告,这时你就是进入了半主机模式。 在嵌入式的编程中你是避免不了使用printf、fopen、fclose等函数的但是因为嵌入式的程序中并没有对这些函数的底层实现,使得设备运行时会进入软件中断BAEB处,这时就需要__use_no_semihosting_swi这 个声明,使程序遇到这些文件操作函数时不停在此中断处,具体操作如下,将下列程序加入你的工程中: #pragmaimport(__use_no_semihosting_swi)#pragmaimport(_main_redirection)constchar__stdin_name[150]
[单片机]
基于STM32的远程温控系统设计
温度控制是工业控制的主要对象之一,常用的温控数学模型是一阶惯性加上纯滞后环节,但其随着加热对象和环境条件的不同,会存在着较大的差异。因为温控对象这种较为普遍的含有纯滞后环节的特点,容易引起系统超调和持续的振荡,温度控制对象的参数会发生幅度较大的变化。因此无法采用传统的控制方法(如常规的PID控制)对温度进行有效的控制,而智能控制不需要对象的精确数学模型就可以对系统实施控制 。温度控制多采用由单片机系统来实现温度控制,其缺点是远程控制系统复杂,可靠性差,特别是当控制点较多、距离较远时,采取总线方式的通讯出错概率较高,影响到温度的控制精度 。   目前,多家厂商(如日本导电、岛通)均推出精度可达0.1级的基于PID算法的智能型温控仪
[工业控制]
基于<font color='red'>STM32</font>的远程温控系统设计
小广播
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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