本帖最后由 e芯凌 于 2019-11-10 22:25 编辑
整体操作思路: 读取IO口输入电平调用库函数为: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_tGPIO_Pin);
读取IO口输入电平操作寄存器为: GPIOx_IDR:端口输入寄存器
使用位带操作读取IO口输入电平: PEin(4) -读取GPIOE.4口电平 PEin(n) -读取GPIOE.n口电平
使能按键对应IO口时钟。调用函数: RCC_APB2PeriphClockCmd(); 初始化IO模式:上拉/下拉输入。调用函数: GPIO_Init(); 扫描IO口电平(库函数/寄存器/位操作)。
C语言知识static
Static申明的局部变量,存储在静态存储区。 它在函数调用结束之后,不会被释放。它的值会一直保留下来。 所以可以说static申明的局部变量,具有记忆功能。
key.h
- #ifndef __KEY_H
- #define __key_h
- #include "sys.h"
- #define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
- #define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
- #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,支持连续按
- 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
- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "beep.h"
- 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);
- }
- }
复制代码
led.c led.h beep.c beep.h代码可以从我别的帖子里找
|