按键控制LED
按键抖动,电平发生变化,可用延时函数抵消按键抖动对系统的影响
传感器电路图
按键电路图
c语言对应类型
“_t”后缀表示使用typedef重命名的数据类型
枚举类型
# include <iostream>
using namespace std;
typedef enum {
Mon= 1 ,
Tue= 2 ,
Wed= 3
} week_t ;
int main ( ) {
week_t w;
w= Wed;
cout << w << endl;
return 0 ;
}
按键控制LED灯
主函数
# include "stm32f10x.h"
# include "MyDelay.h"
# include "Delay.h"
# include "Button.h"
# include "stdio.h"
uint8_t KeyNum ;
int main ( void ) {
Led_Init ( ) ;
Button_Init ( ) ;
while ( 1 ) {
KeyNum = Key_GetNum ( ) ;
if ( KeyNum== 1 ) {
Led_One_Turn ( ) ;
}
if ( KeyNum== 2 ) {
Led_Two_Turn ( ) ;
}
}
return 0 ;
}
Button
# ifndef Led_h
# define led_h
void Led_Init ( void ) ;
void Button_Init ( void ) ;
uint8_t Key_GetNum ( void ) ;
void Led_One_Turn ( void ) ;
void Led_Two_Turn ( void ) ;
# endif
# include "stm32f10x.h"
# include "Delay.h"
# include "stdio.h"
void Led_Init ( void ) {
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA, ENABLE) ;
GPIO_InitTypeDef GI;
GI. GPIO_Mode = GPIO_Mode_Out_PP;
GI. GPIO_Pin = GPIO_Pin_All;
GI. GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init ( GPIOA, & GI) ;
GPIO_SetBits ( GPIOA, GPIO_Pin_0| GPIO_Pin_1) ;
}
void Button_Init ( void ) {
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOB, ENABLE) ;
GPIO_InitTypeDef Button;
Button. GPIO_Mode = GPIO_Mode_IPU;
Button. GPIO_Pin = GPIO_Pin_1| GPIO_Pin_11;
Button. GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init ( GPIOB, & Button) ;
}
uint8_t Key_GetNum ( void ) {
uint8_t KeyNum= 0 ;
if ( GPIO_ReadInputDataBit ( GPIOB, GPIO_Pin_1) == 0 ) {
Delay_ms ( 20 ) ;
while ( GPIO_ReadInputDataBit ( GPIOB, GPIO_Pin_1) == 0 ) ;
Delay_ms ( 20 ) ;
KeyNum= 1 ;
}
if ( GPIO_ReadInputDataBit ( GPIOB, GPIO_Pin_11) == 0 ) {
Delay_ms ( 20 ) ;
while ( GPIO_ReadInputDataBit ( GPIOB, GPIO_Pin_11) == 0 ) ;
Delay_ms ( 20 ) ;
KeyNum= 2 ;
}
return KeyNum;
}
void Led_One_Turn ( void ) {
uint8_t Light_Status = GPIO_ReadInputDataBit ( GPIOA, GPIO_Pin_0) ;
if ( Light_Status== 0 ) GPIO_WriteBit ( GPIOA, GPIO_Pin_0, Bit_SET) ;
else GPIO_WriteBit ( GPIOA, GPIO_Pin_0, Bit_RESET) ;
}
void Led_Two_Turn ( void ) {
uint8_t Light_Status = GPIO_ReadInputDataBit ( GPIOA, GPIO_Pin_1) ;
if ( Light_Status== 0 ) GPIO_WriteBit ( GPIOA, GPIO_Pin_1, Bit_SET) ;
else GPIO_WriteBit ( GPIOA, GPIO_Pin_1, Bit_RESET) ;
}
光敏传感蜂鸣器(绿灯常亮,光线变暗,红灯亮,警报响起,光线恢复,警报解除)
# ifndef Buzzer
# define Buzzer
uint8_t Read_Buzzer_Data ( void ) ;
void Buzzer_PhotoResitors_Init ( void ) ;
void Reaction_PhotoResitors ( void ) ;
void Buzzer_Ring ( void ) ;
void Buzzer_Slient ( void ) ;
# endif
# include "stm32f10x.h"
# include "Button.h"
# include "Delay.h"
uint8_t Read_Buzzer_Data ( void ) {
return GPIO_ReadInputDataBit ( GPIOB, GPIO_Pin_13) ;
}
void Buzzer_PhotoResitors_Init ( void ) {
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOB, ENABLE) ;
GPIO_InitTypeDef Buzzer;
Buzzer. GPIO_Mode = GPIO_Mode_IPU;
Buzzer. GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_12;
Buzzer. GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init ( GPIOB, & Buzzer) ;
GPIO_WriteBit ( GPIOB, GPIO_Pin_12, Bit_SET) ;
}
void Buzzer_Ring ( void ) {
GPIO_WriteBit ( GPIOA, GPIO_Pin_0, Bit_RESET) ;
GPIO_WriteBit ( GPIOA, GPIO_Pin_1, Bit_SET) ;
while ( 1 ) {
GPIO_WriteBit ( GPIOB, GPIO_Pin_12, Bit_RESET) ;
Delay_ms ( 200 ) ;
GPIO_WriteBit ( GPIOB, GPIO_Pin_12, Bit_SET) ;
Delay_ms ( 300 ) ;
GPIO_WriteBit ( GPIOB, GPIO_Pin_12, Bit_RESET) ;
Delay_ms ( 300 ) ;
GPIO_WriteBit ( GPIOB, GPIO_Pin_12, Bit_SET) ;
Delay_ms ( 100 ) ;
GPIO_WriteBit ( GPIOB, GPIO_Pin_12, Bit_RESET) ;
Delay_ms ( 200 ) ;
GPIO_WriteBit ( GPIOB, GPIO_Pin_12, Bit_SET) ;
Delay_ms ( 300 ) ;
break ;
}
}
void Buzzer_Slient ( void ) {
GPIO_WriteBit ( GPIOA, GPIO_Pin_0, Bit_SET) ;
GPIO_WriteBit ( GPIOA, GPIO_Pin_1, Bit_RESET) ;
GPIO_WriteBit ( GPIOB, GPIO_Pin_12, Bit_SET) ;
}
void Reaction_PhotoResitors ( void ) {
uint8_t RP = GPIO_ReadInputDataBit ( GPIOB, GPIO_Pin_13) ;
if ( RP== 1 ) Buzzer_Ring ( ) ;
else Buzzer_Slient ( ) ;
}
项目结构