学习第二天擎天柱ai8051u按钮控制流水灯
按钮控制流水灯就if elseP33控制往返流水灯
P32控制逆序流水灯
松开按钮断电
#include <AI8051U.H>
void Delay500ms(void) //@12.000MHz
{
unsigned long edata i;
_nop_();
_nop_();
i = 1499998UL;
while (i) i--;
}
void main()
{
P3M1=0;
P3M0=0;
P2M1=0;
P2M0=0;
while(1)
{
if(P33==0)
{
P20=1;
P21=0;
Delay500ms();
P21=1;
P22=0;
Delay500ms();
P22=1;
P23=0;
Delay500ms();
P23=1;
P24=0;
Delay500ms();
P24=1;
P25=0;
Delay500ms();
P25=1;
P26=0;
Delay500ms();
P26=1;
P27=0;
Delay500ms();
P27=1;
P26=0;
Delay500ms();
P26=1;
P25=0;
Delay500ms();
P25=1;
P24=0;
Delay500ms();
P24=1;
P23=0;
Delay500ms();
P23=1;
P22=0;
Delay500ms();
P22=1;
P21=0;
Delay500ms();
P21=1;
P20=0;
Delay500ms();
}
else
{if(P33!=0)
{
P20=1;
P21=1;
P22=1;
P23=1;
P24=1;
P25=1;
P26=1;
P27=1;
if(P32==0)
{
Delay500ms();
P27=1;
P26=0;
Delay500ms();
P26=1;
P25=0;
Delay500ms();
P25=1;
P24=0;
Delay500ms();
P24=1;
P23=0;
Delay500ms();
P23=1;
P22=0;
Delay500ms();
P22=1;
P21=0;
Delay500ms();
P21=1;
P20=0;
Delay500ms();
}
}
{
}
}
}
}
在嵌入式系统中,流水灯控制是一个经典的应用场景,尤其对于初学者而言,通过按钮控制流水灯的变化能够有效理解GPIO(通用输入输出端口)的基本操作以及条件判断语句的使用。以下是对您提供的代码的详细解析与优化建议。
1. 代码解析
1.1 硬件连接
P33:用于控制往返流水灯的按钮。
P32:用于控制逆序流水灯的按钮。
P2端口:连接了8个LED灯,分别对应P20到P27。
1.2 代码结构
Delay500ms函数:用于实现500ms的延时。通过一个无符号长整型变量i进行计数,循环递减至0,从而实现延时。
主函数main:
初始化P2和P3端口为普通IO模式。
通过while(1)进入无限循环,检测按钮状态。
如果P33为低电平(按钮按下),则依次点亮P20到P27的LED,然后再依次熄灭,实现往返流水灯效果。
如果P32为低电平(按钮按下),则依次点亮P27到P20的LED,实现逆序流水灯效果。
1.3 代码问题
代码冗余:往返流水灯的实现部分代码过于冗余,重复了多次Delay500ms和LED控制语句,不利于维护和扩展。
缺乏按钮去抖动处理:在实际应用中,机械按钮在按下和释放时会产生抖动,可能导致多次误触发。代码中未加入去抖动处理。
代码可读性差:流水灯控制的逻辑较为复杂,缺乏模块化和注释,不利于理解和修改。
2. 代码优化
2.1 去抖动处理
为了消除按钮抖动的影响,可以在检测按钮状态时加入延时去抖动处理。常见的去抖动方法是通过延时一段时间后再次检测按钮状态,确保按钮稳定按下或释放。
2.2 模块化设计
将流水灯的控制逻辑封装为函数,提高代码的可读性和可维护性。
2.3 优化后的代码
```c
include
define uchar unsigned char
define uint unsigned int
// 延时函数
void Delay500ms(void) {
uint i = 1499998UL;
while (i--) ;
}
// 去抖动函数
bit ButtonDebounce(bit pin) {
if (pin == 0) {
Delay500ms();
if (pin == 0) return 1;
}
return 0;
}
// 往返流水灯函数
void FlowLED() {
uchar i;
for (i = 0; i < 8; i++) {
P2 = ~(0x010; i--) {
P2 = ~(0x01 = 0; i--) {
P2 = ~(0x01
[本文内容由国芯人工智能辅助生成,仅供参考]
页:
[1]