YangHY 发表于 2026-1-19 20:46:12

功能1和功能2 的库函数声明是不同的:

接着看功能3功能4

YangHY 发表于 2026-1-19 20:47:53

这里83怎么理解:

YangHY 发表于 2026-1-19 20:50:41

它就是设置P0.3端口输出高电平

再来看一个A5H是什么意思:

他这里是P4.5输出高电平

YangHY 发表于 2026-1-19 20:53:13

任务1:P2口流水灯,P10闪烁

先更新头文件:

YangHY 发表于 2026-1-19 20:56:03

都换成“ai_usb.h”

来源是新下载的STC的USB库文件

YangHY 发表于 2026-1-19 20:57:20

最新的手册有详细说明:

YangHY 发表于 2026-1-19 21:01:46

换了新的头文件,就有虚拟设备的库函数说明了:

YangHY 发表于 2026-1-19 21:07:37

新换头文件会在编译的时候提示有错误:

因为头文件要改一下:

//使用串口“printf”打印信息需屏蔽以下两个定义
//#define PRINTF_SEGLED         //printf输出重定向到ISP下载软件中的7段数码管
//#define PRINTF_HID            //printf输出直接重定向到USB口
#define PRINTF_USB            //printf输出直接重定向到USB口

#define DEVSTATE_ATTACHED       0
#define DEVSTATE_POWERED      1
#define DEVSTATE_DEFAULT      2
#define DEVSTATE_ADDRESS      3
#define DEVSTATE_CONFIGURED   4
#define DEVSTATE_SUSPENDED      5

void usb_init();
void usb_OUT_done();
void USB_SendData(BYTE *dat, int size);

void set_usb_OUT_callback(void (*pfn)(void));   //如果需要实现USB接收中断,需要调用此函数来设置回调函数
void set_usb_IN_callback(void (*pfn)(void));    //如果需要实现USB发送中断,需要调用此函数来设置回调函数
void set_usb_ispcmd(char *cmd);               //设置不停电下载的用户自定义命令,不设置时默认下载命令为“@STCISP#”

int SEG7_ShowString(const char *fmt, ...);
void SEG7_ShowLong(long n, char radix);
void SEG7_ShowFloat(float f);
void SEG7_ShowCode(BYTE *cod);

void LED40_SendData(BYTE *dat, BYTE size);
void LED40_SetPort(BYTE port, BYTE dat);
void LED40_SetBit(BYTE port, BYTE bt);
void LED40_ClrBit(BYTE port, BYTE bt);

void LED64_SendData(BYTE *dat, BYTE size);
void LED64_SetPort(BYTE port, BYTE dat);
void LED64_SetBit(BYTE port, BYTE bt);
void LED64_ClrBit(BYTE port, BYTE bt);

void LCD12864_DisplayOff();
void LCD12864_DisplayOn();
void LCD12864_CursorOff();
void LCD12864_CursorOn();
void LCD12864_CursorMoveLeft();
void LCD12864_CursorMoveRight();
void LCD12864_CursorReturnHome();
void LCD12864_ScrollLeft();
void LCD12864_ScrollRight();
void LCD12864_ScrollUp(BYTE line);
void LCD12864_AutoWrapOff();
void LCD12864_AutoWrapOn();
void LCD12864_ReverseLine(BYTE line);
void LCD12864_DisplayClear();
void LCD12864_ShowString(BYTE x, BYTE y, char *str);
void LCD12864_ShowPicture(BYTE x, BYTE y, BYTE cx, BYTE cy, BYTE *dat);

void OLED12864_DisplayOff();
void OLED12864_DisplayOn();
void OLED12864_DisplayContent();
void OLED12864_DisplayEntire();
void OLED12864_HorizontalMirror();
void OLED12864_VerticalMirror();
void OLED12864_DisplayReverse();
void OLED12864_SetContrast(BYTE bContrast);
void OLED12864_SetAddressMode(BYTE bMode);
void OLED12864_ScrollLeft(BYTE bPageStart, BYTE bPageEnd, WORD nInterval);
void OLED12864_ScrollRight(BYTE bPageStart, BYTE bPageEnd, WORD nInterval);
void OLED12864_ScrollUp(BYTE bPageStart, BYTE bPageEnd, WORD nInterval);
void OLED12864_ScrollStart();
void OLED12864_ScrollStop();
void OLED12864_ShowPicture(BYTE x, BYTE y, BYTE cx, BYTE cy, BYTE *dat);

int printf_usb (const char *fmt, ...);

#if defined PRINTF_SEGLED
#define printfSEG7_ShowString
#elif defined PRINTF_USB
#define printfprintf_usb
#elif definedPRINTF_HID
#define printfprintf_usb
#endif

extern BYTE xdata UsbFeatureBuffer;
extern BYTE xdata UsbInBuffer;
extern BYTE xdata UsbOutBuffer;
extern BOOL bUsbFeatureReady;
extern BOOL bUsbInBusy;
extern BOOL bUsbOutReady;
extern BYTE DeviceState;
extern BYTE OutNumber;

#endif

YangHY 发表于 2026-1-19 21:10:28

任务1:P2口流水灯,P10闪烁
void TASK_1( void )
{
       
// ----------------------- p2端口流水灯        -----------------------
        LED40_SetPort(2,~P2_STATE);                        //点亮P20端口
    P2 = P2_STATE;//点亮“擎天柱”

        P2_STATE = (P2_STATE<<1);                        //1000 0000 -> 1 0000 0000
        if( P2_STATE == 0 )
                P2_STATE = 1;
       
// ----------------------- p10端口闪烁        -----------------------       
        if( P10_STATE == 0 )
                LED40_SetBit(1,0);//P10端口输出高电平
        else
                LED40_ClrBit(1,0);//P10端口输出低电平
       
        P10_STATE = !P10_STATE;
}

YangHY 发表于 2026-1-19 21:12:30

我们让它500ms执行一次:

static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
       
// {0, 300,   300,   LED0_Blink},      /* task 1 Period: 300ms */
// {0, 600,   600,   LED1_Blink},      /* task 1 Period: 600ms */
// {0, 900,   900,   LED2_Blink},      /* task 1 Period: 600ms */

    {0, 10,    10,    KEY_Task},      /* task 1 Period: 600ms */

        {0, 500,   500,   TASK_1},      /* task 1 Period: 500ms */
        {0, 500,   500,   TASK_2},      /* task 1 Period: 500ms */
//        {0, 10,   10,   TASK_3},      /* task 1 Period: 500ms */


};
页: 62 63 64 65 66 67 68 69 70 71 [72] 73 74 75 76 77 78 79 80 81
查看完整版本: 第一课 序言《AI8051U的特点》