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

📄 main.c

📁 vC++读写HID_USB设备,包含hid_usb的固件程序和上位机程序
💻 C
字号:
#include "ds89c4xx.h"
#include "mytype.h"
#include "chapter9.h"
#include "d12ci.h"
#include "uart0.h"
#include "key.h"

void SysInit(void);
void InterruptInit(void);
void ep1_txdone(void);
void ep1_rxdone(void);
//void main_txdone(void);
//void main_rxdone(void);

uint8 xdata *pt;

code uint8 billow[11][60] = {
"*********************************************************\r\n",
"*****              author:billowtust                *****\r\n",
"*****              date: ",__DATE__,"                *****\r\n",
"*****              time: ",__TIME__,"                   *****\r\n",
"*****              CPU: DS89C450MNG                 *****\r\n",
"*****   Tianjin University of Science & Technology. *****\r\n",
"*********************************************************\r\n"};

void main(void)
{
	uint8 idata i;
	uint16 idata inter;

	//PMR |= 0x01;	//访问片内1KB SRAM
	bEPPflags.value = 0;

	SysInit();
	UartInit0();
	KeyInit();
	
	for(i=0;i<11;i++)
	{
		PutString0(billow[i],200);
	}
	PutString0("System is running......\r\n",200);
	readchipid();
	reconnect_USB();	//先断开USB,再连接
	D12_SetEndpointEnable(1);
	while(1)
	{
		if(!P32)
		{
			inter = D12_ReadInterruptRegister();
			
			if(inter & D12_INT_BUSRESET)
			{
				bEPPflags.bits.bus_reset = 1;
			#ifdef debug
				PutString0("usb bus reset\r\n",50);
			#endif
			}
			//if(inter & D12_INT_EOT)
			//	dma_eot();
			if(inter & D12_INT_SUSPENDCHANGE)
			{
				bEPPflags.bits.suspend = 1;
			#ifdef debug
				PutString0("suspend status changed\r\n",50);
			#endif
			}
			if(inter & D12_INT_ENDP0OUT)	//输出中断 OUT中断
			{
				ep0_rxdone();
				if(bEPPflags.bits.setup_packet)
				{
					bEPPflags.bits.setup_packet = 0;
					control_handler();
				}
			}
			if(inter & D12_INT_ENDP0IN)		//输入中断 IN中断
				ep0_txdone();
			if(inter & D12_INT_ENDP1IN)
				ep1_txdone();
			if(inter & D12_INT_ENDP1OUT)
				ep1_rxdone();
			//if(inter & D12_INT_ENDP2IN)	
				//main_txdone();
			//if(inter & D12_INT_ENDP2OUT)
				//main_rxdone(); 
	
		}
	}
}

void SysInit(void)
{
	P0 = 0xff;
	P1 = 0xff;
	P2 = 0xff;
	P3 = 0xff;
	pt = 0x0000;
}

void InterruptInit(void)
{
	EA = 0;
	IT0 = 0;	//外部中断0电平触发,低电平有效
	EX0 = 1;	//允许外部中断
	IP1 = 0;
	IP0 = 0;	//IP 清0,所有中断都为最低优先级
	EA = 1;		//总中断开关,状态:开
}

void ep1_txdone(void)
{
	uint8 idata temp[3]={0x55,0xaa,0x5a};
	D12_ReadLastTransactionStatus(3);
	KeyChangeable = 0;  //禁止修改按键值 
	if(KeyPress) //如果有按键按下
	{
		if(KeyPress&(KEY1)) //左Ctrl键
		{
			temp[0] = 0x01;
		}
		else
		{
			temp[0] = 0x10;
		}	
		if(KeyPress&(KEY2)) //左shift键
		{
			temp[1] = 0x02;
		}
		else
		{
			temp[1] = 0x20;
		}
	}

	if(KeyUp||KeyDown)
	{
		KeyUp=0;
		KeyDown=0;
		D12_WriteEndpoint(3,2,temp);
	}

	KeyChangeable = 1; //允许修改按键值
}

void ep1_rxdone(void)
{
	uint8 idata len;
	D12_ReadLastTransactionStatus(2);
	len = D12_ReadEndpoint(2,16,pt);
	if(len != 0)
	{
		P2 = ~(*pt);
	}
}

/*uint8 idata InBuffer[8];

void main_txdone(void)
{
	uint8 idata i;
	
	D12_ReadLastTransactionStatus(5);
	
	KeyChangeable = 0;  //禁止修改按键值 
	if(KeyPress) //如果有按键按下
	{
		
		if(KeyPress&(KEY1)) //左shift键
		{
			InBuffer[0] |= 1 << 1;
		}
		else
		{
			InBuffer[0] &= ~(1 << 1);
		}	
		i=2;
		if(KeyPress&(KEY2))
		{
			InBuffer[i++] = 0x04;	    //a键
		}
		if(KeyPress&(KEY3))
		{
			InBuffer[i++] = 0x05;	    //b键
		}
		if(KeyPress&(KEY4))
		{
			InBuffer[i++] = 0x06;	    //c键
		}
		if(KeyPress&(KEY5))
		{
			InBuffer[i++] = 0x07;	    //d键
		}
		if(KeyPress&(KEY6))
		{
			InBuffer[i++] = 0x08;	    //e键
		}
		if(KeyPress&(KEY7))
		{
			InBuffer[i++] = 0x09;		//f
		}
		if(KeyPress&(KEY8))
		{
			InBuffer[i++] = 0x39;	    //Caps Lock键
		}
		for(;i<8;i++)
		{
			InBuffer[i] = 0;  //多余的清0
		}  
	}
	else //如果无按键按下,则返回0
	{
		for(i=0;i<8;i++)
		{
			InBuffer[i] = 0;
		}
	}

	if(KeyUp||KeyDown)
	{
		KeyUp=0;
		KeyDown=0;
		D12_WriteEndpoint(5,8,InBuffer);
	}

	KeyChangeable = 1; //允许修改按键值
}

void main_rxdone(void)
{
	uint8 len;
	static uint8 idata flag1 = 0;
	D12_ReadLastTransactionStatus(4);
	len = D12_ReadEndpoint(4,64,pt);
	if(len != 0)
	{
		P2 = ~(*pt);
	}
	if(flag1 == 0)
	{
		D12_WriteEndpoint(5,0,0);
		flag1++;
	}
} */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -