[求助]关于CH372模拟键盘的问题

#include #include #include "CH375INC.H" unsigned char idata buf[8]; typedef union _REQUEST_PACK { unsigned char buffer[8]; struct { unsigned char bmReuestType; //标准请求字 unsigned char bRequest; //请求代码 unsigned int wValue; //特性选择高 unsigned int wIndx; //索引 unsigned int wLength; //数据长度 }r; } mREQUEST_PACKET, *mpREQUEST_PACKET; code unsigned char HIDKEY[] = //键盘编码 { 0x00,0x00,0x27,//0 0x00,0x00,0x1e,//1 0x00,0x00,0x1f,//2 0x00,0x00,0x20,//3 0x00,0x00,0x21,//4 0x00,0x00,0x22,//5 0x00,0x00,0x23,//6 0x00,0x00,0x24,//7 0x00,0x00,0x25,//8 0x00,0x00,0x26,//9 } ;

//设备描述符 unsigned char code DevDes[]= { 0x12 //描述符大小 , 0x01 //常数DEVICE , 0x10 //USB规范版本信息 , 0x01 , 0x00 //类别码, , 0x00 //子类别码 , 0x00 //协议码 , 0x08 //端点0的最大信息包大小 , 0x3c //厂商ID , 0x41 , 0x03 //产品ID , 0x20 , 0x00 //设备版本信息 , 0x02 , 0x01 //索引值 , 0x02 , 0x00 , 0x01 //可能配置的数目 }; //配置描述符 unsigned char code ConDes[]= { //配置描述符 0x09, 0x02, 0x22, 0x00, 0x01, 0x01, 0x04, 0xa0, 0x23,//配置描述符 0x09, 0x04, 0x00, 0x00, 0x01, 0x03, 0x01, 0x01, 0x05,//接口描述符 0x09, 0x21, 0x10, 0x01, 0x00, 0x01, 0x22, 0x41, 0x00,//HID类描述符 0x07, 0x05, 0x81, 0x03, 0x08, 0x00, 0x18 //端点描述符,只配置了输入端点,输出端点用0端点 }; //配置描述符

/*报表描述符*/ unsigned char code Hid_des[]= { 0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x05, 0x07, 0x19, 0xe0, 0x29, 0xe7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x01, 0x95, 0x03, 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x03, 0x91, 0x02, 0x95, 0x01, 0x75, 0x05, 0x91, 0x01, 0x95, 0x06, 0x75, 0x08, 0x15, 0x00, 0x26, 0xff, 0x00, 0x05, 0x07, 0x19, 0x00, 0x2a, 0xff, 0x00, 0x81, 0x00, 0xc0 }; /*关于全局变量的定义*/ unsigned char mVarSetupRequest; // ;USB请求码 unsigned char mVarSetupLength; // 后续数据长度 unsigned char code * VarSetupDescr; //描述符偏移地址 unsigned char VarUsbAddress ; bit CH375FLAGERR; //错误清0 bit CH375CONFLAG; bit CH372_UP_DATA0; bit CH372_UP_DATA1;

sbit key =P3^3; sbit led =P3^6; sbit CS = P3^0; sbit WR_DAT = P1^7; sbit RD_DAT = P1^6; sbit A0 = P1^5; sbit CH375_INT_WIRE = P3^2; //P3.2, INT0, 连接CH375的INT#引脚,用于查询中断状态 */ sbit CH375ACT = P1^0; //输出配置信号

unsigned char idata UPDATA_FLAG; mREQUEST_PACKET request;

/*硬件定义,根据硬件修改*/ unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */ unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375数据端口的I/O地址 */

/* 延时2微秒,不精确 */ void Delay1us() { ; }

void Delay2us( ) { unsigned char i; #define DELAY_START_VALUE 1 /* 根据单片机的时钟选择初值,20MHz以下为0,30MHz以上为2 */ for ( i=DELAY_START_VALUE; i!=0; i-- ); } /*延时1ms*/ void Delay1ms(unsigned int count) { unsigned int loop0,loop1; for(loop0 = 0; loop0 < count; loop0++ ) { for(loop1 = 0 ;loop1 < 65; loop1++){ _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } }

/* 延时50毫秒,不精确 */ void Delay50ms( ) { unsigned char i, j; for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- ); }

void CH375_WR_CMD_PORT( unsigned char cmd ) { //向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 //delay2us(); CH375_CMD_PORT=cmd; P0 = cmd; A0 = 1; // P0_DIR = output; 对于标准双向I/O,请在此设置为输出方向 RD_DAT = 1; // CH375_CS = 0; WR_DAT = 0; // CH375_CS = 0; 对于高速单片机,该指令用于延时,以便向CH375_WR产生宽度至少为80nS的低电平脉冲 RD_DAT = 1; WR_DAT = 1; // CH375_CS = 1; A0 = 0; // P0_DIR = input; 对于标准双向I/O,请在此设置为输入方向 P0 = 0xFF;

Delay2us( ); }

void CH375_WR_DAT_PORT( unsigned char dat ) { // 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 CH375_DAT_PORT=dat; /* ******************** 注释中是用普通I/O引脚模拟8位并口的时序*/ P0 = dat; // P0_DIR = output; 对于标准双向I/O,请在此设置为输出方向 // CH375_CS = 0; WR_DAT = 0; // CH375_CS = 0; RD_DAT = 1; WR_DAT = 1; // CH375_CS = 1; // P0_DIR = input; 对于标准双向I/O,请在此设置为输入方向 P0 = 0xFF; /******************** */ Delay1us(); // 因为MCS51单片机较慢所以实际上无需延时 }

unsigned char CH375_RD_DAT_PORT( void ) { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ unsigned char dat ; //delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */ /* ******************** 注释中是用普通I/O引脚模拟8位并口的时序 */ // P0_DIR = input; 对于标准双向I/O,请在此设置为输入方向 P0 = 0xFF; // CH375_CS = 0; RD_DAT = 0; // CH375_CS = 0; 对于高速单片机,该指令用于延时,以便向CH375_RD产生宽度至少为80nS的低电平脉冲 dat = P0; RD_DAT = 1; // CH375_CS = 1; P0 = 0xFF; return( dat ); /******************** */ return( CH375_DAT_PORT ); } /* CH375初始化子程序 */ void CH375_Init( ) { /* 设置USB工作模式, 必要操作 */ CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( 1 ); /* 设置为使用内置固件的USB设备方式 */ for ( ;; ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( CH375_RD_DAT_PORT( )==CMD_RET_SUCCESS ) break; } }

//端点0数据上传 void mCh375Ep0Up() { unsigned char i,len; if(mVarSetupLength) { //长度不为0传输具体长度的数据 if(mVarSetupLength<=8) { len=mVarSetupLength; mVarSetupLength=0; } //长度小于8则长输要求的长度 else { len=8; mVarSetupLength-=8; } //长度大于8则传输8个,切总长度减8 CH375_WR_CMD_PORT(CMD_WR_USB_DATA3); //发出写端点0的命令 CH375_WR_DAT_PORT(len); //写入长度 for(i=0;i!=len;i++) CH375_WR_DAT_PORT(request.buffer[i]); //循环写入数据 } else { CH375_WR_CMD_PORT(CMD_WR_USB_DATA3); //发出写端点0的命令 CH375_WR_DAT_PORT(0); //上传0长度数据,这是一个状态阶段 } }

//复制描述符以便上传 void mCh375DesUp() { unsigned char k; for (k=0; k!=8; k++ ) { request.buffer[k]=*VarSetupDescr; //依次复制8个描述符, VarSetupDescr++; } }

/*中断函数,但是本例用的是查询方式,只处理了输入端点1和端点0的事件,其余不处理*/ void mCH375Interrupt( ) { unsigned char InterruptStatus; unsigned char length, c1, len; CH375_WR_CMD_PORT(CMD_GET_STATUS); /* 获取中断状态并取消中断请求 */ InterruptStatus =CH375_RD_DAT_PORT(); /* 获取中断状态 */ switch(InterruptStatus){ // 分析中断状态 case USB_INT_EP1_OUT: //中断端点下传成功,未处理 CH375_WR_CMD_PORT(CMD_RD_USB_DATA); //发出读数据命令 if( length=CH375_RD_DAT_PORT( ) ) { //长度为0跳出 for(len=0;len!=length;len++)c1=CH375_RD_DAT_PORT(); //取出下传数据 } break; case USB_INT_EP1_IN: //中断端点上传成功,未处理 CH375_WR_CMD_PORT (CMD_UNLOCK_USB); //释放缓冲区 if(CH372_UP_DATA0==1) { unsigned char i=0; CH375_WR_CMD_PORT(CMD_WR_USB_DATA5); //发出写上传端点命令 CH375_WR_DAT_PORT(8); for(i=0;i!=8;i++) CH375_WR_DAT_PORT(0x00); CH372_UP_DATA1=1; CH372_UP_DATA0=0; } break; case USB_INT_EP0_SETUP: //控制端点建立成功 CH375_WR_CMD_PORT(CMD_RD_USB_DATA); length=CH375_RD_DAT_PORT(); for(len=0;len!=length;len++)request.buffer[len]=CH375_RD_DAT_PORT(); // 取出数据 if(length==0x08){

请把你的问题说详细一些


主函数这样写能正确发送数字2; void main( ) {

Delay50ms( ); /* 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 */ CH375_Init( ); /* 初始化CH375 */ while(1) { /* 主程序 */ if(CH375_INT_WIRE == 0) mCH375Interrupt( );

if(UPDATA_FLAG==0x01) { while(CH372_UP_DATA1==1); CH372_UP_DATA1=0; //sendover(); PutKeyNum(2); while(CH372_UP_DATA1==1); CH372_UP_DATA1=0; sendover(); }要是像我上面帖子那样写 就发不出数字了? 怎么发送0123456789回车呀?搞很久了没搞明白!!!帮帮我...555555555555


只有登录才能回复,可以选择微信账号登录