请大家帮我看看这段程序,主要功能是完成372芯片对数据的接受和发送,本人是初学者,毕业设计师这方面的题目,希望大家多多指导。谢谢大家!
#include #include typedef unsigned char *PUINT8; typedef unsigned char UINT8; typedef unsigned char volatile xdata IOPORT; IOPORT CH372_CMD_PORT _at_ 0x9001; /*命令口地址*/ IOPORT CH372_DAT_PORT _at_ 0x9000; /*数据口地址*/
void Delay( ) /*延时程序*/ { UINT8 i; for ( i=3; i>0; i-- );
}
void CH372_WR_CMD_PORT(UINT8 cmd) /*向命令口写入命令(cmd=15h)*/ { Delay(); CH372_CMD_PORT=cmd; Delay(); } void CH372_WR_DAT_PORT(UINT8 dat) /*向数据口写入数据*/ { CH372_DAT_PORT=dat; Delay(); } UINT8 CH372_RD_DAT_PORT() /*读取数据*/ { Delay(); return(CH372_DAT_PORT); }
void CH372_INIT() /*372初始化*/ { UINT8 i; CH372_WR_CMD_PORT(CMD_SET_USB_MODE); /*设置USB工作模式*/ CH372_WR_DAT_PORT(2); /*设置USB为内置固件方式*/ for(i=100;i>0;i--) if(CH372_RD_DAT_PORT()==CMD_RET_SUCCESS) /*等待操作成功*/ break; IT1=1; /*外部中断1低电平有效*/ IE1=0; /*清中断标志*/ EX1=1; /*允许372中断(372已经连接到单片机的INT1脚)*/ }
UINT8 UsbLength; /*USB缓冲区长度*/ UINT8 UsbBuffer[CH372_MAX_DATA_LEN]; /*USB缓冲区*/
/* CH372中断服务程序,假定CH372的INT#引脚连接到单片机的INT1,使用寄存器组1 */ void CH372Interrupt() interrupt 2 using 1 { PUINT8 buf; UINT8 cnt; UINT8 IntStatus; CH372_WR_CMD_PORT(CMD_GET_STATUS); /*获取中断状态并取消中断*/ IntStatus=CH372_RD_DAT_PORT(); /*获取中断状态*/ IE1=0; switch(IntStatus){ case USB_INT_EP2_OUT: /*接收数据成功*/ CH372_WR_CMD_PORT(CMD_RD_USB_DATA); UsbLength=cnt=CH372_RD_DAT_PORT(); /*首先读出数据块的长度*/ if(cnt) { buf=UsbBuffer; /*指针指向缓冲区*/ do { *buf=CH372_RD_DAT_PORT(); /*接收数据*/ buf++; }while(--cnt); } else break; case USB_INT_EP2_IN: /*发送数据成功*/ CH372_WR_CMD_PORT(CMD_WR_USB_DATA7); cnt=UsbLength; CH372_WR_DAT_PORT(cnt); /*首先写入数据块长度*/ if(cnt) { buf=UsbBuffer; /*指针指向缓冲区*/ do { CH372_WR_DAT_PORT(*buf); /*写入数据*/ buf++; }while(--cnt); CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); /*释放缓冲区*/ } else break; default: CH372_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } }
main() { CH372_INIT(); EA=1; while(1); }