📄 ch374 key v1.0.c
字号:
Usb_HID_Get_Idle( );
break;
}
case DEF_USB_GET_STATUS:
{
Usb_Get_Status( );
break;
}
default:
data_to_transfer = 0xFF;
break;
}
}
else
data_to_transfer = 0xFF;
if ( data_to_transfer == 0xFF )
Write374Byte( REG_USB_ENDP0, M_SET_EP0_RECV_STA( M_SET_EP0_TRAN_STA( 0 ) ) ); //STALL
else if ( data_to_transfer <= RAM_ENDP0_SIZE )
{
if ( SetupReq == DEF_USB_SET_CONFIG && SetupReqBuf.bType == USB_HID_DESCR_TYPE )
{
Write374Byte( REG_USB_ENDP0, M_SET_EP0_RECV_ACK( Read374Byte( REG_USB_ENDP0 ) ) | BIT_EP0_RECV_TOG );
}
else
{
Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_ACK( M_SET_EP0_RECV_ACK( Read374Byte( REG_USB_ENDP0 ) ), data_to_transfer ) | BIT_EP0_TRAN_TOG );
}
}
break;
}
case USB_INT_EP0_OUT:
{
switch( SetupReq )
{
case DEF_USB_SET_CONFIG:
{
if ( s & BIT_STAT_TOG_MATCH )
{
LedStatus = Read374Byte( RAM_ENDP0_RECV );
Led_Task( );
Write374Byte( REG_USB_ENDP0,M_SET_EP0_RECV_ACK( Read374Byte( REG_USB_ENDP0 ) ) ^ BIT_EP0_RECV_TOG );
break;
}
}
default:
Write374Byte( REG_USB_ENDP0,M_SET_EP0_TRAN_NAK( 0 ) );
break;
}
break;
}
case USB_INT_EP0_IN:
{
switch( SetupReq )
{
case DEF_USB_GET_DESCR:
{
data_to_transfer = SetupLen >= RAM_ENDP0_SIZE ? RAM_ENDP0_SIZE:SetupLen;
Write374Block( RAM_ENDP0_TRAN, data_to_transfer, pDescr ); //加载上传数据
SetupLen -= data_to_transfer;
pDescr += data_to_transfer;
Write374Byte( REG_USB_ENDP0, M_SET_EP0_TRAN_ACK( Read374Byte( REG_USB_ENDP0 ), data_to_transfer ) ^ BIT_EP0_TRAN_TOG );
break;
}
case DEF_USB_SET_ADDRESS:
Write374Byte( REG_USB_ADDR,SetupLen );
default:
Write374Byte( REG_USB_ENDP0,M_SET_EP0_TRAN_NAK( 0 ) );
break;
}
break;
}
default:
break;
}
Write374Byte( REG_INTER_FLAG,BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); //清中断标志
}
else if( s & BIT_IF_USB_SUSPEND ) //USB总线挂起
{
Write374Byte( REG_INTER_FLAG,BIT_IF_USB_PAUSE | BIT_IF_USB_SUSPEND ); //清中断标志
Write374Byte( REG_SYS_CTRL,Read374Byte( REG_SYS_CTRL ) | BIT_CTRL_OSCIL_OFF ); //时钟振荡器停止振荡,进入睡眠状态
}
else if( s & BIT_IF_WAKE_UP ) //芯片唤醒中断
{
Write374Byte( REG_INTER_FLAG,BIT_IF_USB_PAUSE | BIT_IF_WAKE_UP ); //清中断标志
}
else //意外的中断,不可能发生的情况,除了硬件损坏
{
Write374Byte( REG_INTER_FLAG,BIT_IF_USB_PAUSE | BIT_IF_INTER_FLAG ); //清中断标志
}
}
void Usb_Get_Descriptor( void ) //Get_Descriptor 读取描述符请求
{
switch( SetupReqBuf.wValueH )
{
case USB_DEVICE_DESCR_TYPE: //Get_Descriptor--Device
{
pDescr = (PUINT8)( &MyDevDescr[0] );
data_to_transfer = sizeof( MyDevDescr );
break;
}
case USB_CONFIG_DESCR_TYPE: //Get_Descriptor--Configuration
{
pDescr = (PUINT8)( &MyCfgDescr[0] );
data_to_transfer = sizeof( MyCfgDescr );
break;
}
case USB_HID_DESCR_TYPE: //Get_Descriptor--HID Class
{
pDescr = (PUINT8)( &HIDClassDescr[0] );
data_to_transfer = sizeof( HIDClassDescr );
break;
}
case USB_REPORT_DESCR_TYPE: //Get_Descriptor--HID Report
{
pDescr = (PUINT8)( &HIDReportDescr[0] );
data_to_transfer = sizeof( HIDReportDescr );
break;
}
default: data_to_transfer = 0xFF;
break;
}
if( SetupLen > data_to_transfer )
SetupLen = data_to_transfer;
data_to_transfer = SetupLen >= RAM_ENDP0_SIZE ? RAM_ENDP0_SIZE:SetupLen;
Write374Block( RAM_ENDP0_TRAN, data_to_transfer, pDescr );
SetupLen -= data_to_transfer;
pDescr += data_to_transfer;
}
void Usb_Set_Address( void ) //Set_Address 设置地址
{
SetupLen = SetupReqBuf.wValueL;
}
void Usb_Set_Configuration( void ) //Set_Configuration 设置设备配置值
{
UsbConfig = SetupReqBuf.wValueL;
}
void Usb_Get_Interface( void ) //Get_Interface 查询接口替代值
{
Write374Byte( RAM_ENDP0_TRAN, 0 );
if ( SetupLen >= 1 )
data_to_transfer = 1;
}
void Usb_Get_Configuration( void ) //Get_Configuration 查询设备配置值
{
Write374Byte( RAM_ENDP0_TRAN, UsbConfig );
if ( SetupLen >= 1 )
data_to_transfer = 1;
}
void Usb_Get_Status( void ) //Get_Status 查询设备、接口或端点的特性状态
{
Write374Byte( RAM_ENDP0_TRAN, 0 );
Write374Byte( RAM_ENDP0_TRAN + 1, 0 );
if ( SetupLen >= 2 )
data_to_transfer = 2;
else
data_to_transfer = SetupLen;
}
void Usb_HID_Set_Report( void ) //Set_Report 主机发送报表给设备
{
;
}
void Usb_HID_Get_Report( void ) //Get_Report 主机向设备请求报表
{
if ( KeyChang ) //如果有按键按下,则发送键值给主机
{
KeyChang --;
Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_ACK( Read374Byte( REG_USB_ENDP1 ), 8 ) ^ BIT_EP1_TRAN_TOG );
}
else if ( DataChang ) //如果间隔时间到,发送键值给主机
{
DataChang --;
Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_ACK( Read374Byte( REG_USB_ENDP1 ), 8 ) ^ BIT_EP1_TRAN_TOG );
}
else
{
Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_NAK( Read374Byte( REG_USB_ENDP1 ) ) );
}
}
void Usb_HID_Set_Idle( void ) //Set_Idle 设置HID设备报表的中断输入间隔
{
if ( SetupReqBuf.wValueL == 0x01 )
time_period = SetupReqBuf.wValueH;
}
void Usb_HID_Get_Idle( void ) //Get_Idle 查询HID设备报表的中断输入间隔
{
Write374Byte( RAM_ENDP1_TRAN, time_period );
if ( SetupLen >= 1 )
data_to_transfer = 1;
}
void Key_Task( void ) //键盘事务处理
{
KeyScan( );
if ( KeyHit )
{
MainKeyStatus[ 0 ] = NO_KEY;
MainKeyStatus[ 1 ] = NO_KEY;
MainKeyStatus[ 2 ] = HID_A;
MainKeyStatus[ 3 ] = NO_KEY;
MainKeyStatus[ 4 ] = NO_KEY;
MainKeyStatus[ 5 ] = NO_KEY;
MainKeyStatus[ 6 ] = NO_KEY;
MainKeyStatus[ 7 ] = NO_KEY;
KeyHit = 0;
KeyChang = 2;
Write374Byte( REG_USB_ENDP1, M_SET_EP1_TRAN_ACK( Read374Byte( REG_USB_ENDP1 ), 8 ) );
}
else
{
MainKeyStatus[ 0 ] = NO_KEY;
MainKeyStatus[ 1 ] = NO_KEY;
MainKeyStatus[ 2 ] = NO_KEY;
MainKeyStatus[ 3 ] = NO_KEY;
MainKeyStatus[ 4 ] = NO_KEY;
MainKeyStatus[ 5 ] = NO_KEY;
MainKeyStatus[ 6 ] = NO_KEY;
MainKeyStatus[ 7 ] = NO_KEY;
}
Write374Block( RAM_ENDP1_TRAN, 8, MainKeyStatus );
}
void KeyScan( void ) //键盘扫描
{
if ( ( P3 & K1 ) == 0 )
{
mDelaymS( 5 );
if ( ( P3 & K1 ) == 0 )
KeyHit = 1;
}
}
void Led_Task( void ) //键盘指示灯事务处理
{
if ( LedStatus & 0x01 )
P1 &= LED1;
if ( LedStatus & 0x02 )
P1 &= LED2;
if ( LedStatus & 0x04 )
P1 &= LED3;
}
void TimeCounter( void ) interrupt 1 using 2 //定时器/计数器0计数事务
{
TimeCount ++;
TH0 = 0xE0;
TL0 = 0xC0;
if ( time_period && ( TimeCount >= time_period ) )
{
DataChang = 2;
TimeCount = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -