马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1. LED Blink(闪耀)
代码主体包罗:LED.c key.c main.c delay.c(延时防按键抖动)
步伐代码如下(涉及RCC与GPIO两个外设):
1.使用RCC使能GPIO时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开APB2时钟
复制代码 2.GPIO-Init函数初始化GPIO
使用该函数,需要首先举行布局体的初始化
- /*GPIO初始化*/
- GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式----GPIO模式共8种模式,4种输入,4种输出
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO引脚,赋值为第0号引脚
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数
- //函数内部会自动根据结构体的参数配置相应寄存器
- //实现GPIOA的初始化
复制代码 3.使用输出或输入函数控制GPIO口(设置端口的高低电平)
将I/O口置高电平---三种方法(库函数)
GPIO_SetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为高电平
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //将PA0引脚设置为高电平
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1); //将PA0引脚设置为高电平
将I/O口置低电平---三种方法(库函数)
GPIO_ResetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为低电平
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); //将PA0引脚设置为低电平
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); //将PA0引脚设置为低电平
- /*设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法*/
-
- /*方法1:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平*/
- GPIO_ResetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为低电平
- Delay_ms(500); //延时500ms
- GPIO_SetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为高电平
- Delay_ms(500); //延时500ms
-
- /*方法2:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定*/
- GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); //将PA0引脚设置为低电平
- Delay_ms(500); //延时500ms
- GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //将PA0引脚设置为高电平
- Delay_ms(500); //延时500ms
-
- /*方法3:GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强转为BitAction类型*/
- GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); //将PA0引脚设置为低电平
- Delay_ms(500); //延时500ms
- GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1); //将PA0引脚设置为高电平
- Delay_ms(500); //延时500ms
复制代码
2.蜂鸣器 buzzer
原理与LED类似,都是打开对应的GPIO口,赋高低电平
1.使用RCC使能GPIO时钟
2.GPIO-Init函数初始化GPIO
3.使用输出或输入函数控制GPIO口(设置端口的高低电平)
- int main(void)
- {
- /*开启时钟*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟
- //使用各个外设前必须开启时钟,否则对外设的操作无效
-
- /*GPIO初始化*/
- GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //GPIO引脚,赋值为第12号引脚
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
-
- GPIO_Init(GPIOB, &GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数
- //函数内部会自动根据结构体的参数配置相应寄存器
- //实现GPIOB的初始化
-
- /*主循环,循环体内的代码会一直循环执行*/
- while (1)
- {
- GPIO_ResetBits(GPIOB, GPIO_Pin_12); //将PB12引脚设置为低电平,蜂鸣器鸣叫
- Delay_ms(100); //延时100ms
- GPIO_SetBits(GPIOB, GPIO_Pin_12); //将PB12引脚设置为高电平,蜂鸣器停止
- Delay_ms(100); //延时100ms
- GPIO_ResetBits(GPIOB, GPIO_Pin_12); //将PB12引脚设置为低电平,蜂鸣器鸣叫
- Delay_ms(100); //延时100ms
- GPIO_SetBits(GPIOB, GPIO_Pin_12); //将PB12引脚设置为高电平,蜂鸣器停止
- Delay_ms(700); //延时700ms
- }
- }
复制代码 3.按键控制LED
key.c部分
类似的,在key.c中首先举行初始化按键端口初始化
1.使用RCC使能GPIO时钟
2.GPIO-Init函数初始化GPIO
- /**
- * 函 数:按键初始化
- * 参 数:无
- * 返 回 值:无
- */
- void Key_Init(void)
- {
- /*开启时钟*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟
-
- /*GPIO初始化*/
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure); //将PB1和PB11引脚初始化为上拉输入
- }
复制代码 其次,按键获取键码,通过库函数来读取寄存器的值
- GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)
复制代码
- /**
- * 函 数:按键获取键码
- * 参 数:无
- * 返 回 值:按下按键的键码值,范围:0~2,返回0代表没有按键按下
- * 注意事项:此函数是阻塞式操作,当按键按住不放时,函数会卡住,直到按键松手
- */
- uint8_t Key_GetNum(void)
- {
- uint8_t KeyNum = 0; //定义变量,默认键码值为0
-
- if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) //读PB1输入寄存器的状态,如果为0,则代表按键1按下
- {
- Delay_ms(20); //延时消抖
- while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0); //等待按键松手
- Delay_ms(20); //延时消抖
- KeyNum = 1; //置键码为1
- }
-
- if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0) //读PB11输入寄存器的状态,如果为0,则代表按键2按下
- {
- Delay_ms(20); //延时消抖
- while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0); //等待按键松手
- Delay_ms(20); //延时消抖
- KeyNum = 2; //置键码为2
- }
-
- return KeyNum; //返回键码值,如果没有按键按下,所有if都不成立,则键码为默认值0
- }
复制代码
LED.c部分
将这两步封装为 初始化函数,第三步输出高低电平封装为功能函数
1.使用RCC使能GPIO时钟
2.GPIO-Init函数初始化GPIO
- /**
- * 函 数:LED初始化
- * 参 数:无
- * 返 回 值:无
- */
- void LED_Init(void)
- {
- /*开启时钟*/
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
-
- /*GPIO初始化*/
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA1和PA2引脚初始化为推挽输出
-
- /*设置GPIO初始化后的默认电平*/
- GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2); //设置PA1和PA2引脚为高电平
- }
复制代码- /**
- * 函 数:LED1开启
- * 参 数:无
- * 返 回 值:无
- */
- void LED1_ON(void)
- {
- GPIO_ResetBits(GPIOA, GPIO_Pin_1); //设置PA1引脚为低电平
- }
- /**
- * 函 数:LED1关闭
- * 参 数:无
- * 返 回 值:无
- */
- void LED1_OFF(void)
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_1); //设置PA1引脚为高电平
- }
- /**
- * 函 数:LED1状态翻转
- * 参 数:无
- * 返 回 值:无
- */
- void LED1_Turn(void)
- {
- if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0) //获取输出寄存器的状态,如果当前引脚输出低电平
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_1); //则设置PA1引脚为高电平
- }
- else //否则,即当前引脚输出高电平
- {
- GPIO_ResetBits(GPIOA, GPIO_Pin_1); //则设置PA1引脚为低电平
- }
- }
- /**
- * 函 数:LED2开启
- * 参 数:无
- * 返 回 值:无
- */
- void LED2_ON(void)
- {
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); //设置PA2引脚为低电平
- }
- /**
- * 函 数:LED2关闭
- * 参 数:无
- * 返 回 值:无
- */
- void LED2_OFF(void)
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_2); //设置PA2引脚为高电平
- }
- /**
- * 函 数:LED2状态翻转
- * 参 数:无
- * 返 回 值:无
- */
- void LED2_Turn(void)
- {
- if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0) //获取输出寄存器的状态,如果当前引脚输出低电平
- {
- GPIO_SetBits(GPIOA, GPIO_Pin_2); //则设置PA2引脚为高电平
- }
- else //否则,即当前引脚输出高电平
- {
- GPIO_ResetBits(GPIOA, GPIO_Pin_2); //则设置PA2引脚为低电平
- }
- }
复制代码 main.c部分
- int main(void)
- {
- /*模块初始化*/
- LED_Init(); //LED初始化
- Key_Init(); //按键初始化
-
- while (1)
- {
- KeyNum = Key_GetNum(); //获取按键键码
-
- if (KeyNum == 1) //按键1按下
- {
- LED1_Turn(); //LED1翻转
- }
-
- if (KeyNum == 2) //按键2按下
- {
- LED2_Turn(); //LED2翻转
- }
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |