📄 isr.lst
字号:
C51 COMPILER V7.04 ISR 12/18/2005 18:05:21 PAGE 1
C51 COMPILER V7.04, COMPILATION OF MODULE ISR
OBJECT MODULE PLACED IN Isr.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Isr.c OPTIMIZE(2,SPEED) DEBUG OBJECTEXTEND
stmt level source
1 #include <stdio.h>
2 #include <string.h>
3
4 #include <reg51.h> /* special function register declarations */
5
6 #include "epphal.h"
7 #include "d12ci.h"
8 #include "mainloop.h"
9 #include "usb100.h"
10
11 extern void bus_reset(void);
12
13 extern void ep0_txdone(void);
14 extern void ep0_rxdone(void);
15
16 extern void ep1_txdone(void);
17 extern void ep1_rxdone(void);
18
19 extern void main_txdone(void);
20 extern void main_rxdone(void);
21
22 extern void dma_eot(void);
23
24 /*
25 //*************************************************************************
26 // Public static data
27 //*************************************************************************
28 */
29
30 EPPFLAGS bEPPflags;
31
32 /* Control endpoint TX/RX buffers */
33 extern CONTROL_XFER ControlData;
34
35 /* ISR static vars */
36 unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
37 unsigned char idata EpBuf[EP2_PACKET_SIZE];
38 IO_REQUEST idata ioRequest;
39 unsigned char ioSize, ioCount;
40 unsigned long ClockTicks = 0;
41
42 extern BOOL bNoRAM;
43
44
45
46 extern unsigned short AT24C02DelayTime; // 读24C02N延迟时间计时,必须保证每个加减单位为1毫秒
47
48 extern unsigned short MilliSecondCount;
49 extern unsigned short MinuteCount;
50
51 extern unsigned long UsedMinuteTime;
52 extern unsigned short WriteUseMinuteTime;
53
54 extern unsigned char OutputPulseValue;
55 extern unsigned short OutputPulseFrequency;
C51 COMPILER V7.04 ISR 12/18/2005 18:05:21 PAGE 2
56
57
58 void T0_Int() interrupt 1 using 1
59 {
60 1 // DISABLE;
61 1 ClockTicks++;
62 1 bEPPflags.bits.timer = 1;
63 1 // ENABLE;
64 1
65 1 TH0 = (-2000) >> 8; // Timer 0 -- (12*x/f=1ms) at 24MHz
66 1 TL0 = (-2000) & 0xff;
67 1
68 1 AT24C02DelayTime++;
69 1
70 1 MilliSecondCount++;
71 1 if ((MilliSecondCount % OutputPulseFrequency) == 0){
72 2 OutputPulseValue = ~OutputPulseValue;
73 2 P2 = OutputPulseValue;
74 2 }
75 1
76 1 if (MilliSecondCount >= 60000){
77 2 MilliSecondCount = 0;
78 2 MinuteCount++;
79 2 UsedMinuteTime++;
80 2 }
81 1 }
82
83 /*
84 //定时器0中断处理
85 timer_isr() interrupt 1
86 {
87 DISABLE;
88 ClockTicks++;
89 bEPPflags.bits.timer = 1;
90 ENABLE;
91 }
92 */
93
94 //USB中断处理
95 usb_isr() interrupt 0
96 {
97 1 DISABLE;
98 1 fn_usb_isr();
99 1 ENABLE;
100 1 }
101
102 //USB中断服务子程序
103 void fn_usb_isr()
104 {
105 1 unsigned int i_st;
106 1
107 1 bEPPflags.bits.in_isr = 1;
108 1
109 1 i_st = D12_ReadInterruptRegister();//读取中断寄存器
110 1
111 1 if(i_st != 0) {
112 2 if(i_st & D12_INT_BUSRESET) {
113 3 bus_reset();//USB总线服务
114 3 bEPPflags.bits.bus_reset = 1;
115 3 }
116 2
117 2 if(i_st & D12_INT_EOT)
C51 COMPILER V7.04 ISR 12/18/2005 18:05:21 PAGE 3
118 2 dma_eot();//DMA传输结束
119 2
120 2 if(i_st & D12_INT_SUSPENDCHANGE)
121 2 bEPPflags.bits.suspend = 1;//挂起改变
122 2
123 2 if(i_st & D12_INT_ENDP0IN)
124 2 ep0_txdone();//端点0IN中断
125 2 if(i_st & D12_INT_ENDP0OUT)
126 2 ep0_rxdone();//端点0OUT中断
127 2 if(i_st & D12_INT_ENDP1IN)
128 2 ep1_txdone();//端点1IN中断
129 2 if(i_st & D12_INT_ENDP1OUT)
130 2 ep1_rxdone();//端点1OUT中断
131 2 if(i_st & D12_INT_ENDP2IN)
132 2 main_txdone();//端点2IN中断
133 2 if(i_st & D12_INT_ENDP2OUT)
134 2 main_rxdone();//端点2OUT中断
135 2 }
136 1
137 1 bEPPflags.bits.in_isr = 0;
138 1 }
139
140 //总线复位处理子程序
141 void bus_reset(void)
142 {
143 1 }
144
145 //端点0OUT中断
146 void ep0_rxdone(void)
147 {
148 1 unsigned char ep_last, i;
149 1
150 1 ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
151 1
152 1 if (ep_last & D12_SETUPPACKET) {
153 2 //接收到SETUP包
154 2 ControlData.wLength = 0;
155 2 ControlData.wCount = 0;
156 2
157 2 if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
158 2 (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
159 3 //SETUP包出错,返回
160 3 D12_SetEndpointStatus(0, 1);
161 3 D12_SetEndpointStatus(1, 1);
162 3 bEPPflags.bits.control_state = USB_IDLE;
163 3 return;
164 3 }
165 2
166 2 ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
167 2 ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
168 2 ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
169 2
170 2 //对控制端点的输入/输出进行应答
171 2 D12_AcknowledgeEndpoint(0);
172 2 D12_AcknowledgeEndpoint(1);
173 2
174 2 ControlData.wLength = ControlData.DeviceRequest.wLength;
175 2 ControlData.wCount = 0;
176 2
177 2 if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
178 3 //从主机传输数据
179 3 bEPPflags.bits.setup_packet = 1;
C51 COMPILER V7.04 ISR 12/18/2005 18:05:21 PAGE 4
180 3 bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */
181 3 }
182 2 else {
183 3 if (ControlData.DeviceRequest.wLength == 0) {
184 4 bEPPflags.bits.setup_packet = 1;
185 4 bEPPflags.bits.control_state = USB_IDLE; /* set command */
186 4 }
187 3 else {
188 4 if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
189 5 //接收数据长度为0
190 5 bEPPflags.bits.control_state = USB_IDLE;
191 5 D12_SetEndpointStatus(0, 1);
192 5 D12_SetEndpointStatus(1, 1);
193 5 }
194 4 else {
195 5 bEPPflags.bits.control_state = USB_RECEIVE; //设置接收状态
196 5 }
197 4 } // set command with data
198 3 } // else set command
199 2 } // if setup packet
200 1
201 1 else if (bEPPflags.bits.control_state == USB_RECEIVE) {
202 2 //接收数据
203 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
204 2 ControlData.dataBuffer + ControlData.wCount);
205 2 ControlData.wCount += i;
206 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
207 3 //数据接收完毕
208 3 bEPPflags.bits.setup_packet = 1;
209 3 bEPPflags.bits.control_state = USB_IDLE;
210 3 }
211 2 }
212 1 else {
213 2 bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
214 2 }
215 1 }
216
217 //端点0IN处理
218 void ep0_txdone(void)
219 {
220 1 short i = ControlData.wLength - ControlData.wCount;
221 1 D12_ReadLastTransactionStatus(1); //清中断标志位
222 1 if (bEPPflags.bits.control_state != USB_TRANSMIT)
223 1 return;//非发送状态,返回
224 1
225 1 if( i >= EP0_PACKET_SIZE) {
226 2 //剩下数据大于16字节,发送16字节
227 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
228 2 ControlData.wCount += EP0_PACKET_SIZE;
229 2 bEPPflags.bits.control_state = USB_TRANSMIT;
230 2 }
231 1 else if( i != 0) {
232 2 //发送剩下数据
233 2 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
234 2 ControlData.wCount += i;
235 2 bEPPflags.bits.control_state = USB_IDLE;
236 2 }
237 1 else if (i == 0){
238 2 D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
239 2 bEPPflags.bits.control_state = USB_IDLE;
240 2 }
241 1 }
C51 COMPILER V7.04 ISR 12/18/2005 18:05:21 PAGE 5
242
243 //DMA结束处理
244 void dma_eot(void)
245 {
246 1 }
247
248 //端点1OUT处理
249 void ep1_txdone(void)
250 {
251 1 D12_ReadLastTransactionStatus(3); //清中断标志位
252 1 }
253
254 //端点1IN处理
255 void ep1_rxdone(void)
256 {
257 1 unsigned char len;
258 1
259 1 D12_ReadLastTransactionStatus(2); //清中断标志位
260 1 len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
261 1 if(len != 0)
262 1 bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
263 1 }
264
265 //主端点OUT控制
266 void main_txdone(void)
267 {
268 1 // unsigned char len,epstatus;
269 1
270 1 D12_ReadLastTransactionStatus(5); //清中断标志位
271 1 }
272
273 //主端点IN控制
274 void main_rxdone(void)
275 {
276 1 unsigned char len,epstatus;
277 1
278 1 D12_ReadLastTransactionStatus(4); //清中断标志位
279 1
280 1 //接收数据
281 1 len = D12_ReadEndpoint(4, 64, EpBuf);
282 1 epstatus=D12_ReadEndpointStatus(4);
283 1 epstatus &= 0x60;
284 1 if (epstatus == 0x60)
285 1 len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
286 1 }
287
288
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 962 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 9
IDATA SIZE = 54 ----
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 + -