?? main.lst
字號:
C51 COMPILER V7.50 MAIN 05/09/2007 17:53:59 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //#include <stdio.h>
2 #include <string.h>
3 #include <reg51.h> /* special function register declarations */
4
5 #include "epphal.h"
6 #include "d12ci.h"
7 #include "mainloop.h"
8 #include "usb100.h"
9 #include "chap_9.h"
10 #include "protodma.h"
11 #include"address.h"
12 #include"2-16.h"
13 #include"24C00.H"
14
15
16 /*
17 //*************************************************************************
18 // USB protocol function pointer arrays
19 //*************************************************************************
20 */
21
22 #define uchar unsigned char
23 unsigned char code Tab[]=
24 { //數碼管數據0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
25 0x12,0x9F,0x31,0x15,0x9C,0x54,0x50,0x1F,
26 0x10,0x14,0x18,0xD0,0x72,0x91,0x70,0x78
27 };
28 void send(uchar buf1,uchar buf2); //數碼管顯示程序
29 void EndpointII();//處理 2*16LCD和IIC
30 //USB標準請求
31 code void (*StandardDeviceRequest[])(void) =
32 {
33 get_status,
34 clear_feature,
35 reserved,
36 set_feature,
37 reserved,
38 set_address,
39 get_descriptor,
40 reserved,
41 get_configuration,
42 set_configuration,
43 get_interface,
44 set_interface,
45 reserved,
46 reserved,
47 reserved,
48 reserved
49 };
50
51 //用戶廠商請求
52 code void (*VendorDeviceRequest[])(void) =
53 {
54 reserved,
55 reserved,
C51 COMPILER V7.50 MAIN 05/09/2007 17:53:59 PAGE 2
56 reserved,
57 reserved,
58 reserved,
59 reserved,
60 reserved,
61 reserved,
62 reserved,
63 reserved,
64 reserved,
65 reserved,
66 reserved,
67 reserved,
68 reserved,
69 reserved
70 };
71
72 /*
73 //*************************************************************************
74 // Public static data
75 //*************************************************************************
76 */
77
78 extern EPPFLAGS bEPPflags;
79 extern unsigned long ClockTicks;
80 extern unsigned char idata GenEpBuf[];
81 extern IO_REQUEST idata ioRequest;
82
83 extern unsigned char ioSize, ioCount;
84 extern unsigned char idata EpBuf[];
85 extern unsigned char idata mainbuflen;
86
87 CONTROL_XFER ControlData;
88 BOOL bNoRAM;
89
90 //定時器0初始化程序
91 //定時器用來定時檢測按鍵狀態
92 void init_timer0(void)
93 {
94 1 TMOD &= 0XF0; /* clear Timer 0 */
95 1 TMOD |= 0X1;
96 1 TL0 = 0X0; /* value set by user */
97 1 TH0 = 0X0; /* value set by user */
98 1 ET0 = 1; /* IE.1*/
99 1 TR0 = 1; /* TCON.4 start timer */
100 1 PT0 = 1;
101 1
102 1 EA = 1;
103 1 }
104
105 //中斷設置
106 void init_special_interrupts(void)
107 {
108 1 IT1 = 0;
109 1 EX1 = 1;
110 1 PX1 = 0;
111 1 }
112
113 //I/O口初始化程序
114 void init_port()
115 {
116 1 P0 = 0xFF;
117 1 P1 = 0xFF;
C51 COMPILER V7.50 MAIN 05/09/2007 17:53:59 PAGE 3
118 1 P2 = 0xFF;
119 1 P3 = 0xFF;
120 1 }
121 void init()
122 {
123 1 send(0xff,0xff);//數碼管關
124 1 LEDDATA=0x00;//LED關
125 1
126 1 }
127 void main(void)
128 {
129 1 init_port();//初始化I/O口
130 1 initlcd();
131 1 printscreen("Hello!!" ,"Wellcome to USB");
132 1 init_timer0();//初始化定時器0
133 1 init_special_interrupts();//設置中斷
134 1 init();
135 1 bEPPflags.value = 0;
136 1 reconnect_USB();//重新連接USB
137 1 /* Main program loop */
138 1
139 1 while( TRUE )
140 1 {
141 2
142 2 if (bEPPflags.bits.timer)
143 2 {
144 3 DISABLE;//定時器溢出,檢測按鍵狀態
145 3 bEPPflags.bits.timer = 0;
146 3 ENABLE;
147 3
148 3 if(bEPPflags.bits.configuration)//設備未配置返回
149 3 check_key_LED(); //檢測鍵盤
150 3 }
151 2
152 2
153 2 if (bEPPflags.bits.bus_reset)
154 2 {//設備復位處理
155 3 DISABLE;
156 3 bEPPflags.bits.bus_reset = 0;
157 3 ENABLE;
158 3
159 3 } // if bus reset
160 2
161 2 if(bEPPflags.bits.ep1_rxdone) //端點1輸出
162 2 { //控制LED/數碼管/
163 3 /*
164 3 GenEpBuf[0] 操作對象
165 3 1 LED
166 3 2 數碼管
167 3 3 鋒鳴器
168 3 0x55 讀IIC
169 3 */
170 3 DISABLE;
171 3 bEPPflags.bits.ep1_rxdone=0;
172 3 ENABLE;
173 3 if(GenEpBuf[0]==1)LEDDATA=GenEpBuf[1];
174 3 if(GenEpBuf[0]==2)send(Tab[GenEpBuf[1]],Tab[GenEpBuf[2]]);
175 3 if(GenEpBuf[0]==3)BEEB=GenEpBuf[1]&0x01;
176 3 if(GenEpBuf[0]==0x55)
177 3 {
178 4 Read24c02_nByte(GenEpBuf[1],10,EpBuf) ;
179 4 D12_WriteEndpoint(5, 10, EpBuf);
C51 COMPILER V7.50 MAIN 05/09/2007 17:53:59 PAGE 4
180 4 }
181 3 GenEpBuf[0]=0;
182 3
183 3 }
184 2
185 2
186 2 if (bEPPflags.bits.setup_packet)
187 2 {//Setup包處理
188 3 DISABLE;
189 3 bEPPflags.bits.setup_packet = 0;
190 3 ENABLE;
191 3 control_handler();//調用請求處理子程序
192 3 } // if setup_packet
193 2
194 2 if(bEPPflags.bits.main_rxdone) //端點2輸出
195 2 {
196 3 DISABLE;
197 3 bEPPflags.bits.main_rxdone=0;
198 3 ENABLE;
199 3 EndpointII();//操作LCD和I2C
200 3 } //if main_rxdone
201 2 } // Main Loop
202 1 }
203
204 //返回stall應答
205 void stall_ep0(void)
206 {
207 1 D12_SetEndpointStatus(0, 1);
208 1 D12_SetEndpointStatus(1, 1);
209 1 }
210
211 //斷開USB總線
212 void disconnect_USB(void)
213 {
214 1 // Initialize D12 configuration
215 1 D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
216 1 }
217
218 //連接USB總線
219 void connect_USB(void)
220 {
221 1 // reset event flags
222 1 DISABLE;
223 1 bEPPflags.value = 0;//清除所有狀態
224 1 ENABLE;
225 1
226 1 // V2.1 enable normal+sof interrupt
227 1 D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
228 1
229 1 // Initialize D12 configuration
230 1 D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
231 1 }
232
233 //重新連接到USB總線
234 void reconnect_USB(void)
235 {
236 1 unsigned long clk_cnt;
237 1 disconnect_USB();
238 1 clk_cnt = ClockTicks;
239 1 while(ClockTicks < clk_cnt + 20);
240 1 connect_USB();
241 1 }
C51 COMPILER V7.50 MAIN 05/09/2007 17:53:59 PAGE 5
242
243 //恢復到未配置狀態
244 void init_unconfig(void)
245 {
246 1 D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
247 1 }
248
249 //設置配置狀態
250 void init_config(void)
251 {
252 1 D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
253 1 }
254
255 //從端點號1發送數據
256 void single_transmit(unsigned char * buf, unsigned char len)
257 {
258 1 if( len <= EP0_PACKET_SIZE) {
259 2 D12_WriteEndpoint(1, len, buf);
260 2 }
261 1 }
262
263 //發送端點號1建立代碼
264 void code_transmit(unsigned char code * pRomData, unsigned short len)
265 {
266 1 ControlData.wCount = 0;
267 1 if(ControlData.wLength > len)
268 1 ControlData.wLength = len;
269 1
270 1 ControlData.pData = pRomData;
271 1 if( ControlData.wLength >= EP0_PACKET_SIZE) {
272 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//發送16字節數據
273 2 ControlData.wCount += EP0_PACKET_SIZE;
274 2 DISABLE;
275 2 bEPPflags.bits.control_state = USB_TRANSMIT;
276 2 ENABLE;
277 2 }
278 1 else {
279 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData);//發送16字節內數據
280 2 ControlData.wCount += ControlData.wLength;
281 2 DISABLE;
282 2 bEPPflags.bits.control_state = USB_IDLE;
283 2 ENABLE;
284 2 }
285 1 }
286
287 //LED和按鍵處理子程序
288 void check_key_LED(void)
289 {
290 1 static unsigned char c ;
291 1 c =KEYDATA;
292 1 D12_WriteEndpoint(3,1,&c); //輸入鍵盤數據
293 1
294 1
295 1 }
296 //數碼管顯示程序,左buf1,右buf2
297 void send(uchar buf1,uchar buf2)
298 {
299 1 uchar i;
300 1 uchar temp=buf2;
301 1 for(i=0;i!=8;i++)
302 1 {
303 2 if(temp&0x01)SPIDATA=1;
C51 COMPILER V7.50 MAIN 05/09/2007 17:53:59 PAGE 6
304 2 else SPIDATA=0;
305 2 SPICLK=0;SPICLK=1;
306 2 temp>>=1;
307 2 }
308 1 temp=buf1;
309 1 for(i=0;i!=8;i++)
310 1 {
311 2 if(temp&0x01)SPIDATA=1;
312 2 else SPIDATA=0;
313 2 SPICLK=0;SPICLK=1;
314 2 temp>>=1;
315 2 }
316 1 SPILatch=0;
317 1 SPILatch=1;
318 1 }
319
320 void EndpointII()//2*16LCD/IIC
321 {
322 1
323 1 if(EpBuf[0]==1) PrintUsb(EpBuf+2,EpBuf[1]); //LCD
324 1 if(EpBuf[0]==2) Write24c02_nByte(EpBuf[2],EpBuf[1],EpBuf+3);//IIC
325 1 EpBuf[0]=0;
326 1 }
327
328 //請求處理子程序 處理Setup包
329 void control_handler()
330 {
331 1 unsigned char type, req;
332 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
333 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
334 1 if (type == USB_STANDARD_REQUEST)
335 1 (*StandardDeviceRequest[req])();//調用標準請求
336 1 else if (type == USB_VENDOR_REQUEST)
337 1 (*VendorDeviceRequest[req])();//調用廠商請求
338 1 else
339 1 stall_ep0();
340 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 701 ----
CONSTANT SIZE = 136 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 25 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 + -