找回密码
 立即注册
查看: 34|回复: 1

擎天柱ai8051u按键递增

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-04-20 13:16:06
已绑定手机

5

主题

4

回帖

35

积分

新手上路

积分
35
发表于 2025-4-20 19:22:51 | 显示全部楼层 |阅读模式
擎天柱LED按钮递增
#include <AI8051U.H>

void Delay500ms(void)        //@12.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 1499998UL;
        while (i) i--;
}

void main()
{
        int i=-1;
        P3M1=0;
        P3M0=0;
        P2M1=0;
        P2M0=0;
        while(1)
        {
           if(P33==0)
           {   
                   i++;
                   Delay500ms();
                   Delay500ms();
           }
         
                switch(i)
                   {
                           case 1:P20=0;break;
                           case 2:P21=0;break;
                           case 3:P22=0;break;
                           case 4:P23=0;break;
                           case 5:P24=0;break;
                           case 6:P25=0;break;
                           case 7:P26=0;break;
                           case 8:P27=0;break;
                           default:{
                                   P20=1;
                                       P21=1;
                                       P22=1;
                                       P23=1;
                                       P24=1;
                                       P25=1;
                                           P26=1;
                                           P27=1;
                                       if(i>=8)i=-1;
                                  
                                    }
                                  

                        }
                             
               
                                    
                                  

        }   
}                  

bbac465173321bb38fab39a6d00dfc0b.mp4

2.45 MB, 下载次数: 0

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-20 19:23:00 | 显示全部楼层
代码分析与优化建议

1. 代码功能概述
该代码实现了一个基于8051微控制器的按键控制LED递增功能。具体逻辑如下:
通过检测P3.3引脚的电平变化来触发按键事件。
每次按键按下后,变量i递增,并根据i的值控制P2端口的LED状态。
当i超过8时,重置i为-1,并关闭所有LED。

2. 代码问题分析
尽管代码实现了基本功能,但仍存在以下问题:

2.1 延时函数效率低
Delay500ms函数使用了一个简单的循环延时,这种方式效率较低,且精度不高。建议使用定时器中断来实现精确延时。

2.2 按键消抖处理不足
代码中仅通过延时函数处理按键抖动,但延时过长可能导致响应迟钝。建议采用硬件消抖或软件消抖算法来优化按键检测。

2.3 LED控制逻辑冗余
在default分支中,所有LED被设置为高电平,然后判断i是否大于等于8。这种逻辑可以简化为直接判断i的值。

2.4 代码可读性差
变量命名不清晰,代码结构不够简洁,建议优化变量命名和代码结构以提高可读性。

3. 优化建议

3.1 使用定时器中断实现延时
通过配置定时器中断来实现精确延时,避免阻塞主循环。例如,配置定时器每1ms中断一次,然后在中断服务程序中计数达到500次时触发延时完成。

3.2 优化按键消抖
采用状态机或软件消抖算法来优化按键检测。例如,检测到按键按下后,延时10ms再次检测,确认按键状态。

3.3 简化LED控制逻辑
将LED控制逻辑简化为一个循环,避免冗余代码。例如,通过循环遍历P2端口的引脚来控制LED状态。

3.4 优化变量命名和代码结构
使用更具描述性的变量名,例如将i改为ledState,并优化代码结构以提高可读性。

4. 优化后的代码示例

```c
include

define LEDPORT P2
define KEYPIN P33

void Timer0Init(void) {
    TMOD |= 0x01;  // 定时器0模式1
    TH0 = 0xFC;    // 1ms定时初值
    TL0 = 0x18;
    ET0 = 1;       // 使能定时器0中断
    EA = 1;        // 使能全局中断
    TR0 = 1;       // 启动定时器0
}

void DelayMs(unsigned int ms) {
    while (ms--) {
        while (!TF0);  // 等待定时器溢出
        TF0 = 0;       // 清除溢出标志
        TH0 = 0xFC;    // 重装初值
        TL0 = 0x18;
    }
}

void main() {
    unsigned char ledState = 0;

    Timer0Init();
    LEDPORT = 0xFF;  // 初始化所有LED为关闭状态

    while (1) {
        if (KEYPIN == 0) {  // 检测按键按下
            DelayMs(10);     // 消抖延时
            if (KEYPIN == 0) {
                ledState++;
                if (ledState > 8) {
                    ledState = 0;
                }
                LEDPORT = ~(1

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 22:14 , Processed in 0.108856 second(s), 55 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表