曹会杰 发表于 2025-6-24 19:21:07

曹会杰 发表于 2025-6-24 19:19
818818

为什么中间灯会全亮一下

曹会杰 发表于 2025-6-24 19:24:18

曹会杰 发表于 2025-6-24 19:19
818818

又点错了,上传了三个视频文件

曹会杰 发表于 2025-6-24 21:47:14

USB不停电下载成功完成!{:hecai:}

曹会杰 发表于 2025-6-24 21:48:33

曹会杰 发表于 2025-6-24 21:47
USB不停电下载成功完成!

/*
        MAIN_Fosc24000000Hz
*/
#include <AI8051U.H>
#include "stc32_stc8_usb.h"
#include <intrins.H>

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

unsigned char ucLed=0xFE;
unsigned char ucLed_Mode;//流水灯模式
unsigned char ucLed_Buff[]={0x7E,0xBD,0xDB,0xE7};

/*---Xms延时函数 ---*/
void DelayXms(unsigned int Xms)        //@24.000MHz
{
        unsigned long edata i;
        while(Xms--)
        {
                _nop_();
                _nop_();
                _nop_();
                i = 5998UL;
                while (i) i--;
        }
}
/*---LED流水灯处理函数 ---*/
void ucLed_Proc()
{
        static unsigned char i=0;
        P2 = ucLed;
        switch(ucLed_Mode)
        {
                case 0:
                        if(ucLed==0x7E)
                        {
                                ucLed = 0xFE;
                        }
                        else
                        ucLed = _crol_(ucLed,1);
                        DelayXms(500);
                        if(ucLed==0x7F)ucLed_Mode=1;
                break;
                case 1:
                        ucLed = _cror_(ucLed,1);
                        DelayXms(500);
                        if(ucLed==0xFE)ucLed_Mode=2;
                break;
                case 2:                                       
                                ucLed=ucLed_Buff;
                                i++;
                                if(i==3)ucLed_Mode=3;
                       
                        DelayXms(500);
                break;
                case 3:
                       
                        ucLed=ucLed_Buff;
                        i--;
                        if(i==255)ucLed_Mode=0;
                        DelayXms(500);
                break;
        }
        P2=0xFF;
}
/*---MAIN 主函数 ---*/
void main()
{
        P_SW2 |= 0x80;                //B7位写1,使能访问XFR       
                                                                       
        P0M1 = 0x00;   P0M0 = 0x00;        //初始化IO口为准双向IO口
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
       
        usb_init();                                     //USB CDC 接口配置
    IE2 |= 0x80;                                    //使能USB中断
    EA = 1;                                                                                        //IE |= 0X80;开总中断
               
        while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置
               
        while(1)
        {
                if (bUsbOutReady)
      {
            USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
            
            usb_OUT_done();
      }
                ucLed_Proc();
        }
}

曹会杰 发表于 2025-6-25 09:17:46

感谢官方 免费+包邮 的 擎天柱 核心板学习记录
printf_usb函数的应用






曹会杰 发表于 2025-6-25 09:19:05

曹会杰 发表于 2025-6-25 09:17
感谢官方 免费+包邮 的 擎天柱 核心板学习记录
printf_usb函数的应用



输出成功!

隐约 发表于 2025-8-6 09:50:08

曹会杰 发表于 2025-6-24 19:19
818818

这段代码主要实现了一个LED 灯的多种模式循环显示功能,通过控制 P2 口连接的 LED(推测是 8 位共阴极数码管或 8 个独立 LED),按不同模式进行切换显示。以下是详细分析:
核心功能说明
代码通过ucLed_Proc()函数控制 LED 的显示模式,共包含 4 种模式,完成一轮后自动循环。具体逻辑如下:
1. 变量与硬件说明
ucLed:用于存储当前输出到 P2 口的 LED 控制数据(8 位二进制,每一位对应一个 LED 的亮灭状态,0 表示点亮,1 表示熄灭,推测为共阴极 LED)。
ucLed_Mode:模式控制变量(0-3),用于切换不同的显示模式。
ucLed_Buff:一个数组(代码中未完全展示定义,推测包含 3 个元素),存储自定义的 LED 显示数据。
i:静态变量,用于在模式 2、3 中遍历ucLed_Buff数组。
P2:LED 控制端口,通过写入ucLed的值控制 LED 亮灭;最后设置为0xFF是为了避免残留电平影响。
P2M0、P2M1:配置 P2 口为普通 IO 模式(推挽 / 准双向,根据 STC 单片机特性,0x00通常对应准双向输出)。
2. 四种模式详解(switch(ucLed_Mode))
模式 0(case 0):左移循环
初始状态:ucLed从0xFE(二进制11111110,最低位 LED 点亮)开始。
逻辑:通过_crol_(ucLed,1)函数将ucLed循环左移 1 位(每次左移,点亮的 LED 向左移动一位)。
切换条件:当ucLed变为0x7F(二进制01111111,最高位 LED 点亮)时,切换到模式 1。
延时:每次移动后延时 500ms,肉眼可见 LED 缓慢左移。
例:0xFE(亮最右)→ 0xFD(亮右 2)→ ... → 0x7F(亮最左)→ 进入模式 1。
模式 1(case 1):右移循环
逻辑:通过_cror_(ucLed,1)函数将ucLed循环右移 1 位(每次右移,点亮的 LED 向右移动一位)。
切换条件:当ucLed变回0xFE(二进制11111110,回到最右位 LED 点亮)时,切换到模式 2。
延时:每次移动后延时 500ms,LED 缓慢右移。
例:0x7F(亮最左)→ 0xBF(亮左 2)→ ... → 0xFE(亮最右)→ 进入模式 2。
模式 2(case 2):自定义数组正向遍历
逻辑:按顺序显示ucLed_Buff数组中的元素(i从 0 递增到 2,依次取ucLed_Buff→ucLed_Buff→ucLed_Buff)。
切换条件:当i等于 3(遍历完 3 个元素)时,切换到模式 3。
延时:每个元素显示 500ms。
例:若ucLed_Buff = {0xAA, 0x55, 0x33},则依次显示这三个值对应的 LED 状态。
模式 3(case 3):自定义数组反向遍历
逻辑:按逆序显示ucLed_Buff数组中的元素(i从 2 递减到 0,依次取ucLed_Buff→ucLed_Buff→ucLed_Buff)。
切换条件:当i减到 255(无符号数溢出,相当于遍历完反向顺序)时,切换回模式 0,完成一轮循环。
延时:每个元素显示 500ms。
整体流程
模式循环顺序:模式 0(左移)→ 模式 1(右移)→ 模式 2(数组正向)→ 模式 3(数组反向)→ 模式 0(重复),形成一个完整的 LED 动态显示循环。
总结
这段代码的作用是:通过 P2 口控制 8 个 LED(或数码管),按 “左移→右移→自定义数组正向→自定义数组反向” 的顺序循环显示,每种模式下 LED 状态每 500ms 更新一次,适合做简单的 LED 跑马灯或动态显示效果。
页: 1 [2]
查看完整版本: 点亮第一个LED灯