工具:正点原子战舰V3 主题:IO口做输入———按键输入跑马灯 程序:寄存器版本
不能连续按下
#include "delay.h" //按键初始化函数 void KEY_Init(void) { RCC->APB2ENR|=1<<2; //使能PORTA时钟 RCC->APB2ENR|=1<<6; //使能PORTE时钟 GPIOA->CRL&=0XFFFFFFF0; //PA0设置成输入,默认下拉 GPIOA->CRL|=0X00000008; GPIOE->CRL&=0XFFF000FF; //PE2~4设置成输入 GPIOE->CRL|=0X00088800; GPIOE->ODR|=7<<2; //PE2~4 上拉 } //按键处理函数 //返回按键值 //mode:0,不支持连续按;1,支持连续按; //0,没有任何按键按下 //1,KEY0按下 //2,KEY1按下 //3,KEY2按下 //4,KEY3按下 WK_UP //注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!! u8 KEY_Scan(u8 mode) { static u8 key_up=1;//按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)) { delay_ms(10);//去抖动 key_up=0; if(KEY0==0)return 1; else if(KEY1==0)return 2; else if(KEY2==0)return 3; else if(WK_UP==1)return 4; }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1; return 0;// 无按键按下 }主程序:
#include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "beep.h" #include "key.h" //ALIENTEK战舰STM32开发板实验3 //按键输入 实验 //技术支持:www.openedv.com //广州市星翼电子科技有限公司 int main(void) { u8 key=0; Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 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 KEY2_PRES: //控制LED0翻转 LED0=!LED0; break; case KEY1_PRES: //控制LED1翻转 LED1=!LED1; break; case KEY0_PRES: //同时控制LED0,LED1翻转 LED0=!LED0; LED1=!LED1; break; } }else delay_ms(10); } }主程序: (调用函数一样) 能连续按下:
#include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "beep.h" #include "key.h" //ALIENTEK战舰STM32开发板实验3 //按键输入 实验 //技术支持:www.openedv.com //广州市星翼电子科技有限公司 int main(void) { u8 key=0; Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 LED_Init(); //初始化与LED连接的硬件接口 BEEP_Init(); //初始化蜂鸣器端口 KEY_Init(); //初始化与按键连接的硬件接口 LED0=0; //先点亮红灯 while(1) { key=KEY_Scan(0); //得到键值 if(key) { switch(key) { case WKUP_PRES: //控制蜂鸣器 BEEP=!BEEP;delay_ms(100); break; case KEY2_PRES: //控制LED0翻转 LED0=!LED0;delay_ms(100); break; case KEY1_PRES: //控制LED1翻转 LED1=!LED1;delay_ms(100); break; case KEY0_PRES: //同时控制LED0,LED1翻转 LED0=!LED0; LED1=!LED1;delay_ms(100); break; } }else delay_ms(100); } }区别:
static //有记忆功能 eg: int key(void) { static int a=0; a++; return a; }//当每次调用key函数之后,返回值都+1 static声明的局部变量,存储在静态存储区 它在函数调用结束后,不会被释放。它的值会一直保留下来。new get: 1.
unsigned char = u8; unsigned short int =u16; unsigned long int =u32;什么是上/下拉电阻(战舰V3按键是共阴极,按下时io输入检测到低电平) 上拉电阻:把一个不确定的信号通过电阻连接到高电平,使得信号初始为高电平; 下拉电阻:把一个不确定的信号通过电阻连接到低电平,使得信号初始为低电平; 3.上拉电阻的作用: 提高电路稳定性,避免引起误动作; 提高输出管脚的带载能力; 4.上拉电阻一般的适用场景: 按键检测 IIC
思考: 1.
Stm32_Clock_Init(9);//这句代码设置了什么 delay_init(72); //延时初始化 ,72怎么来的,表示什么注:以上程序来自正点原子的视频,资料包等处,由于本人习惯用寄存器的程序,所以就只有寄存器版本,支持连续按下的程序是我改动之后,为了效果更明显就加了延迟。
