查看: 3842|回复: 59
打印 上一主题 下一主题

【转帖】STM32开发板入门教程(二) - 按键 + 蜂鸣器

[复制链接] qrcode

136

主题

868

帖子

1880

积分

金牌会员

Rank: 6Rank: 6

积分
1880
楼主
跳转到指定楼层
发表于 2015-11-1 11:26 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

豆皮 - STM32开发板入门教程(二) - 按键 + 蜂鸣器 (原创)

版权所有 STMFANS 原创,转载请保留出处


http://www.stmfans.com/bbs/viewthread.php?tid=1064&extra=page%3D1

呵呵 在教程一的基础上 继续做偶们的按键和蜂鸣器
呵呵 豆皮板子上一共有5个按键(4个功能按键 + 一个RESET按键)
那么 选择 LED5 LED6 LED7 LED8 与按键 KEY1 KEY2 KEY3 KEY4 一一对应
按键按下的时候 对应的LED灯就亮起来 然后只要有按键安下 蜂鸣器就响 呵呵
初始化

//配置KEY使用的GPIO口
KEY_GPIO_Configuration();



//配置buzzer蜂鸣器使用的端口
BUZZER_GPIO_Configuration();

分别对应的函数体

按键的初始化函数体
/*******************************************************************************
* Function Name : KEY_GPIO_Configuration
* Description : Configures the KEY GPIO ports.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
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);
}
蜂鸣器的初始化函数体
/*******************************************************************************
* Function Name : BUZZER_GPIO_Configuration
* Description : Configures the BUZZER GPIO ports.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
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);
}
蜂鸣器的接法 也是标准接法 呵呵 如下图所示


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
沙发
发表于 2015-11-6 11:33 AM | 只看该作者
程序的流程是:
1. 依次扫描4个按键 使用一个u8变量的低4位存储扫描结果 如果对应位上的按键被按下 则该位置1 否则 置0 可以支持多个按键同时按下
2. 处理扫描结果 依次判断u8变量的低4位 如果某个按键被按下 则点亮对应的LED灯
3. 判断当前是否有按键按下 如果有 则蜂鸣器响 否则 蜂鸣器不响


按键扫描函数
/*******************************************************************************
* Function Name : KEY_GPIO_Scanning
* Description : 依次扫描4个按键 使用一个u8变量的低4位存储扫描结果
* Input : None
* Output : None
* Return : 扫描的结果 有效数据是低4位
*******************************************************************************/
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;
}
按键处理函数
/*******************************************************************************
* Function Name : LED_For_Key_Shine
* Description : 按键处理函数
* Input : u8 变量 按键扫描结果
* Output : None
* Return : None
*******************************************************************************/
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);
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

0

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
板凳
发表于 2015-11-22 10:53 AM | 只看该作者
谢谢,为我们新学员提供了宝贵的资源                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
地板
发表于 2015-11-29 07:18 AM | 只看该作者
比较适合初学入门教程                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
5#
发表于 2015-12-19 04:01 AM | 只看该作者
值得研究                                                                                                                                                                       
回复 支持 反对

使用道具 举报

4

主题

25

帖子

58

积分

注册会员

Rank: 2

积分
58
6#
发表于 2015-12-31 12:32 AM | 只看该作者
谢谢!                                                                                                                                                                       
回复 支持 反对

使用道具 举报

1

主题

15

帖子

35

积分

新手上路

Rank: 1

积分
35
7#
发表于 2015-3-10 03:31 AM | 只看该作者
谢谢了                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

3

帖子

8

积分

新手上路

Rank: 1

积分
8
8#
发表于 2015-3-25 06:10 AM | 只看该作者
比较适合初学入门教程                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

4

帖子

10

积分

新手上路

Rank: 1

积分
10
9#
发表于 2015-5-19 07:03 AM | 只看该作者
download                                                                                                                                                                       
回复 支持 反对

使用道具 举报

1

主题

28

帖子

61

积分

注册会员

Rank: 2

积分
61
10#
发表于 2015-6-28 02:27 AM | 只看该作者
OK                                                                                                                                                                       
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表