?? main.c
字號:
/******************************************************************
本程序只供學習使用,未經作者許可,不得用于其它任何用途
歡迎訪問我的USB專區:http://group.ednchina.com/93/
歡迎訪問我的blog: http://www.ednchina.com/blog/computer00
http://computer00.21ic.org
感謝PCB贊助商——電子園: http://bbs.cepark.com/
main.c file
作者:電腦圈圈
建立日期: 2008.06.27
修改日期: 2008.07.14
版本:V1.1
版權所有,盜版必究。
Copyright(C) 電腦圈圈 2008-2018
All rights reserved
*******************************************************************/
#include <AT89X52.H> //頭文件
#include "Key.h"
#include "Led.h"
#include "UART.h"
#include "pdiusbd12.h"
#include "UsbCore.h"
#include "config.h"
code uint8 HeadTable[][74]={
"********************************************************************\r\n",
"****** 《圈圈教你玩USB》之 USB鍵盤 ******\r\n",
"****** AT89S52 CPU ******\r\n",
"****** 建立日期:",__DATE__," ******\r\n",
"****** 建立時間:",__TIME__," ******\r\n",
"****** 作者:電腦圈圈 ******\r\n",
"****** 歡迎訪問作者的 ******\r\n",
"****** USB專區:http://group.ednchina.com/93/ ******\r\n",
"****** BLOG1:http://www.ednchina.com/blog/computer00 ******\r\n",
"****** BLOG2:http://computer00.21ic.org ******\r\n",
"****** 請按K1-K8分別進行測試 ******\r\n",
"****** K1:左Ctrl鍵 K2:左Shift鍵 K3:左Alt鍵 K4:1鍵 ******\r\n",
"****** K5:2鍵 K6:3鍵 K7:Caps Lock鍵 K8: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(KeyPress & KEY1) //如果KEY1按住
{
Buf[0]|=0x01; //KEY1為左Ctrl鍵。
}
if(KeyPress & KEY2) //如果KEY2按住
{
Buf[0]|=0x02; //KEY2為左Shift鍵。
}
if(KeyPress & KEY3) //如果KEY3按住
{
Buf[0]|=0x04; //KEY3為左Alt鍵
}
if(KeyPress & KEY4) //如果KEY4按住
{
Buf[i]=0x59; //KEY4為數字小鍵盤1鍵。
i++; //切換到下個位置。
}
if(KeyPress & KEY5) //如果KEY5按住
{
Buf[i]=0x5A; //KEY5數字小鍵盤2鍵。
i++; //切換到下個位置。
}
if(KeyPress & KEY6) //如果KEY6按住
{
Buf[i]=0x5B; //KEY6為數字小鍵盤3鍵。
i++; //切換到下個位置。
}
if(KeyPress & KEY7) //如果KEY7按住
{
Buf[i]=0x39; //KEY7為大/小寫切換鍵。
i++; //切換到下個位置。
}
if(KeyPress & KEY8) //如果KEY8按住
{
Buf[i]=0x53; //KEY8為數字小鍵盤功能切換鍵。
}
//報告準備好了,通過端點1返回,長度為8字節。
D12WriteEndpointBuffer(3,8,Buf);
Ep1InIsBusy=1; //設置端點忙標志。
//記得清除KeyUp和KeyDown
KeyUp=0;
KeyDown=0;
}
////////////////////////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) //如果有中斷發生
{
D12WriteCommand(READ_INTERRUPT_REGISTER); //寫讀中斷寄存器的命令
InterruptSource=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(KeyUp||KeyDown) //如果有按鍵事件發生
{
SendReport(); //則返回報告
}
KeyCanChange=1; //允許按鍵掃描
}
}
}
}
////////////////////////End of function//////////////////////////////
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -