818818
为什么中间灯会全亮一下 曹会杰 发表于 2025-6-24 19:19
818818
又点错了,上传了三个视频文件 USB不停电下载成功完成!{:hecai:} 曹会杰 发表于 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();
}
} 感谢官方 免费+包邮 的 擎天柱 核心板学习记录
printf_usb函数的应用
曹会杰 发表于 2025-6-25 09:17
感谢官方 免费+包邮 的 擎天柱 核心板学习记录
printf_usb函数的应用
输出成功!
曹会杰 发表于 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]