完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
按键消抖 由于实验与按键有关,既然有按键,那就必须要解释下按键消抖。 原理: 读取按键电平(按下为1,松开为0) 当读到1的时候(按键好像被按下了) 那么我们延时10ms再读 若按键读到为1(说明按键真的被按下了)——执行操作 若按键读到为0(说明这只是一次机械抖动,咱们不用理他!) 基于按键消抖原理编的按键扫描函数: int key_scan() { static u8 flag = 1; if(flag==1&&(KEY0==0||KEY1==0||KEY2==0)) { delay_ms(10); //延时10ms再读 flag = 0; if(KEY0==0) { return 1; }else if(KEY1==0){ return 2; }else if(KEY2==0){ return 3; } }else if(KEY0==1&&KEY0==1&&KEY2==1) flag = 1; return 0; 按键端口的定义 为了实现使用按键来驱动Led,我们需要对按键和端口进行一些定义,如下: ifndef _KEY_H #define _KEY_H #include "sys.h" #define KEY0 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9)//定义PE9为KEY0 #define KEY1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8)//定义PE8为KEY1 #define KEY2 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_7)//定义PE7为KEY2 #endif 然后我们就可以通过按键来驱动端口啦,不过还需要进行一个步骤,那就是对我们所需要的端口进行初始化(GPIO配置)。 初始化所需要的端口 本实验所需要的三个端口分别为PE7,PE8和PE9。所以我们开始配置; //初始化PE7,8,9 void key_init() { GPIO_InitTypeDef GPIO_InitStruture; //初始化GPIO(设置引脚、传输速率、输入输出模式) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //打开PE时钟 GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU; //设置为上拉输入 GPIO_InitStruture.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8 | GPIO_Pin_7;//驱动PE7,PE8,PE9三个端口 GPIO_Init(GPIOE,&GPIO_InitStruture); //初始化GPIOE的参数为以上结构体 } 主函数及其他 //主函数 #include "stm32f10x.h" #include "delay.h" #include "led.h" #include "key.h" int main(void) { u8 key=0; key_init(); led_init(); delay_init(); while(1) { key = key_scan(); if(key) { switch(key){ case 1: PEout(1)=!PEout(1); break; case 2: PEout(0)=!PEout(0); break; case 3: PBout(9)=!PBout(9); break; } } } } //key.c #include "key.h" #include "stm32f10x.h" #include "delay.h" //初始化PE7,8,9 void key_init() { GPIO_InitTypeDef GPIO_InitStruture; //初始化GPIO(设置引脚、传输速率、输入输出模式) RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //打开PE时钟 GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU; //设置为上拉输入 GPIO_InitStruture.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8 | GPIO_Pin_7; //驱动PE7,PE8,PE9三个端口 GPIO_Init(GPIOE,&GPIO_InitStruture); //初始化GPIOE的参数为以上结构体 } //按键扫描函数 int key_scan() { static u8 flag = 1; if(flag==1&&(KEY0==0||KEY1==0||KEY2==0)) { delay_ms(10);//按键消抖 flag = 0; if(KEY0==0) { return 1; }else if(KEY1==0){ return 2; }else if(KEY2==0){ return 3; } }else if(KEY0==1&&KEY0==1&&KEY2==1) flag = 1; return 0; } //key.h #ifndef _KEY_H #define _KEY_H #include "sys.h" #define KEY0 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_9)//定义PE9为KEY0 #define KEY1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8)//定义PE8为KEY1 #define KEY2 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_7)//定义PE7为KEY2 void key_init(); int key_scan(); #endif 接线 本实验我们要用到矩阵键盘和我们的主板,我们用到的矩阵键盘有四行:R1~4, 和四列:C1~4。 由于我们这个实验要求用到三个按键,所以我选择了同一行的三个按键。 接线方式是先把想用的行接地,然后再把想用的列的三条线分别接到PE7,PE8和PE9上。 接线完毕,图如下: load与运行调试 所有准备工作都做完啦!接下来我们该进行按键驱动啦! 按键驱动小实验 |
|
|
|
只有小组成员才能发言,加入小组>>
3269 浏览 9 评论
2947 浏览 16 评论
3446 浏览 1 评论
8967 浏览 16 评论
4041 浏览 18 评论
1084浏览 3评论
562浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
556浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2294浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1849浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-13 04:18 , Processed in 0.865820 second(s), Total 49, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号