📄 usb.c
字号:
//USB通信实验主程序,包括打开连接,发送数据和接收数据
#include "reg52.h"
#include "usb.h"
#include "study.h"
void usb_init_timer0();
extern uchar data time_service;
xdata USB_DEMO usbDemo;
//函数名:usb_menu
//功能:选择USB通信后的菜单显示函数,有3个主要选项,打开连接,发送数据,接收数据
//注意事项:
//使用情况:在主菜单选择USB接口实验后出现新菜单选项
void usb_menu()
{
uchar ch;
begin_usb_menu:
cls(8);
setcursor(0,0);
lcdstring("1.打开连接\r\n");
usbDemo.usb_state=0; //初始化为功能:非活动
while(1)
{
while((ch=getkey(1000))==0); //等待按键
switch(ch)
{
////////////////////////////////////////////////////////
//用户选择1的时候将打开USB设备
//
////////////////////////////////////////////////////////
case '1':
beep(1);
usbDemo.usb_state=USB_DEMOSHOW; //DEMO运行
//1。初始化定时器,INT中断,允许INT中断为低电平
time_service=3; //把定时器资源交给USB
TL0 = 0X0; /*定时值如没特别要求,可以随便定,但不要太短 */
TH0 = 0X0;
ET0 = 1;
TR0 = 1;
//--------------int中断初始化
IE1=0;
IT1=0;
EX1=1;
EA = 1;
cls(8);
setcursor(0,0);
lcdstring("C.关闭连接\r\n");
lcdstring("________________");
lcdstring("00000000");
//2。打开D12的SOFTCONNECT
reconnect_USB(); //连接D12到PC
while( usbDemo.usb_state!=USB_UNOPEN) //检查是否退出,这个推出可以在DX板上控制,也可PC控制
{
if (bEPPflags.bits.timer) //时间中断请求
{
DISABLE;
bEPPflags.bits.timer = 0;
ENABLE;
if(bEPPflags.bits.configuration)
usb_interrupt_transmit();//每个时间间隔实行一次中断传输
} //if timer
if (bEPPflags.bits.bus_reset) //总线复位请求,这个功能其实也没什么
{
DISABLE;
bEPPflags.bits.bus_reset = 0;
ENABLE;
} // if bus reset
if (bEPPflags.bits.suspend) //挂起请求
{
DISABLE;
bEPPflags.bits.suspend= 0;
ENABLE;
//这里不支持挂起,因为DX板上的SUSPD脚已断开
} //if suspend
if (bEPPflags.bits.setup_packet) //SETUP包请求
{
DISABLE;
bEPPflags.bits.setup_packet = 0;
ENABLE;
control_handler();
} // if setup_packet
if(bEPPflags.bits.read_flash) //读FLASH请求,这里使用main_len表示传输长度
{
usbDemo.main_len=usbDemo.read_flash_end-usbDemo.read_flash_begin+1;
if( usbDemo.main_len>64 )//每次最多向PC写64个字节
{
readeprom(usbDemo.read_flash_begin,EpBufIN,64); //读FLASH到缓冲
D12_WriteEndpoint(5, 64, EpBufIN); //写到USB
usbDemo.read_flash_begin+=64;
}
else
{
readeprom(usbDemo.read_flash_begin,EpBufIN,usbDemo.main_len); //读FLASH到缓冲
D12_WriteEndpoint(5, usbDemo.main_len, EpBufIN);
D12_WriteEndpointByte(3, READ_FLASH_FINISH); //写一个结束读标志到PC
bEPPflags.bits.read_flash=0; //结束读flash
}
} // if read_flash
if(bEPPflags.bits.main_rxdone) //传输字符请求
{
setcursor(0,2);
lcdstring("________________");
setcursor(0,2);
lcdstring(EpBufOUT);
bEPPflags.bits.main_rxdone=0;
} //if main_rxdone
} // end while
TR0 = 0; //关闭定时器(可选)
EX1=0; //去掉USB INT中断
time_service=0; //取消USB时钟
usbDemo.key=0; //按键值变回0
KillD12(); //保证p33脚为高
beep(20); //长响一声,回到USB界面
goto begin_usb_menu;
// break;
/////////////////////////////////////////////////
//
//
/////////////////////////////////////////////////
case '3':
beep(30);
break;
case 'C':
return;
break;
default:
break;
}
}
}
//函数名:show_pc_key
//功能:在LCD上显示PC按键,
//参数:用于显示的字节
//调用情况:在中断传输,接收中被调用(usb_loop)
//注意事项:显示的为数字0,1
void show_pc_key(uchar show_key)
{
setcursor(0,4);
if(show_key&0x01)
lcdstring("1");
else
lcdstring("0");
if(show_key&0x02)
lcdstring("1");
else
lcdstring("0");
if(show_key&0x04)
lcdstring("1");
else
lcdstring("0");
if(show_key&0x08)
lcdstring("1");
else
lcdstring("0");
if(show_key&0x10)
lcdstring("1");
else
lcdstring("0");
if(show_key&0x20)
lcdstring("1");
else
lcdstring("0");
if(show_key&0x40)
lcdstring("1");
else
lcdstring("0");
if(show_key&0x80)
lcdstring("1");
else
lcdstring("0");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -