?? main.lst
字號:
C51 COMPILER V7.06 MAIN 11/16/2008 15:59:42 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.10
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:光標右移 K3:光標上移 K4:光標下移 ******\r\n",
42 "****** K5:滾輪下滾 K6:滾輪上滾 K7:鼠標左鍵 K8:鼠標右鍵 ******\r\n",
43 "********************************************************************\r\n",
44 };
45
46 /********************************************************************
47 函數功能:根據按鍵情況返回報告的函數。
48 入口參數:無。
49 返 回:無。
50 備 注:無。
51 ********************************************************************/
52 void SendReport(void)
53 {
54 1 //需要返回的4字節報告的緩沖
55 1 //Buf[0]的D0就是左鍵,D1就是右鍵,D2就是中鍵(這里沒有)
C51 COMPILER V7.06 MAIN 11/16/2008 15:59:42 PAGE 2
56 1 //Buf[1]為X軸,Buf[2]為Y軸,Buf[3]為滾輪
57 1 uint8 Buf[4]={0,0,0,0};
58 1
59 1 //我們不需要KEY1~KEY6按鍵改變的信息,所以先將它們清0
60 1 KeyUp &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
61 1 KeyDown &=~(KEY1|KEY2|KEY3|KEY4|KEY5|KEY6);
62 1
63 1 //如果有按鍵按住,并且不是KEY7、KEY8(左、右鍵)
64 1 //或者KEY7、KEY8任何一個鍵有變動的話,則需要返回報告
65 1 if((KeyPress&(~(KEY7|KEY8)))||KeyUp||KeyDown)
66 1 {
67 2 if(KeyPress & KEY1) //如果KEY1按住,則光標需要左移,即X軸為負值。
68 2 {
69 3 Buf[1]=-1; //這里一次往左移動一個單位。
70 3 }
71 2 if(KeyPress & KEY2) //如果KEY2按住,則光標需要右移,即X軸為正值。
72 2 {
73 3 Buf[1]=1; //這里一次往右移動一個單位。
74 3 }
75 2 if(KeyPress & KEY3) //如果KEY3按住,則光標需要上移,即Y軸為負值。
76 2 {
77 3 Buf[2]=-1; //這里一次往上移動一個單位。
78 3 }
79 2 if(KeyPress & KEY4) //如果KEY4按住,則光標需要下移,即Y軸為正值。
80 2 {
81 3 Buf[2]=1; //這里一次往下移動一個單位。
82 3 }
83 2 if(KeyPress & KEY5) //如果KEY5按住,則滾輪下滾,即滾輪值為負。
84 2 {
85 3 Buf[3]=-1; //這里一次往下滾動一個單位。
86 3 }
87 2 if(KeyPress & KEY6) //如果KEY6按住,則滾輪上滾,既滾輪值為正
88 2 {
89 3 Buf[3]=1; //這里一次往上滾動一個單位。
90 3 }
91 2 if(KeyPress & KEY7) //鼠標左鍵
92 2 {
93 3 Buf[0]|=0x01; //D0為鼠標左鍵
94 3 }
95 2 if(KeyPress & KEY8) //鼠標右鍵
96 2 {
97 3 Buf[0]|=0x02; //D1為鼠標右鍵
98 3 }
99 2 //報告準備好了,通過端點1返回,長度為4字節。
100 2 D12WriteEndpointBuffer(3,4,Buf);
101 2 Ep1InIsBusy=1; //設置端點忙標志。
102 2 }
103 1 //記得清除KeyUp和KeyDown
104 1 KeyUp=0;
105 1 KeyDown=0;
106 1 }
107 ////////////////////////End of function//////////////////////////////
108
109 /********************************************************************
110 函數功能:主函數。
111 入口參數:無。
112 返 回:無。
113 備 注:無。
114 ********************************************************************/
115 void main(void) //主函數
116 {
117 1 uint8 i;
C51 COMPILER V7.06 MAIN 11/16/2008 15:59:42 PAGE 3
118 1 uint16 id;
119 1 uint8 InterruptSource;
120 1
121 1 EA=1; //打開中斷
122 1 InitKeyboard(); //初始化按鍵
123 1 InitUART(); //初始化串口
124 1
125 1 for(i=0;i<18;i++) //顯示信息
126 1 {
127 2 Prints(HeadTable[i]);
128 2 }
129 1
130 1 id=D12ReadID();
131 1
132 1 Prints("Your D12 chip\'s ID is: ");
133 1 PrintShortIntHex(id);
134 1
135 1 if(id==0x1012)
136 1 {
137 2 Prints(". ID is correct! Congratulations!\r\n\r\n");
138 2 }
139 1 else
140 1 {
141 2 Prints(". ID is incorrect! What a pity!\r\n\r\n");
142 2 }
143 1
144 1 UsbDisconnect(); //先斷開USB連接
145 1 UsbConnect(); //將USB連接上
146 1 ConfigValue=0; //配置值初始化為0
147 1
148 1 while(1) //死循環
149 1 {
150 2 if(D12GetIntPin()==0) //如果有中斷發生
151 2 {
152 3 D12WriteCommand(READ_INTERRUPT_REGISTER); //寫讀中斷寄存器的命令
153 3 InterruptSource=D12ReadByte(); //讀回第一字節的中斷寄存器
154 3 if(InterruptSource&0x80)UsbBusSuspend(); //總線掛起中斷處理
155 3 if(InterruptSource&0x40)UsbBusReset(); //總線復位中斷處理
156 3 if(InterruptSource&0x01)UsbEp0Out(); //端點0輸出中斷處理
157 3 if(InterruptSource&0x02)UsbEp0In(); //端點0輸入中斷處理
158 3 if(InterruptSource&0x04)UsbEp1Out(); //端點1輸出中斷處理
159 3 if(InterruptSource&0x08)UsbEp1In(); //端點1輸入中斷處理
160 3 if(InterruptSource&0x10)UsbEp2Out(); //端點2輸出中斷處理
161 3 if(InterruptSource&0x20)UsbEp2In(); //端點2輸入中斷處理
162 3 }
163 2 if(ConfigValue!=0) //如果已經設置為非0的配置,則可以返回報告數據
164 2 {
165 3 LEDs=~KeyPress; //利用板上8個LED顯示按鍵狀態,按下時亮
166 3 if(!Ep1InIsBusy) //如果端點1輸入沒有處于忙狀態,則可以發送數據
167 3 {
168 4 KeyCanChange=0; //禁止按鍵掃描
169 4 if(KeyUp||KeyDown||KeyPress) //如果有按鍵事件發生
170 4 {
171 5 SendReport(); //則返回報告
172 5 }
173 4 KeyCanChange=1; //允許按鍵掃描
174 4 }
175 3 }
176 2 }
177 1 }
178 ////////////////////////End of function//////////////////////////////
C51 COMPILER V7.06 MAIN 11/16/2008 15:59:42 PAGE 4
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 358 ----
CONSTANT SIZE = 1434 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 8
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 + -