#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "24cxx.h" #include "OLED4PINiic.h"#include "usart.h" #include "time.h" #include "74HC595_led.h"在这些头文件的基础上,编程实现控制STM32F103XC8T6实验板上LED的开关和频闪的快慢,实验板上有4个按键,从按键1至4被按下,LED闪烁频率实现由低到高的转变,请给出具体实现代码
时间: 2023-07-19 20:43:07 浏览: 86
STM32H743VIT6模拟IIC读写AT24CXX例程.rar
以下是实现代码:
```c
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "24cxx.h"
#include "OLED4PINiic.h"
#include "usart.h"
#include "time.h"
#include "74HC595_led.h"
int main(void)
{
u8 led_status = 0; // LED 状态,0 表示关,1 表示开
u8 key_value = 0; // 按键值
u8 freq_level = 0; // LED 闪烁频率等级,0 表示最低频率,3 表示最高频率
u16 freq_delay[4] = {1000, 500, 250, 125}; // 不同频率对应的延时时间
u8 freq_index = 0; // 当前闪烁频率对应的延时时间数组下标
LED_Init(); // 初始化 LED
KEY_Init(); // 初始化按键
while (1)
{
key_value = KEY_Scan(0); // 扫描按键,返回按键值
switch (key_value)
{
case KEY1_PRES:
freq_index = 0; // 切换到最低频率
break;
case KEY2_PRES:
freq_index = 1; // 切换到中低频率
break;
case KEY3_PRES:
freq_index = 2; // 切换到中高频率
break;
case KEY4_PRES:
freq_index = 3; // 切换到最高频率
break;
default:
break;
}
// 根据当前频率等级设置延时时间
delay_ms(freq_delay[freq_index]);
// 切换 LED 状态并控制 LED 闪烁频率
if (led_status == 0)
{
LED0 = 1; // 打开 LED
delay_ms(freq_delay[freq_index]); // 延时一段时间
LED0 = 0; // 关闭 LED
delay_ms(freq_delay[freq_index]); // 延时一段时间
}
else
{
LED0 = 1; // 打开 LED
delay_ms(freq_delay[freq_index] * 2); // 延时一段时间
LED0 = 0; // 关闭 LED
delay_ms(freq_delay[freq_index] * 2); // 延时一段时间
}
// 切换 LED 状态
led_status = !led_status;
}
}
```
这段代码使用 `KEY_Scan()` 函数扫描按键,根据按键值切换 LED 闪烁频率等级,然后根据当前频率等级控制 LED 的闪烁频率和开关状态。其中,闪烁频率通过延时时间实现,LED 闪烁的快慢由延时时间长短决定。在这里,我们使用一个数组 `freq_delay` 存储不同频率对应的延时时间,然后根据当前频率等级 `freq_index` 选择相应的延时时间。闪烁频率越高,延时时间越短,LED 闪烁的频率越快。同时,LED 的开关状态也随着闪烁频率的改变而变化。如果 LED 处于关闭状态,那么每次开启 LED 的时间为一个延时时间,然后关闭 LED 并再次延时一个延时时间;如果 LED 处于开启状态,那么每次开启 LED 的时间为两个延时时间,然后关闭 LED 并再次延时两个延时时间。
阅读全文