⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb.c

📁 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 + -