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

📄 tm.c

📁 采用ch375开发鼠标的例程
💻 C
字号:
//CH372外部固件模式 命令子函数 默认在24MHz下
#include <REG52.h>
#include <intrins.h>
#include <CH375INC.H>
#include <custom_define.h>
#include <usb_descriptor.h>
#include <stdio.h>
//#ifndef DELAY_CONSTANT
//#define DELAY_CONSTANT 
//#endif


/*sbit    KEY= P3^3;
sbit LED4= P1^4;
sbit LED5= P1^5;
sbit LED6= P1^6;
sbit LED7= P1^7;
*/
UINT8 int_status;
//bit flag_err_unknownsetup; 

//UINT8  data_buf[8];
union _ep0_data
{ 
    UINT8 data_buf[8];
    struct 
    { 
        UINT8  bmRequestType;       //标准请求字
        UINT8  bRequest;     //请求代码
        UINT16   wValue; //特性选择高
        UINT16   wIndx; //索引
        UINT16   wLength; //数据长度
    }device_request;
}ep0_data;

struct _desc_info
{ 
      UINT8 desc_type;
      UINT8 desc_index;
      UINT8 desc_length;
}desc_info;

void intt1() interrupt 2 //using 1
{ 
      UINT8 status_temp,ep0_data_len,requesttype_temp,usb_address;
      IE1=0;
      status_temp=CH37x_get_status();

      switch(status_temp)
      { 
              case(USB_INT_EP0_SETUP):
          
              case(USB_INT_EP0_OUT):break;
              case(USB_INT_EP0_IN):
              case(USB_INT_EP1_OUT):break;
              case(USB_INT_EP1_IN):break;
              case(USB_INT_EP2_OUT):break;
              case(USB_INT_EP2_IN):break;
              case(USB_INT_BUS_RESET1):{flag_configured=0;flag_return_desc=0;flag_set_add=0;flag_report_input=0;break;}
              case(USB_INT_BUS_RESET2):{flag_configured=0;flag_return_desc=0;flag_set_add=0;flag_report_input=0;break;}
              case(USB_INT_BUS_RESET3):{flag_configured=0;flag_return_desc=0;flag_set_add=0;flag_report_input=0;break;}
              case(USB_INT_BUS_RESET4):{flag_configured=0;flag_return_desc=0;flag_set_add=0;flag_report_input=0;break;}
              default:break;//return stall
              }

       }
        CH37x_unlock_usb();
}

void delay()
{;}

void delay20us()
{ UINT8 ms=40; //24MHz
while(ms--);

}

/*void delay1ms()
{ UINT8 ms,sm;
    for ( ms=4; ms!=0; ms-- )
{   sm=250;
    while(--sm);
}
}*/
void delayms(UINT8 delay)
{ UINT8 ms,sm,c;
for(ms=delay;ms!=0;ms--)
{ for(sm=200;sm!=0;sm--)c+=3;  /* 在24MHz时钟下延时500uS */
for(sm=200;sm!=0;sm--)c+=3;  /* 在24MHz时钟下延时500uS */
}
}

bit temp_bit;

void init_CH37x()
{ //flag_err_unknownsetup=0;
flag_return_desc=0;
flag_configured=0;
flag_set_add=0;
flag_report_input=0;
L6=1;
do{
	temp_bit=CH37x_set_usb_mode(0x01);
   	_nop_();
	L6=0;
}
while(temp_bit!=SUCCESS);
L6=1;
/*L7=0;
delayms(50);
delayms(50);
delayms(50);
delayms(50);
delayms(50);
L7=1;*/
}
/*void CH37x_reset_all()
{ UINT8 i;
CH375_CMD_PORT=CMD_RESET_ALL;
i=40;
while(i--)delay1ms();
}*/
//void CH37x_check_exist(){;}
//void Set_usb_id(){;}

bit CH37x_set_usb_mode(UINT8 mode)
{ 
    CH375_WR_CMD_PORT(CMD_SET_USB_MODE);
    delay();
    CH375_WR_DAT_PORT(mode);
    delay20us();
    if(CH375_RD_DAT_PORT()==CMD_RET_SUCCESS)
    return(SUCCESS);
    else
    return(ABORT);
}

UINT8 CH37x_get_status()
{ 
    CH375_WR_CMD_PORT(CMD_GET_STATUS);
    delay();
    return(CH375_RD_DAT_PORT());
}
void CH37x_unlock_usb()
{ 
      CH375_WR_CMD_PORT(CMD_UNLOCK_USB);
      delay();

}

UINT8 CH37x_rd_usb_data()
{ 
    UINT8 data_len,data_len_temp; 
    UINT8 *data_buf_r=ep0_data.data_buf;
    CH375_WR_CMD_PORT(CMD_RD_USB_DATA);
    delay();
    data_len_temp=data_len=CH375_RD_DAT_PORT();
    while(data_len)
    { 
        *data_buf_r=CH375_RD_DAT_PORT();
        data_buf_r++;
          data_len--;
    }
    return(data_len_temp);
}
void CH37x_wr_usb_data5(UINT8 data_len)
{ 
    UINT8 *data_buf_w=ep0_data.data_buf;
    CH375_WR_CMD_PORT(CMD_WR_USB_DATA5);
    delay();
    CH375_WR_DAT_PORT(data_len);
    
    while(data_len)
    { 
      CH375_WR_DAT_PORT(*data_buf_w);
      data_buf_w++;
      data_len--;
    }
}
/*void CH37x_wr_usb_data7(UINT8 data_len)
{ UINT8 *data_buf_w=ep0_data.data_buf;
CH375_CMD_PORT=CMD_WR_USB_DATA7;
delay();
CH375_DAT_PORT=data_len;

while(data_len)
{ CH375_DAT_PORT=*data_buf_w;
  data_buf_w++;
  data_len--;
}
}
*/
void CH37x_set_usb_addr(UINT8 address)
{ 
    CH375_WR_CMD_PORT(CMD_SET_USB_ADDR);
    delay();
    CH375_WR_DAT_PORT(address);
}
/*void CH37x_set_endp2(UINT8 mode_2)
{ UINT8 i=8;
CH375_CMD_PORT=CMD_SET_ENDP2;
delay();
CH375_DAT_PORT=mode_2;

while(i--);
}*/
void CH37x_set_endp3(UINT8 mode_3)
{ 
    UINT8 i=8;
    CH375_WR_CMD_PORT(CMD_SET_ENDP3);
    delay();
    CH375_WR_DAT_PORT(mode_3);
    
    while(i--);
}
void CH37x_set_endp4(UINT8 mode_4)
{ 
    UINT8 i=8;
    CH375_WR_CMD_PORT(CMD_SET_ENDP4);
    delay();
    CH375_WR_DAT_PORT(mode_4);
    
    while(i--);
}
void CH37x_set_endp5(UINT8 mode_5)
{ 
    UINT8 i=8;
    CH375_WR_CMD_PORT(CMD_SET_ENDP5);
    delay();
    CH375_WR_DAT_PORT(mode_5);
    
    while(i--);
}
void CH37x_set_endp6(UINT8 mode_6)
{ 
    UINT8 i=8;
    CH375_WR_CMD_PORT(CMD_SET_ENDP6);
    delay();
    CH375_WR_DAT_PORT(mode_6);
    
    while(i--);
}

void CH37x_set_endp7(UINT8 mode_7)
{ 
    UINT8 i=8;
    CH375_WR_CMD_PORT(CMD_SET_ENDP7);
    delay();
    CH375_WR_DAT_PORT(mode_7);
    
    while(i--);
}

/*UINT8 CH37x_get_toggle()
{ CH375_CMD_PORT=CMD_GET_TOGGLE;
delay();
CH375_DAT_PORT=0x1A;
delay();
return(CH375_DAT_PORT);
}*/
void CH37x_wr_usb_data3(UINT8 data_len)
{ 
    UINT8 *data_buf_w=ep0_data.data_buf;
    CH375_WR_CMD_PORT(CMD_WR_USB_DATA3);
    delay();
    CH375_WR_DAT_PORT(data_len);
    
    while(data_len)
    { 
      CH375_WR_DAT_PORT(*data_buf_w);
      data_buf_w++;
      data_len--;
    }
}
void CH37x_return_desc()
{ 
    UINT8 i=0,j;
    if(flag_return_desc)
    { 
        if(desc_info.desc_length>8)
        { 
            for(j=8;j!=0;j--)ep0_data.data_buf[i++]=*p_desc_type++;
            desc_info.desc_length-=8;
            CH37x_wr_usb_data3(8);
        }
        else//(desc_info.desc_length<=8)
        { 
            for(j=desc_info.desc_length;j!=0;j--)ep0_data.data_buf[i++]=*p_desc_type++;
            CH37x_wr_usb_data3(desc_info.desc_length);
            desc_info.desc_length=0;
            flag_return_desc=0;
        }
    }
}

void init_stdio()
{ 
    SCON = 0x50;
    PCON = 0x80;
    TMOD = 0x20;
    TH1 = 0xf3;  /* 24MHz晶振, 9600bps */
    TR1 = 1;
    TI = 1;
}

unsigned char left_pressed;
unsigned char right_pressed;
main()
{ 
    UINT8 te,pe;
    LED4=0;LED5=0;LED6=0;LED7=0;
    delayms(50);
    LED4=1;LED5=1;LED6=1;LED7=1;
    init_CH37x();
    init_stdio();
    IT0=0;
    IE1=0;
    EX1=1;
    EA=1;
    left_pressed=0;
    right_pressed=0;
    printf( "test\n" );
    
    do
    { 
        LED6=1;
        //P1=test_temp;
        delayms(250);
        do
        {
            if(flag_report_input)
            {
            if(!SW10)		//up
            { 
                for(te=50;te!=0;te--)
                { 
                    ep0_data.data_buf[0]=0x00;
                    ep0_data.data_buf[1]=report_x=0;
                    ep0_data.data_buf[2]=report_y=0xff;
                    CH37x_wr_usb_data5(3);
                }
                }
                if(!SW7)		//down
                {
                for(te=50;te!=0;te--)
                { 
                    ep0_data.data_buf[0]=0x00;
                    ep0_data.data_buf[1]=report_x=0;
                    ep0_data.data_buf[2]=report_y=0x1;
                    CH37x_wr_usb_data5(3);
                }
                }
                if(!SW6)		//right
                {
                for(te=50;te!=0;te--)
                { 
                    ep0_data.data_buf[0]=0x00;
                    ep0_data.data_buf[1]=report_x=1;
                    ep0_data.data_buf[2]=report_y=0;
                    CH37x_wr_usb_data5(3);
                }
                }
                if(!SW8)		//left
                {
                for(te=50;te!=0;te--)
                { 
                    ep0_data.data_buf[0]=0x00;
                    ep0_data.data_buf[1]=report_x=0xff;
                    ep0_data.data_buf[2]=report_y=0;
                    CH37x_wr_usb_data5(3);
                }
                }
                if(!SW11 && !left_pressed)		//left key down
                {
                    ep0_data.data_buf[0]=0x01;
                    ep0_data.data_buf[1]=report_x=0;
                    ep0_data.data_buf[2]=report_y=0;
                    CH37x_wr_usb_data5(3);
                    left_pressed=1;
            }
            else if(SW11 && left_pressed)
            {	//left key up
                ep0_data.data_buf[0]=0x00;
                ep0_data.data_buf[1]=report_x=0;
                ep0_data.data_buf[2]=report_y=0;
                CH37x_wr_usb_data5(3);
                left_pressed=0;
            }
            
            
            if(!SW9 && !right_pressed)		//right key down
            {
                ep0_data.data_buf[0]=0x02;
                ep0_data.data_buf[1]=report_x=0;
                ep0_data.data_buf[2]=report_y=0;
                CH37x_wr_usb_data5(3);
                right_pressed=1;
            }
            else if(SW9 && right_pressed)
            {	//right key up
                ep0_data.data_buf[0]=0x00;
                ep0_data.data_buf[1]=report_x=0;
                ep0_data.data_buf[2]=report_y=0;
                CH37x_wr_usb_data5(3);
                right_pressed=0;
            }
            // flag_report_input=0;
            //LED6=0;
            }
            }while(1);
        for(te=test_count;te!=0;te--)
        { 
            printf("%02X,",(UINT16)test_buf[pe]);
            pe++;
    } }while(1);
}

⌨️ 快捷键说明

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