?? main.lst
字號:
C51 COMPILER V7.06 MAIN 11/16/2008 15:59:35 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Main.c BROWSE DEBUG OBJECTEXTEND TABS(1)
stmt level source
1 /******************************************************************
2 本程序只供學習使用,未經作者許可,不得用于其它任何用途
3
4 歡迎訪問我的USB專區:http://group.ednchina.com/93/
5 歡迎訪問我的blog: http://www.ednchina.com/blog/computer00
6 http://computer00.21ic.org
7
8 感謝PCB贊助商——電子園: http://bbs.cepark.com/
9
10 main.c file
11
12 作者:電腦圈圈
13 建立日期: 2008.06.27
14 修改日期: 2008.07.16
15 版本:V1.1
16 版權所有,盜版必究。
17 Copyright(C) 電腦圈圈 2008-2018
18 All rights reserved
19 *******************************************************************/
20
21 #include <AT89X52.H> //頭文件
22 #include "Key.h"
23 #include "Led.h"
24 #include "UART.h"
25 #include "pdiusbd12.h"
26 #include "UsbCore.h"
27 #include "config.h"
28
29 code uint8 HeadTable[][74]={
30 "********************************************************************\r\n",
31 "****** 《圈圈教你玩USB》之 帶鼠標的USB鍵盤(雙接口實現) ******\r\n",
32 "****** AT89S52 CPU ******\r\n",
33 "****** 建立日期:",__DATE__," ******\r\n",
34 "****** 建立時間:",__TIME__," ******\r\n",
35 "****** 作者:電腦圈圈 ******\r\n",
36 "****** 歡迎訪問作者的 ******\r\n",
37 "****** USB專區:http://group.ednchina.com/93/ ******\r\n",
38 "****** BLOG1:http://www.ednchina.com/blog/computer00 ******\r\n",
39 "****** BLOG2:http://computer00.21ic.org ******\r\n",
40 "****** 請按K1-K8分別進行測試 ******\r\n",
41 "****** K1:功能選擇鍵:按下時K2~K8為鍵盤,松開時K2~K8為鼠標 ******\r\n",
42 "****** 鍵盤功能時 ******\r\n",
43 "****** K2:左Shift鍵 K3:左Alt鍵 K4:1鍵 ******\r\n",
44 "****** K5:2鍵 K6:3鍵 K7:Caps Lock鍵 K8:Num Lock鍵 ******\r\n",
45 "****** 注意:數字鍵是數字小鍵盤,必須打開Num Lock才是數字鍵 ******\r\n",
46 "****** 鼠標功能時 ******\r\n",
47 "****** K2:光標左移 K3:光標右移 K4:光標上移 K5:光標下移 ******\r\n",
48 "****** K6:鼠標左鍵 K7:鼠標中鍵 K8:鼠標右鍵 ******\r\n",
49 "********************************************************************\r\n",
50 };
51
52 /********************************************************************
53 函數功能:根據按鍵情況返回鍵盤報告的函數。
54 入口參數:無。
55 返 回:無。
C51 COMPILER V7.06 MAIN 11/16/2008 15:59:35 PAGE 2
56 備 注:無。
57 ********************************************************************/
58 void SendKeyboardReport(void)
59 {
60 1 //需要返回的9字節報告的緩沖(一字節報告ID加鍵盤8字節報告)
61 1
62 1 uint8 Buf[9]={0,0,0,0,0,0,0,0,0};
63 1
64 1 //由于需要返回多個按鍵,所以需要增加一個變量來保存當前的位置。
65 1 //由于報告ID占用第一字節,所以普通按鍵從第四字節開始存放。
66 1 uint8 i=3;
67 1
68 1 //我們用KEY1鍵來選擇剩余的7個鍵是鍵盤功能還是鼠標功能。
69 1 //當KEY1按住時,剩余7個鍵為鍵盤功能,這7個鍵的功能跟鍵盤
70 1 //實例的一樣。
71 1
72 1 //根據不同的按鍵設置輸入報告
73 1 Buf[0]=0x01; //第一字節為報告ID,報告ID為1。
74 1 if(KeyPress & KEY2) //如果KEY2按住
75 1 {
76 2 Buf[1]|=0x02; //KEY2為左Shift鍵。
77 2 }
78 1 if(KeyPress & KEY3) //如果KEY3按住
79 1 {
80 2 Buf[1]|=0x04; //KEY3為左Alt鍵
81 2 }
82 1 if(KeyPress & KEY4) //如果KEY4按住
83 1 {
84 2 Buf[i]=0x59; //KEY4為數字小鍵盤1鍵。
85 2 i++; //切換到下個位置。
86 2 }
87 1 if(KeyPress & KEY5) //如果KEY5按住
88 1 {
89 2 Buf[i]=0x5A; //KEY5數字小鍵盤2鍵。
90 2 i++; //切換到下個位置。
91 2 }
92 1 if(KeyPress & KEY6) //如果KEY6按住
93 1 {
94 2 Buf[i]=0x5B; //KEY6為數字小鍵盤3鍵。
95 2 i++; //切換到下個位置。
96 2 }
97 1 if(KeyPress & KEY7) //如果KEY7按住
98 1 {
99 2 Buf[i]=0x39; //KEY7為大/小寫切換鍵。
100 2 i++; //切換到下個位置。
101 2 }
102 1 if(KeyPress & KEY8) //如果KEY8按住
103 1 {
104 2 Buf[i]=0x53; //KEY8為數字小鍵盤功能切換鍵。
105 2 }
106 1 //報告準備好了,通過端點1返回,長度為9字節。
107 1 D12WriteEndpointBuffer(3,9,Buf);
108 1 Ep1InIsBusy=1; //設置端點1輸入忙標志。
109 1 //記得清除KeyUp和KeyDown
110 1 KeyUp=0;
111 1 KeyDown=0;
112 1 }
113 ////////////////////////End of function//////////////////////////////
114
115 /********************************************************************
116 函數功能:根據按鍵情況返回鼠標報告的函數。
117 入口參數:無。
C51 COMPILER V7.06 MAIN 11/16/2008 15:59:35 PAGE 3
118 返 回:無。
119 備 注:無。
120 ********************************************************************/
121 void SendMouseReport(void)
122 {
123 1 //需要返回的5字節報告的緩沖(一字節報告ID加鍵盤4字節報告)
124 1
125 1 uint8 Buf[5]={0,0,0,0,0};
126 1
127 1 //當KEY1松開時,剩余7個鍵為鼠標功能,功能分別為:
128 1 //KEY2:光標左移,KEY3:光標右移,KEY4:光標上移,KEY5:光標下移。
129 1 //KEY6:鼠標左鍵,KEY7:鼠標中鍵,KEY8:鼠標右鍵。
130 1
131 1 //根據不同的按鍵設置輸入報告。注意此處,報告ID要跟報告描述符中的一致。
132 1 Buf[0]=0x01; //第一字節為報告ID,報告ID為1。
133 1 if(KeyDown & KEY2) //如果KEY2按下
134 1 {
135 2 Buf[2]=-10; //KEY2為鼠標左移,按一次移動10個單位。
136 2 }
137 1 if(KeyDown & KEY3) //如果KEY3按下
138 1 {
139 2 Buf[2]=10; //KEY3為鼠標右移,按一次移動10個單位。
140 2 }
141 1 if(KeyDown & KEY4) //如果KEY4按下
142 1 {
143 2 Buf[3]=-10; //KEY4為鼠標上移,按一次移動10個單位。
144 2 }
145 1 if(KeyDown & KEY5) //如果KEY5按下
146 1 {
147 2 Buf[3]=10; //KEY5為鼠標下移,按一次移動10個單位。
148 2 }
149 1 if(KeyPress & KEY6) //如果KEY6按住
150 1 {
151 2 Buf[1]|=0x01; //KEY6為鼠標左鍵。
152 2 }
153 1 if(KeyPress & KEY7) //如果KEY7按住
154 1 {
155 2 Buf[1]|=0x04; //KEY7為鼠標中鍵。
156 2 }
157 1 if(KeyPress & KEY8) //如果KEY8按住
158 1 {
159 2 Buf[1]|=0x02; //KEY8為鼠標右鍵。
160 2 }
161 1 //注意此處,要通過端點2返回。
162 1 //報告準備好了,通過端點2返回,長度為5字節。
163 1 D12WriteEndpointBuffer(5,5,Buf);
164 1 Ep2InIsBusy=1; //設置端點2輸入忙標志。
165 1 //記得清除KeyUp和KeyDown
166 1 KeyUp=0;
167 1 KeyDown=0;
168 1 }
169 ////////////////////////End of function//////////////////////////////
170
171 /********************************************************************
172 函數功能:主函數。
173 入口參數:無。
174 返 回:無。
175 備 注:無。
176 ********************************************************************/
177 void main(void) //主函數
178 {
179 1 uint8 i;
C51 COMPILER V7.06 MAIN 11/16/2008 15:59:35 PAGE 4
180 1 uint16 id;
181 1 uint8 InterruptSource;
182 1
183 1 EA=1; //打開中斷
184 1 InitKeyboard(); //初始化按鍵
185 1 InitUART(); //初始化串口
186 1
187 1 for(i=0;i<24;i++) //顯示信息
188 1 {
189 2 Prints(HeadTable[i]);
190 2 }
191 1
192 1 id=D12ReadID();
193 1
194 1 Prints("Your D12 chip\'s ID is: ");
195 1 PrintShortIntHex(id);
196 1
197 1 if(id==0x1012)
198 1 {
199 2 Prints(". ID is correct! Congratulations!\r\n\r\n");
200 2 }
201 1 else
202 1 {
203 2 Prints(". ID is incorrect! What a pity!\r\n\r\n");
204 2 }
205 1
206 1 UsbDisconnect(); //先斷開USB連接
207 1 UsbConnect(); //將USB連接上
208 1 ConfigValue=0; //配置值初始化為0
209 1
210 1 while(1) //死循環
211 1 {
212 2 if(D12GetIntPin()==0) //如果有中斷發生
213 2 {
214 3 D12WriteCommand(READ_INTERRUPT_REGISTER); //寫讀中斷寄存器的命令
215 3 InterruptSource=D12ReadByte(); //讀回第一字節的中斷寄存器
216 3 if(InterruptSource&0x80)UsbBusSuspend(); //總線掛起中斷處理
217 3 if(InterruptSource&0x40)UsbBusReset(); //總線復位中斷處理
218 3 if(InterruptSource&0x01)UsbEp0Out(); //端點0輸出中斷處理
219 3 if(InterruptSource&0x02)UsbEp0In(); //端點0輸入中斷處理
220 3 if(InterruptSource&0x04)UsbEp1Out(); //端點1輸出中斷處理
221 3 if(InterruptSource&0x08)UsbEp1In(); //端點1輸入中斷處理
222 3 if(InterruptSource&0x10)UsbEp2Out(); //端點2輸出中斷處理
223 3 if(InterruptSource&0x20)UsbEp2In(); //端點2輸入中斷處理
224 3 }
225 2 if(ConfigValue!=0) //如果已經設置為非0的配置,則可以返回報告數據
226 2 {
227 3 //為顯示KEY1選擇功能,當KEY1按住時,將LED8點亮,表示鍵盤功能狀態
228 3 if(KeyPress & KEY1)
229 3 {
230 4 OnLed8();
231 4 //如果端點1輸入沒有處于忙狀態,則可以發送數據
232 4 if(!Ep1InIsBusy)
233 4 {
234 5 KeyCanChange=0; //禁止按鍵掃描
235 5 if(KeyUp||KeyDown) //如果有按鍵事件發生
236 5 {
237 6 SendKeyboardReport(); //則返回報告
238 6 }
239 5 KeyCanChange=1; //允許按鍵掃描
240 5 }
241 4 }
C51 COMPILER V7.06 MAIN 11/16/2008 15:59:35 PAGE 5
242 3 else
243 3 {
244 4 OffLed8();
245 4 //如果端點2輸入沒有處于忙狀態,則可以發送數據
246 4 if(!Ep2InIsBusy)
247 4 {
248 5 KeyCanChange=0; //禁止按鍵掃描
249 5 if(KeyUp||KeyDown) //如果有按鍵事件發生
250 5 {
251 6 SendMouseReport(); //則返回報告
252 6 }
253 5 KeyCanChange=1; //允許按鍵掃描
254 5 }
255 4 }
256 3 }
257 2 }
258 1 }
259 ////////////////////////End of function//////////////////////////////
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 477 ----
CONSTANT SIZE = 1888 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 18
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -