STM32开发板入门教程(二) - 按键 + 蜂鸣器_henhen2002_新浪博客

豆皮 - 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);
}
蜂鸣器的接法 也是标准接法 呵呵 如下图所示

STM32开发板入门教程(二) <wbr>- <wbr>按键 <wbr>+ <wbr>蜂鸣器

 

程序的流程是:
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;
        }
        
        scan_bit = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6);
        if( 0x01 == scan_bit )
        {
                delay();
                scan_bit = 0;
                scan_bit = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6);
                if( 0x01 == scan_bit )
                        scan_sum |= GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6)<<2;
                scan_bit = 0;
        }
        
        scan_bit = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15);
        if( 0x01 == scan_bit )
        {
                delay();
                scan_bit = 0;
                scan_bit = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15);
                if( 0x01 == scan_bit )
                        scan_sum |= GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15)<<3;
                scan_bit = 0;
        }
        
return scan_sum;
}
按键处理函数

void LED_For_Key_Shine(u8 scan_sum)
{
        //使用一个8位变量 表示当前是否有按键按下
        // 初始值为4 如果没有按键按下 扫描完scan_sum之后 该值为0  如果该值不为0 则证明有按键按下
        u8 key_count = 4 ;
   
        if( scan_sum & 0x01 )
        {
                GPIO_SetBits(GPIOD, GPIO_Pin_2);
                key_count--;
        }
        else
        {
                GPIO_ResetBits(GPIOD, GPIO_Pin_2);
                key_count++;
        }
  
        if( scan_sum & 0x02 )
        {
                GPIO_SetBits(GPIOD, GPIO_Pin_3);
                key_count--;
        }
        else
        {
                GPIO_ResetBits(GPIOD, GPIO_Pin_3);
                key_count++;
        }
  
        if( scan_sum & 0x04 )
        {
                GPIO_SetBits(GPIOD, GPIO_Pin_4);
                key_count--;
        }
        else
        {
                GPIO_ResetBits(GPIOD, GPIO_Pin_4);
                key_count++;
        }
   
        if( scan_sum & 0x08 )
        {
                GPIO_SetBits(GPIOD, GPIO_Pin_5);
                key_count--;
        }
        else
        {
                GPIO_ResetBits(GPIOD, GPIO_Pin_5);  
                key_count++;
        }
      
        //如果 key_count为0 则表示当前没有按键被按下 蜂鸣器不响 否则 蜂鸣器响
        if( key_count == 0 )
                GPIO_ResetBits(GPIOB, GPIO_Pin_9);
        else
                GPIO_SetBits(GPIOB, GPIO_Pin_9);
}
rar

已投稿到:
郑重声明:资讯 【STM32开发板入门教程(二) - 按键 + 蜂鸣器_henhen2002_新浪博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——