📄 main.c
字号:
#include "usb_task.h"
#include "usb_kbd_enum.h"
#include "ext_5131.h"
#include "reg_5131.h"
//////////////////////////////
code struct usb_st_device_descriptor usb_device_descriptor =
{
sizeof(usb_device_descriptor), 0x01, 0x1001, 0,
0, 0, 32, 0xeb03, 0x0320,
0x0001, 0x01, 0x02, 0x03, 1
};
/*STRING描述符*/
code struct usb_st_manufacturer usb_manufacturer =
{ sizeof(usb_manufacturer), 0x03, {'X'<<8, 'I'<<8, 'N'<<8, 'Z'<<8, 'X'<<8} };
code struct usb_st_product usb_product =
{ sizeof(usb_product), 0x03, {'A'<<8, 'T'<<8, '8'<<8, '9'<<8, 'C'<<8, '5'<<8, '1'<<8, \
'3'<<8, '1'<<8, ' '<<8, \
'H'<<8, 'I'<<8, 'D'<<8, ' '<<8, \
'K'<<8, 'e'<<8, 'y'<<8, 'b'<<8, 'o'<<8, 'a'<<8, 'r'<<8,'d'<<8} };
code struct usb_st_serial_number usb_serial_number =
{ sizeof(usb_serial_number), 0x03, {'1'<<8, '.'<<8, '2'<<8, '.'<<8, '3'<<8} };
code struct usb_st_language_descriptor usb_language =
{ sizeof(usb_language), STRING, 0x0904 };
/*配置描述符集合*/
code struct
{ struct usb_st_configuration_descriptor cfg;
struct usb_st_interface_descriptor ifc;
struct usb_st_hid_descriptor hid ;
struct usb_st_endpoint_descriptor ep1 ;
unsigned char rep[0x3b] ;
}
usb_configuration =
{
{ 9, 0x02, 0x2200, 1, 1,0, 0x80, 50},
{ 9, 0x04, 1, 0, 1, 0x03, 0, 0, 0 },
{ 9, 0x21, 0x1101, 8, 1, 0x22, 0x3B00 },
{ 7, 0x05, 0x81, 0x03, 32, 0x20 },
{ 0x05,0x01, /* Usage Page (Generic Desktop) */
0x09,0x06, /* Usage (Keyboard) */
0xA1,0x01, /* Collection (Application) */
0x05,0x07, /* Usage Page (Keyboard) */
0x19,224, /* Usage Minimum (224) */
0x29,231, /* Usage Maximum (231) */
0x15,0x00, /* Logical Minimum (0) */
0x25,0x01, /* Logical Maximum (1) */
0x75,0x01, /* Report Size (1) */
0x95,0x08, /* Report Count (8) */
0x81,0x02, /* Input (Data, Variable, Absolute) */
0x81,0x01, /* Input (Constant) */
0x19,0x00, /* Usage Minimum (0) */
0x29,101, /* Usage Maximum (101) */
0x15,0x00, /* Logical Minimum (0) */
0x25,101, /* Logical Maximum (101) */
0x75,0x08, /* Report Size (8) */
0x95,0x06, /* Report Count (6) */
0x81,0x00, /* Input (Data, Array) */
0x05,0x08, /* Usage Page (LED) */
0x19,0x01, /* Usage Minimum (1) */
0x29,0x05, /* Usage Maximum (5) */
0x15,0x00, /* Logical Minimum (0) */
0x25,0x01, /* Logical Maximum (1) */
0x75,0x01, /* Report Size (1) */
0x95,0x05, /* Report Count (5) */
0x91,0x02, /* Output (Data, Variable, Absolute) */
0x95,0x03, /* Report Count (3) */
0x91,0x01, /* Output (Constant) */
0xC0 /* End Collection */
}
};
unsigned char key[4][4]={HID_W,HID_E,HID_L,HID_C,
HID_O,HID_M,HID_E,HID_U,
HID_S,HID_B,HID_R,HID_D,
HID_C,HID_A,HID_B,HID_SPACEBAR};
unsigned char usb_kbd_state;
unsigned char transmit_no_key;
typedef union
{
unsigned int w;
unsigned char b[2];
} Union16;
Union16 scan_key;
unsigned char usb_key;
unsigned char key_hit;
unsigned char shift_key;
static unsigned char endpoint_status[2];
static unsigned char hid_idle_duration;
static unsigned char *pbuffer;
static unsigned char bmRequestType;
unsigned char usb_configuration_nb;
extern bit usb_connected;
bit usb_connected_stored;
bit usb_configured_stored;
/////////////////////////////
void main (void)
{
EA = 1; //使能中断
init_timer0(); //定时器初始化
delay(10);
usb_task_init(); //usb控制器初始化
while(1) //任务循环
{
usb_task(); //usb任务处理子程序
usb_kbd_task(); //键盘任务处理
delay(256); //延时
}
}
void init_timer0()
{
TMOD=0x05;
TH0=0;
TL0=0;
}
void delay(int n)
{
TH0=n;
TL0=0;
TR0=1;
if(TH0>1);
return;
}
void usb_task_init(void)
{
USBCON |= 0x80; //使能USB控制器
USBCON |= 0x10; /*USB软件插拔*/
delay(100);
USBCON &= ~0x10;
PLLDIV = 32; //配置控制器时钟
PLLCON |= 0x02;//使能PLL
//usb_configure_endpoint(EP_CONTROL, CONTROL);//配置控制端口
UEPNUM = 0;//复位控制端口
UEPCONX = 0;
/*初始化状态变量*/
usb_connected = 0;
usb_connected_stored = 1;
usb_configured_stored = 0;
transmit_no_key = 0;
key_hit = 0;
usb_kbd_state = 0;
shift_key = 0;
endpoint_status[0] = 0x00;
endpoint_status[1] = 0x00;
usb_connected = 0;
usb_configuration_nb = 0x00;
}
/////////////////////////////////
void usb_task(void)
{
if (USBINT & 0x01) //如果处于挂起状态
{
if (usb_connected == 1)
{
usb_connected = 0;
}
if (USBINT & 0x20)//当接受到唤醒指令时
{
usb_connected = 1;//设置连接标志
USBINT =USBINT & ~0x01;//清除挂起标志
USBINT =USBINT & ~0x20;//清除唤醒标志
USBINT =USBINT & ~0x08;
}
}
else
{
usb_connected = 1;
if (USBINT & 0x10) //复位中断;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -