📄 main.c
字号:
/******************************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途
欢迎光临天祥电子 www.txmcu.cn
*******************************************************************/
#include <AT89X52.H> //头文件
#include "Key.h"
#include "Led.h"
#include "UART.h"
#include "pdiusbd12.h"
#include "UsbCore.h"
#include "config.h"
unsigned char s6,s7,s10,s11,s14,s15,s,again1,again2,again3,again4,again5,again6,pp,qq,rr,ss,tt,uu;
code uint8 HeadTable[][74]={
"********************************************************************\r\n",
"****** “天祥电子”之 USB鼠标 ******\r\n",
"****** www.txmcu.cn ******\r\n",
"****** www.txmcu.com ******\r\n",
"****** AT89S52 CPU ******\r\n",
"****** 建立日期:",__DATE__," ******\r\n",
"****** 建立时间:",__TIME__," ******\r\n",
"****** 请按下列按键分别进行测试 ******\r\n",
"****** S10:左Shift键 S11:左Alt键 S14:1键 ******\r\n",
"****** S15:2键 S6:Caps Lock键 S7:Num Lock键 ******\r\n",
"****** 注意:数字键是数字小键盘,必须打开Num Lock才是数字键 ******\r\n",
"********************************************************************\r\n",
};
/********************************************************************
函数功能:根据按键情况返回报告的函数。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void SendReport(void)
{
//需要返回的8字节报告的缓冲
//通过报告描述符的定义及HID用途表文档,可知Buf[0]的D0是左Ctrl键,
//D1是左Shift键,D2是左Alt键,D3是左GUI(即Window键),
//D4是右Ctrl,D5是右Shift,D6是右Alt,D7是右GUI键。
//Buf[1]保留,值为0。Buf[2]~Buf[7]为键值,最多可以有6个。
//由于我们这里普通键最多只有5个,因此不会超过6个。
//对于实际的键盘,如果按键数太多时,后面的6个字节都为0xFF,
//表示按下的键太多,无法正确返回。
uint8 Buf[8]={0,0,0,0,0,0,0,0};
//由于需要返回多个按键,所以需要增加一个变量来保存当前的位置。
uint8 i=2;
if(s)
{
s=0;
if(s6)
{
s6=0;
Buf[i]=0x39; //S6为大/小写切换键。
i++; //切换到下个位置。
}
if(s7)
{
s7=0;
Buf[i]=0x53; //S7为数字小键盘功能切换键。
}
if(s10)
{
s10=0;
Buf[0]|=0x02; //S10为左Shift键。
}
if(s11)
{
s11=0;
Buf[0]|=0x04; //S11为左Alt键
}
if(s14)
{
s14=0;
Buf[i]=0x59; //S14为数字小键盘1键。
i++; //切换到下个位置。
}
if(s15)
{
s15=0;
Buf[i]=0x5A; //S15数字小键盘2键。
i++; //切换到下个位置。
}
//报告准备好了,通过端点1返回,长度为4字节。
D12WriteEndpointBuffer(3,8,Buf);
Ep1InIsBusy=1; //设置端点忙标志。
}
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函数功能:主函数。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void main(void) //主函数
{
uint8 i;
uint16 id;
uint8 InterruptSource;
EA=1; //打开中断
InitKeyboard(); //初始化按键
InitUART(); //初始化串口
for(i=0;i<19;i++) //显示信息
{
Prints(HeadTable[i]);
}
id=D12ReadID();
Prints("Your D12 chip\'s ID is: ");
PrintShortIntHex(id);
if(id==0x1012)
{
Prints(". ID is correct! Congratulations!\r\n\r\n");
}
else
{
Prints(". ID is incorrect! What a pity!\r\n\r\n");
}
UsbDisconnect(); //先断开USB连接
UsbConnect(); //将USB连接上
ConfigValue=0; //配置值初始化为0
while(1) //死循环
{
if(D12GetIntPin()==0) //如果有中断发生
{
outportb(D12COMMAND,0xF4);// READ_INTERRUPT_REGISTER);
InterruptSource=inportb(D12DATA);//D12ReadByte(); //读回第一字节的中断寄存器
if(InterruptSource&0x80)UsbBusSuspend(); //总线挂起中断处理
if(InterruptSource&0x40)UsbBusReset(); //总线复位中断处理
if(InterruptSource&0x01)UsbEp0Out(); //端点0输出中断处理
if(InterruptSource&0x02)UsbEp0In(); //端点0输入中断处理
if(InterruptSource&0x04)UsbEp1Out(); //端点1输出中断处理
if(InterruptSource&0x08)UsbEp1In(); //端点1输入中断处理
if(InterruptSource&0x10)UsbEp2Out(); //端点2输出中断处理
if(InterruptSource&0x20)UsbEp2In(); //端点2输入中断处理
}
if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据
{
if(!Ep1InIsBusy) //如果端点1输入没有处于忙状态,则可以发送数据
{
KeyCanChange=0; //禁止按键扫描
if(s) //如果有按键事件发生
{
SendReport(); //则返回报告
}
KeyCanChange=1; //允许按键扫描
}
}
}
}
////////////////////////End of function//////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -