豆皮 - STM32开发板入门教程(二) - 按键 + 蜂鸣器
(原创)
版权所有 STMFANS
原创,转载请保留出处
呵呵 在教程一的基础上 继续做偶们的按键和蜂鸣器
呵呵 豆皮板子上一共有5个按键(4个功能按键 + 一个RESET按键)
那么 选择 LED5
LED6
LED7 LED8 与按键
KEY1 KEY2
KEY3 KEY4
一一对应
按键按下的时候 对应的LED灯就亮起来 然后只要有按键安下 蜂鸣器就响 呵呵
初始化
//配置KEY使用的GPIO口
KEY_GPIO_Configuration();
和
//配置buzzer蜂鸣器使用的端口
BUZZER_GPIO_Configuration();
分别对应的函数体
按键的初始化函数体
void KEY_GPIO_Configuration(void)
{
GPIO_InitTypeDef
GPIO_InitStructure;
//按键使用的GPIOC
的 Pin6 Pin7 Pin8 端口
GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 ;
// GPIO口的速度
作为按键 10MHz 对于一般的用途 足以 呵呵
GPIO_InitStructure.GPIO_Speed
= GPIO_Speed_10MHz;
//按键端口设置为
浮空输入
GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC,
&GPIO_InitStructure);
//按键使用的GPIOB
的 Pin15 端口
GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_15 ;
// GPIO口的速度
作为按键 10MHz 对于一般的用途 足以 呵呵
GPIO_InitStructure.GPIO_Speed
= GPIO_Speed_10MHz;
//按键端口设置为
浮空输入
GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,
&GPIO_InitStructure);
}
蜂鸣器的初始化函数体
void BUZZER_GPIO_Configuration(void)
{
GPIO_InitTypeDef
GPIO_InitStructure;
//蜂鸣器使用的GPIOB
的 Pin9 端口
GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_9 ;
//蜂鸣器的IO口速度暂时也设置为10MHz 如果以后想用PWM控制蜂鸣器发出各种不同声音
就需要把速度设置高一点
GPIO_InitStructure.GPIO_Speed
= GPIO_Speed_10MHz;
//蜂鸣器端口设置为
推挽输出
GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,
&GPIO_InitStructure);
}
蜂鸣器的接法 也是标准接法 呵呵 如下图所示
程序的流程是:
1. 依次扫描4个按键 使用一个u8变量的低4位存储扫描结果 如果对应位上的按键被按下 则该位置1 否则
置0 可以支持多个按键同时按下
2. 处理扫描结果 依次判断u8变量的低4位 如果某个按键被按下 则点亮对应的LED灯
3. 判断当前是否有按键按下 如果有 则蜂鸣器响 否则 蜂鸣器不响
按键扫描函数
u8 KEY_GPIO_Scanning(void)
{
u8
scan_bit; //单个按键扫描变量
u8
scan_sum; //四个按键总的情况变量
scan_sum低四位的每一位对应一个按键
scan_bit =
0;
scan_sum =
0;
//扫描按键
scan_bit =
GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8);
//如果按键按下 则延迟
再扫描 然后根据判断处理
if( 0x01 ==
scan_bit )
{
delay();
scan_bit =
0;
scan_bit =
GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8);
if( 0x01 ==
scan_bit )
scan_sum |=
GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8);
scan_bit =
0;
}
scan_bit =
GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7);
if( 0x01 ==
scan_bit )
{
delay();
scan_bit =
0;
scan_bit =
GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7);
if( 0x01 ==
scan_bit )
scan_sum |=
GPIO_ReadInputDataBit(GPIOC,
GPIO_Pin_7)<<1;
scan_bit =
0;
}