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

📄 ch374 key v1.0.c

📁 USB键盘设计 基于国产USB芯片CH374
💻 C
📖 第 1 页 / 共 2 页
字号:
                                   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 + -