📄 main.lst
字号:
C51 COMPILER V7.09 MAIN 03/30/2005 12:31:38 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <stdio.h>
2 #include <string.h>
3
4 #include <At89x52.h>
5
6 #include "hal.h"
7 #include "main.h"
8 #include "d12ci.h"
9 #include "chap9.h"
10 #include "protodma.h"
11 //USB标准请求函数组指针定义,不用修改
12 code void (*StandardDeviceRequest[])(void) =
13 {
14 get_status,
15 clear_feature,
16 reserved,
17 set_feature,
18 reserved,
19 set_address,
20 get_descriptor,
21 reserved,
22 get_configuration,
23 set_configuration,
24 get_interface,
25 set_interface,
26 reserved,
27 reserved,
28 reserved,
29 reserved
30 };
31 //厂商请求函数组定义,这里只是定义了一个函数,也可不加
32 code void (*VendorDeviceRequest[])(void) =
33 {
34 reserved,
35 reserved,
36 reserved,
37 reserved,
38 reserved,
39 reserved,
40 reserved,
41 reserved,
42 reserved,
43 reserved,
44 reserved,
45 reserved,
46 read_write_register,
47 reserved,
48 reserved,
49 reserved
50 };
51 //公共变量
52 extern EPPFLAGS bEPPflags;
53 extern unsigned long ClockTicks;
54
55 extern unsigned char idata GenEpBuf[];
C51 COMPILER V7.09 MAIN 03/30/2005 12:31:38 PAGE 2
56 extern IO_REQUEST idata ioRequest;
57
58 extern unsigned char ioSize, ioCount;
59 extern unsigned char idata EpBuf[];
60 //------------
61 extern void fn_usb_isr(void);
62 //-----------
63
64 CONTROL_XFER ControlData;
65 //初始化时钟0
66 void init_timer0(void)
67 {
68 1 TMOD &= 0XF0; /* clear Timer 0 */
69 1 TMOD |= 0X1;
70 1 TL0 = 0X0; /* value set by user */
71 1 TH0 = 0X0; /* value set by user */
72 1 ET0 = 1; /* IE.1*/
73 1 TR0 = 1; /* TCON.4 start timer */
74 1 PT0 = 1;
75 1 }
76 //初始化串口,这里可以不要
77 void init_serial(void)
78 {
79 1 SCON = 0X52; /* SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI */
80 1 PCON = 0X80 | PCON; /* PCON: SMOD | - | - | - | GF1|GF0|PD |IDL| */
81 1 TMOD = 0X20; /* TMOD: GATE|C/T|M1|M0|GATE|C/T|M1|M0 */
82 1 TCON = 0x69; /* TCON: TF1|TR1|TF0|TR0|IE1|IT1|IE0|IT0 */
83 1 TH1 = 0xF3; /*TH1=0xF3: */
84 1 }
85 //模拟断开USB设备
86 void disconnect_USB(void)
87 {
88 1 // Initialize D12 configuration
89 1 D12_SetMode(D12_NOLAZYCLOCK|D12_CLOCKRUNNING, D12_SETTOONE | D12_CLOCK_12M);
90 1 }
91 //模拟连接USB设备
92 void connect_USB(void)
93 {
94 1 // reset event flags
95 1 DISABLE;
96 1 bEPPflags.value = 0;
97 1 ENABLE;
98 1
99 1 // ENABLE_INTERRUPTS;
100 1 D12_SetEndpointStatus(4, 0);
101 1 D12_SetEndpointStatus(5, 0);
102 1 // V2.1 enable normal+sof interrupt
103 1 D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
104 1
105 1 // Initialize D12 configuration
106 1 D12_SetMode(D12_NOLAZYCLOCK |D12_CLOCKRUNNING|D12_SOFTCONNECT,D12_SETTOONE | D12_CLOCK_12M );
107 1
108 1 }
109 //模拟一次断开、连接操作
110 void reconnect_USB(void)
111 {
112 1 unsigned long clk_cnt;
113 1
114 1 D12SUSPD = 0;
115 1 disconnect_USB();
116 1
117 1 ENABLE;
C51 COMPILER V7.09 MAIN 03/30/2005 12:31:38 PAGE 3
118 1 clk_cnt = ClockTicks;
119 1 while(ClockTicks < clk_cnt + 20); //等待一段时间
120 1 DISABLE;
121 1
122 1 connect_USB();
123 1 }
124 //停止端点0
125 void stall_ep0(void)
126 {
127 1 D12_SetEndpointStatus(0, 1);
128 1 D12_SetEndpointStatus(1, 1);
129 1 }
130 //初始化配置0
131 void init_unconfig(void)
132 {
133 1 D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
134 1 }
135 //初始化配置1
136 void init_config(void)
137 {
138 1 D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
139 1 }
140 //简单传输
141 void single_transmit(unsigned char * buf, unsigned char len)
142 {
143 1 if( len <= EP0_PACKET_SIZE) {
144 2 D12_WriteEndpoint(1, len, buf);
145 2 }
146 1 }
147 //代码传输
148 void code_transmit(unsigned char code * pRomData, unsigned short len)
149 {
150 1 ControlData.wCount = 0;
151 1 if(ControlData.wLength > len)
152 1 ControlData.wLength = len;
153 1
154 1 ControlData.pData = pRomData;
155 1 if( ControlData.wLength >= EP0_PACKET_SIZE) { // 如果发送代码大于包长度
156 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);
157 2 ControlData.wCount += EP0_PACKET_SIZE;
158 2
159 2 DISABLE;
160 2 bEPPflags.bits.control_state = USB_TRANSMIT;
161 2 ENABLE;
162 2 }
163 1 else { //发送代码小于包长度
164 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData);
165 2 ControlData.wCount += ControlData.wLength;
166 2 DISABLE;
167 2 bEPPflags.bits.control_state = USB_IDLE;
168 2 ENABLE;
169 2 }
170 1 }
171 //控制请求
172 void control_handler()
173 {
174 1 unsigned char type, req;
175 1
176 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK; //0x60
177 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK; //0x0F
178 1
179 1 if (type == USB_STANDARD_REQUEST)
C51 COMPILER V7.09 MAIN 03/30/2005 12:31:38 PAGE 4
180 1 (*StandardDeviceRequest[req])();
181 1 else if (type == USB_VENDOR_REQUEST)
182 1 (*VendorDeviceRequest[req])();
183 1 else
184 1 stall_ep0();
185 1
186 1 }
187
188
189 //-------------------------------------------
190 //主程序
191 //-------------------------------------------
192
193 void main()
194 {
195 1 unsigned char i;
196 1 P0 = 0xFF;//初始化端口
197 1 P1 = 0xFF;
198 1 P2 = 0xFF;
199 1 P3 = 0xFF;
200 1 D12SUSPD = 0;//D12非挂起
201 1 init_serial();//初始化串口
202 1 init_timer0();//初始化时钟T0
203 1 EA = 0;
204 1 IE0=0;
205 1 IT0=0;
206 1 EX0=1;
207 1
208 1 ENABLE;
209 1 reconnect_USB();
210 1 ENABLE;
211 1
212 1 while( TRUE ){
213 2
214 2 if (bEPPflags.bits.timer){//TO 定时到
215 3 DISABLE;
216 3 bEPPflags.bits.timer = 0;
217 3 ENABLE;
218 3 }
219 2 if (bEPPflags.bits.bus_reset) {//发现总线复位请求
220 3 DISABLE;
221 3 bEPPflags.bits.bus_reset = 0;
222 3 ENABLE;
223 3 D12SUSPD=0; //唤醒D12
224 3 }
225 2 if (bEPPflags.bits.suspend) {//发现总线挂起请求,将D12挂起
226 3 DISABLE;
227 3 bEPPflags.bits.suspend= 0;
228 3 ENABLE;
229 3
230 3 if(D12SUSPD == 1) {
231 4 D12SUSPD = 0;
232 4 P0 = 0xFF;
233 4 P1 = 0xFF;
234 4 P2 = 0xFF;
235 4 P3 = 0xFF;
236 4 D12_SetDMA(0xC3);
237 4 D12SUSPD = 1;
238 4 PCON |= 0x02;
239 4 while (1);
240 4
241 4 }
C51 COMPILER V7.09 MAIN 03/30/2005 12:31:38 PAGE 5
242 3 }
243 2 if (bEPPflags.bits.setup_packet){ //USB控制请求(包括标准请求和厂商请求)
244 3 DISABLE;
245 3 bEPPflags.bits.setup_packet = 0;
246 3 ENABLE;
247 3 control_handler();
248 3 D12SUSPD=0;
249 3 }
250 2 }
251 1 }
*** WARNING C280 IN LINE 195 OF MAIN.C: 'i': unreferenced local variable
252
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 498 ----
CONSTANT SIZE = 96 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 9
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -