头文件1//是CH375的专属相关指令
#ifndef CH375_H
#define CMD_GET_STATUS 0x22 // 获取中止状况并撤销中止请求 ,经过它能够得到中止信息,即什么中止;
#define CMD_SET_USB_MODE 0x15 // 设置USB作业方式 ,设置usb是那种作业方式,是主机的那种,仍是从机的那种;
#define CMD_RET_SUCCESS 0x51
#define CMD_SET_ENDP6 0x1C
#define CMD_SET_ENDP7 0x1D
#define CMD_RD_USB_DATA 0x28
#define CMD_WR_USB_DATA7 0x2B
#define CMD_ISSUE_TOKEN 0x4F
#define CMD_CLR_STALL 0x41
#define USB_INT_SUCCESS 0x14
#define USB_INT_CONNECT 0x15
#define DEMO_CXP_CMD 0x56//指令字
#define CMD_CHECK_EXIST 0x06
#define CMD_RESET_ALL 0x05
#define USB_INT_EP2_IN 0x0A
#define CMD_UNLOCK_USB 0x23
#endif
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#endif
#ifndef BIANLIAN_H
sbit CH375_INT_WIRE = P3^2;//INT0
unsigned char volatile xdata CH375_CMD_PORT _at_ 0xFDff;
unsigned char volatile xdata CH375_DAT_PORT _at_ 0xFCff;
unsigned char endp6_mode,endp7_mode;//两种方式变量,用来奇偶替换;来对应奇偶次传送数据时,改动对应的装备奇偶方式
unsigned char key;//为主程序记载那个键按下
sbit KEYPIN1 = P2^2;
sbit KEYPIN2 = P2^3;
sbit KEYPIN3 = P2^4;
sbit KEYPIN4 = P2^5;
sbit KEYPIN5 = P2^6;
sbit KEYPIN6 = P2^7;
sbit CH375_INT_WIRE = P3^2;//INT0
unsigned char volatile xdata CH375_CMD_PORT _at_ 0xFDff;
unsigned char volatile xdata CH375_DAT_PORT _at_ 0xFCff;
unsigned char endp6_mode,endp7_mode;//两种方式变量,用来奇偶替换;来对应奇偶次传送数据时,改动对应的装备奇偶方式
unsigned
typedef struct _COMMAND_PACKET
{
unsigned char mCommandCode;
unsigned char mCommandCodeNot;
union
{
unsigned char mParameter[5];
struct
{
unsigned char mBufferID;
unsigned int mBufferAddr;
unsigned int mLength;
} buf;
} u;
} mCOMMAND_PACKET, *mpCOMMAND_PACKET;
mCOMMAND_PACKET cmd_cui;
sbit CH375RS = P3^4;
bit FLAG_INT_WAIT;
#endif
{
}
#endif
#ifndef CUI_H
//两奇妙的延时;为了给指令的书写一个缓冲过度时刻;谁叫咋东西破了
void Delay2us( )
{
unsigned char i;
#define DELAY_START_VALUE 1
for ( i=DELAY_START_VALUE; i!=0; i– );
}
void Delay_ms(unsigned char ms) //延时ms
{
unsigned char i;
unsigned char us;
for(i=0; i {
us=100;
while(us–);
}
}
//查当时中止状况,由他来检查当时是什么中止,究竟有没有中止
unsigned char wait_complete()
{
while(CH375_INT_WIRE);//这儿选用的中止零,故接P3^2;
CH375_CMD_PORT = CMD_GET_STATUS;//中止状况操控字;
Delay2us( );
return CH375_DAT_PORT;
}
//设置usb的作业方式;奇次|偶次
void set_usb_mode(unsigned char mode)
{
CH375_CMD_PORT = CMD_SET_USB_MODE;//指令字方式设置;
Delay2us( );
CH375_DAT_PORT = mode;//什么方式?假如做主机,便是5|6方式两种均可(条件两头都有CH375),假如是从机,方式为2(依据主机要
{
#define DELAY_START_VALUE
}
void Delay_ms(unsigned char ms)
{
}
//查当时中止状况,由他来检查当时是什么中止,究竟有没有中止
unsigned char wait_complete()
{
}
//设置usb的作业方式;奇次|偶次
void set_usb_mode(unsigned char mode)
{
//求)
endp6_mode = endp7_mode = 0x80;//初始没有发送数据的时分,这个奇偶标志的玩意的状况为奇状况,放在这儿相当于延时
while(CH375_DAT_PORT != CMD_RET_SUCCESS);//承认方式设置成功
}
}
/设置DAT0的奇偶方式,因为CH375在数据发送时,分奇偶的,所以要配对奇偶对应的方式,这儿是装备的是通道DAT0/
void set_endp6()
{
CH375_CMD_PORT = CMD_SET_ENDP6;//选通道DAT0
Delay2us( );
CH375_DAT_PORT = endp6_mode;//初始状况为奇0x80;偶为0xC0
endp6_mode ^=0x40;//^=是异或的意思,刚好0x80异或0x40是0xC0,而0xC0今后0x40是0x80;这样每次发送后,这个是变到对应的方式的
Delay2us( );
}
void set_endp6()
{
}
//同上,仅仅装备的DAT1
void set_endp7()
{
CH375_CMD_PORT = CMD_SET_ENDP7;
Delay2us( );
CH375_DAT_PORT = endp7_mode;
endp7_mode ^=0x40;//;
Delay2us( );
}
void set_endp7()
{
}
//这儿是读 usb缓存的数据
unsigned char rd_usb_data(unsigned char *buf)
{
unsigned char i,len;
CH375_CMD_PORT = CMD_RD_USB_DATA;//读当时中止状况下对应的端点,ch375有3种端点,而CMD_RD_USB_DATA,是那个端点的
{
//收数据缓存来了数据,呼应了对应的中止,就读谁。。。即读发生呼应的谁谁谁
Delay2us( );
len = CH375_DAT_PORT;//一般榜首个数据是长短,即后边发的数据有多大(几个字节,一次最大只能64个)
Delay2us( );
for (i=0;i!=len;i++)
*buf++ = CH375_DAT_PORT;//读啊读,读len个8位数据
return(len);
}
}
//上面读,下面便是写了
void wr_usb_data(unsigned char len,unsigned char*buf )
{
CH375_CMD_PORT = CMD_WR_USB_DATA7;//写指令
Delay2us( );
CH375_DAT_PORT = len;//自我约好榜首个数是要发送数据的巨细,当然也能够贱点,设置自己的描绘后边数据符号
while(len–)CH375_DAT_PORT = *buf++;
}
void wr_usb_data(unsigned char len,unsigned char*buf )
{
}
unsigned char issue_token(unsigned char endp_and_pid)
{
CH375_CMD_PORT = CMD_ISSUE_TOKEN;//这个了便是发送的令牌的指令了,令牌了,其实也是一种装备,装备你选用什么端口(一般
{
//为2),是输入仍是输出,当然,这是对主机而言的,他有资历发送令牌,
Delay2us( );
CH375_DAT_PORT = endp_and_pid;//这儿装备的是端口和输入或输出的方法,高四位是端点号,低四位了,便是输入仍是输出
return (wait_complete());//等候装备成功
}
}
//这儿是当发送过错的时分,要将对应的端口经行清洗下;去掉本来的过错数据,为下次承受提供条件
unsigned char ERROR(unsigned char err)
{
CH375_CMD_PORT = CMD_CLR_STALL ;要清楚那个端点的指令;
Delay2us( );
CH375_DAT_PORT = err;//那个端点
return(wait_complete());
unsigned char ERROR(unsigned char err)
{
}
//左主机时分发送
void host_send(unsigned char len,unsigned char *buf)
{
wr_usb_data(len,buf);//先向对应的端点的缓存中写数据,这儿选用的是端点2
set_endp7();//对端点DAT1奇偶装备一下,也为下次左预备
if(issue_token(0x21) !=USB_INT_SUCCESS)ERROR(0x02);//这儿的令牌是端点2,低位的1是输出方式
else if(buf == NULL) printf(“0k”);
}
void host_send(unsigned char len,unsigned char *buf)
{
}
//这个是主机承受了
unsigned char host_recv(unsigned char *buf)
{
set_endp6();//端点2的DAT0奇偶装备一下,为下次作预备
if(issue_token(0x29) != USB_INT_SUCCESS)ERROR(0x82);//这儿令牌是端点2,低位9为输入方式
return (rd_usb_data(buf));//读啊,读
}
unsigned char GetKeyCode(void)//这个是按键,对应指令
{
if(KEYPIN1==0) return 1;//对应从机的灯翻开;
if(KEYPIN2==0) return 2;//对应的从机灯全关
if(KEYPIN3==0) return 3;
if(KEYPIN4==0) return 4;
if(KEYPIN5==0) return 5;
if(KEYPIN6==0) return 6;
return 0;
}
unsigned char host_recv(unsigned char *buf)
{
}
unsigned char
{
}
#endif
{
}
void init_rst() //rst//初始时,复位下
{
CH375RS = 1;
Delay_ms(100);
CH375RS = 0;
Delay_ms(200);
}
{
}
void CH375_Init( )//初始化,首要检测单片机与CH375的硬件并口是否连通
{
unsigned char i;
CH375_CMD_PORT = CMD_CHECK_EXIST;
Delay2us( );
CH375_DAT_PORT = 0x55;
Delay2us( );
i = ~ 0x55;
if ( CH375_DAT_PORT != i )
{
for ( i=80; i!=0; i– )
{
CH375_CMD_PORT = CMD_RESET_ALL;
Delay2us( );
}
CH375_CMD_PORT = 0;
Delay_ms(50);
{
}