找回密码
 立即注册
查看: 100|回复: 2

USB-CDC读取按键状态并点亮LED灯实验

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-03-20 17:03:20
已绑定手机

4

主题

2

回帖

38

积分

新手上路

积分
38
发表于 2025-3-10 15:01:55 | 显示全部楼层 |阅读模式
实验教程中的代码没法编译
#include <AI8051U.H> //包含AI8051U的头文件
#include "ai_usb.h"  //使用usb所需要包含的头文件
#include "intrins.h"
char *USER_DEVICEDESC = NULL;//USB 库里预留的设备描述符,必须定义,但不要使用
char *USER_PRODUCTDESC = NULL;//USB 库里预留的产品描述符,必须定义,但不要使用
char *USER_STCISPCMD = "@STCISP#";
//这里使用"@STCISP#"这个字符串当作不停电自动下载命令,用户只需要在这里定义好这个字符串,
//后面添加的库文件的 USB 中断程序会自动判断从电脑端下传的数据是否和这个字符串一样,如果一样,
//则会自动软复位到系统区等待 USB 下载,用户不需要进行额外的处理。
void Delay1ms(void) //@40.000MHz
{
    unsigned long edata i;
    _nop_();
    _nop_();
    _nop_();
    i = 9998UL;
    while (i) i--;
}
void main(void)
{
    EAXFR = 1;    //允许访问扩展的特殊寄存器,XFR
    WTST = 0;     //设置取程序代码等待时间,赋值为 0 表示不等待,程序以最快速度运行
    CKCON = 0;    //设置访问片内的 xdata 速度,赋值为 0 表示用最快速度访问,不增加额外的等待时间
     P0M0 = 0x38; P0M1 = 0x20;
//设置P03P04为推挽输出,P05为开漏输出,其余为准双向口模式
P1M0 = 0x00; P1M1 = 0x00; //设置 P1 口为准双向口模式
P2M0 = 0x00; P2M1 = 0x00; //设置 P2 口为准双向口模式
P3M0 = 0x30; P3M1 = 0x3b;
//P30P31为高阻输入,P32为准双向口、P33为高阻输入、P34P35为开漏输出
P3PU |= 0x38;
//打开P33P34P35的内部上拉电阻,并且仅修改这三个I/O的上拉电阻打开状态
//P3M0 = 0x00; P3M1 = 0x00; //设置 P3 口为准双向口模式
//P3M0 = 0x00; P3M1 = 0x3c; //设置P32P33P34P35为高阻输入,其余引脚为准双向口模式
//P3PU = 0x3c; //需要同时开启对应端口的上拉电阻
P4M0 = 0x00; P4M1 = 0x00; //设置 P4 口为准双向口模式
P5M0 = 0x00; P5M1 = 0x00; //设置 P5 口为准双向口模式
P6M0 = 0x00; P6M1 = 0x00; //设置 P6 口为准双向口模式
P7M0 = 0x00; P7M1 = 0x00; //设置 P7 口为准双向口模式
    Delay1ms();//延时1ms,等待IO口电平稳定,因为前面刚改变了模式
    //立刻读可能会读到错误的电平,所以需要先等待电平变化稳定后再读
    usb_init(); //USB 接口配置
    EA = 1;//打开总中断
    while (DeviceState != DEVSTATE_CONFIGURED);     //等待USB完成配置
    P40 = 0;//打开LED部分的供电
    while(1)
    {
        //使用USB串口控制来手动控制LED部分
        if(bUsbOutReady)
        {
            printf_usb("P3%d当前的状态为:%d\r\n",
(int)UsbOutBuffer[0],(int)(P3>>UsbOutBuffer[0])&1);
            //传入hex的位号来标识需要读取哪个位的状态,读取后通过对整组IO口数据的移位操作读取到对应IO的状态
            P0 = P3|0xc3;//同步端口状态,并将其他不需要的位置1(不显示)
            printf_usb("已将状态同步给LED0%d\r\n",(int)UsbOutBuffer[0]);//显示同步完成
            usb_OUT_done();       // 本包接收的数据处理完毕,准备接收下一包数据
        }
    }
}

代码编译失败

代码编译失败

实验教程原图

实验教程原图
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-10 15:03:00 | 显示全部楼层
针对您提到的USB-CDC读取按键状态并点亮LED灯实验代码无法编译的问题,建议从以下几个方面进行排查:<br><br>1. **头文件路径**:确保`ai8051u.h`和`ai_usb.h`头文件路径正确,并在编译选项中添加了相应的包含路径。<br><br>2. **库文件链接**:检查是否已正确链接USB库文件,确保库文件与编译器版本兼容。<br><br>3. **宏定义**:确认`USER_DEVICEDESC`、`USER_PRODUCTDESC`和`USER_STCISPCMD`宏定义是否符合库的要求,虽然这些变量未被使用,但需确保其类型和值正确。<br><br>4. **编译器设置**:检查编译器设置是否正确,如芯片型号、时钟频率等是否与代码匹配。<br><br>5. **代码完整性**:确保实验代码完整,未遗漏关键函数或初始化代码,特别是USB初始化和按键LED控制部分。<br><br>通过以上步骤,应能解决编译问题。如仍有问题,建议参考官方文档或社区论坛获取更多帮助。<br><br>[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4850

回帖

8388

积分

超级版主

DebugLab

积分
8388
发表于 2025-3-10 16:04:42 | 显示全部楼层
编译通过的USB例程:
AI8051U_USB.zip (32.15 KB, 下载次数: 0)
使用最新版ISP软件更新头文件
https://www.stcaimcu.com/data/download/Tools/AIapp-ISP-v6.95G.zip

DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 01:03 , Processed in 0.339781 second(s), 64 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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