用keil编写(1)按下按键S0(P3.2),8个LED双向流水灯显示; (2)按下按键S1(P3.3),8个LED轮流一起亮灭; (3)按下按键S2(P3.4),8个LED高4位与低4位交替轮流显示; (4)按下按键S3(P3.5),8个LED奇偶交替轮流显示系统)。
时间: 2024-10-27 19:11:24 浏览: 57
HAL库编写 STM32F103C8 带按键控制流水灯
5星 · 资源好评率100%
在Keil uVision环境下编写这样的程序,首先你需要设置好硬件配置,并了解P3.2~P3.5作为输入按钮,以及LED的连接方式。以下是基本的步骤:
(1)按下S0时,LED流水灯显示:
```c
#include <reg52.h>
sbit S0 = P3_2; // 定义S0引脚
void led_display() {
for (int i = 0; i < 8; ++i) {
if (i % 2 == 0)
PORTB &= ~(1 << i); // LED偶数位置点亮
else
PORTB |= (1 << i); // LED奇数位置点亮
delay_ms(10); // 灯光闪烁间隔
}
}
int main(void) {
while(1) {
if (S0 == 0) { // 按下S0
led_display();
}
}
}
```
(2)按下S1时,8个LED轮流亮灭:
```c
void led_toggle_all() {
static int state = 1;
PORTB ^= state; // 所有LED按当前状态切换
state = !state;
delay_ms(200); // 亮灭周期
}
// ...在主函数里加入判断S1的代码
if (S1 == 0) {
led_toggle_all();
}
```
(3)按下S2时,高4位与低4位交替显示:
```c
void led_alternate_half() {
int bit_mask = 0x0F; // 高4位全1
for (int i = 0; i < 8; ++i) {
PORTB ^= (bit_mask & (1 << i)); // 半位切换
bit_mask >>= 1; // 下移一位
}
delay_ms(100);
}
// ...在主函数里加入判断S2的代码
if (S2 == 0) {
led_alternate_half();
}
```
(4)按下S3时,奇偶交替显示:
```c
void led_odd_even() {
static int pattern = 0;
for (int i = 0; i < 8; ++i) {
PORTB ^= (pattern & (1 << i));
pattern ^= 1; // 奇偶切换
}
pattern &= ~1; // 确保下一个循环开始时,奇数变为偶数,反之亦然
delay_ms(100);
}
// ...在主函数里加入判断S3的代码
if (S3 == 0) {
led_odd_even();
}
```
记得在主函数中对所有四个按键事件进行判断,并适当处理延时和中断,以保证响应性和可靠性。
阅读全文