?? main.lst
字號:
C51 COMPILER V8.05a MAIN 04/21/2009 19:44:20 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Main.c BROWSE DEBUG OBJECTEXTEND
line 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.08.22
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 "********************************************************************\r\n",
42 };
43
44 /********************************************************************
45 函數功能:根據按鍵情況返回數據的函數。
46 入口參數:無。
47 返 回:無。
48 備 注:無。
49 ********************************************************************/
50 void SendKeyData(void)
51 {
52 1 //需要返回8字節數據的緩沖區,這里僅使用前5字節
53 1 uint8 Buf[8]={0,0,0,0,0,0,0,0};
54 1
55 1 //每發送一次數據,則將Count增加一。
C51 COMPILER V8.05a MAIN 04/21/2009 19:44:20 PAGE 2
56 1 Count++;
57 1
58 1 //根據不同的按鍵設置輸入數據。這里將8個按鍵情況放在第一字節。
59 1 Buf[0]=KeyPress;
60 1
61 1 //根據Count的值設置緩沖的第二到第四字節。
62 1 Buf[1]=(Count&0xFF); //最低字節
63 1 Buf[2]=((Count>>8)&0xFF); //次低字節
64 1 Buf[3]=((Count>>16)&0xFF); //次高字節
65 1 Buf[4]=((Count>>24)&0xFF); //最高字節
66 1
67 1 //數據準備好了,通過端點1返回,長度為8字節。
68 1 D12WriteEndpointBuffer(3,8,Buf);
69 1 Ep1InIsBusy=1; //設置端點忙標志。
70 1
71 1 //記得清除KeyUp和KeyDown
72 1 KeyUp=0;
73 1 KeyDown=0;
74 1 }
75 ////////////////////////End of function//////////////////////////////
76
77 /********************************************************************
78 函數功能:將串口緩沖區中的數據發送到端點2的函數。
79 入口參數:無。
80 返 回:無。
81 備 注:無。
82 ********************************************************************/
83 void SendUartDataToEp2(void)
84 {
85 1 uint8 Len;
86 1
87 1 //暫時禁止串行中斷,防止UartByteCount在中斷中修改而導致不同步
88 1 ES=0;
89 1 //將串口緩沖區接收到的字節數復制出來
90 1 Len=UartByteCount;
91 1 //檢查長度是否為0,如果沒有收到,數據,則不需要處理,直接返回
92 1 if(Len==0)
93 1 {
94 2 ES=1; //記得打開串口中斷
95 2 return;
96 2 }
97 1 //檢查Len字節個數據是否跨越了緩沖區邊界,如果跨越了,那么本次只發送
98 1 //跨越邊界之前的數據,剩余的數據留待下次發送。否則,可以一次發送全部。
99 1 if((Len+UartBufferOutputPoint)>BUF_LEN)
100 1 {
101 2 Len=BUF_LEN-UartBufferOutputPoint;
102 2 }
103 1 //修改緩沖區數據字節數
104 1 UartByteCount-=Len;
105 1
106 1 //到這里可以打開串口中斷了
107 1 ES=1;
108 1
109 1 //將數據寫入到端點2輸入緩沖區
110 1 D12WriteEndpointBuffer(5,Len,UartBuffer+UartBufferOutputPoint);
111 1 //修改輸出數據的位置
112 1 UartBufferOutputPoint+=Len;
113 1 //如果已經到達緩沖區末尾,則設置回開頭
114 1 if(UartBufferOutputPoint>=BUF_LEN)
115 1 {
116 2 UartBufferOutputPoint=0;
117 2 }
C51 COMPILER V8.05a MAIN 04/21/2009 19:44:20 PAGE 3
118 1 //只有兩個緩沖區都滿時,才設置端點2輸入忙
119 1 if((D12ReadEndpointStatus(5)&0x60)==0x60)
120 1 {
121 2 Ep2InIsBusy=1;
122 2 }
123 1 }
124 ////////////////////////End of function//////////////////////////////
125
126 /********************************************************************
127 函數功能:主函數。
128 入口參數:無。
129 返 回:無。
130 備 注:無。
131 ********************************************************************/
132 void main(void) //主函數
133 {
134 1 uint8 i;
135 1 uint16 id;
136 1 uint8 InterruptSource;
137 1
138 1 EA=1; //打開中斷
139 1 InitKeyboard(); //初始化按鍵
140 1 InitUART(); //初始化串口
141 1
142 1 for(i=0;i<16;i++) //顯示信息
143 1 {
144 2 Prints(HeadTable[i]);
145 2 }
146 1
147 1 id=D12ReadID();
148 1
149 1 Prints("Your D12 chip\'s ID is: ");
150 1 PrintShortIntHex(id);
151 1
152 1 if(id==0x1012)
153 1 {
154 2 Prints(". ID is correct! Congratulations!\r\n\r\n");
155 2 }
156 1 else
157 1 {
158 2 Prints(". ID is incorrect! What a pity!\r\n\r\n");
159 2 }
160 1
161 1 UsbDisconnect(); //先斷開USB連接
162 1 UsbConnect(); //將USB連接上
163 1 ConfigValue=0; //配置值初始化為0
164 1
165 1 while(1) //死循環
166 1 {
167 2 if(D12GetIntPin()==0) //如果有中斷發生
168 2 {
169 3 D12WriteCommand(READ_INTERRUPT_REGISTER); //寫讀中斷寄存器的命令
170 3 InterruptSource=D12ReadByte(); //讀回第一字節的中斷寄存器
171 3 if(InterruptSource&0x80)UsbBusSuspend(); //總線掛起中斷處理
172 3 if(InterruptSource&0x40)UsbBusReset(); //總線復位中斷處理
173 3 if(InterruptSource&0x01)UsbEp0Out(); //端點0輸出中斷處理
174 3 if(InterruptSource&0x02)UsbEp0In(); //端點0輸入中斷處理
175 3 if(InterruptSource&0x04)UsbEp1Out(); //端點1輸出中斷處理
176 3 if(InterruptSource&0x08)UsbEp1In(); //端點1輸入中斷處理
177 3 if(InterruptSource&0x10)UsbEp2Out(); //端點2輸出中斷處理
178 3 if(InterruptSource&0x20)UsbEp2In(); //端點2輸入中斷處理
179 3 }
C51 COMPILER V8.05a MAIN 04/21/2009 19:44:20 PAGE 4
180 2 if(ConfigValue!=0) //如果已經設置為非0的配置,則可以返回數據
181 2 {
182 3 //如果端點1輸入沒有處于忙狀態,則可以發送數據
183 3 if(Ep1InIsBusy==0)
184 3 {
185 4 KeyCanChange=0; //禁止按鍵掃描
186 4 if(KeyUp||KeyDown) //如果有按鍵事件發生
187 4 {
188 5 SendKeyData(); //則返回鍵盤數據
189 5 }
190 4 KeyCanChange=1; //允許按鍵掃描
191 4 }
192 3
193 3 //如果端點2空閑,則發送串口數據到端點2
194 3 if(Ep2InIsBusy==0)
195 3 {
196 4 SendUartDataToEp2(); //調用函數將緩沖區數據發送到端點2
197 4 }
198 3
199 3 //端點2接收緩沖區中還有數據未發送,則發送到串口
200 3 if(UsbEp2ByteCount!=0)
201 3 {
202 4 //發送一字節到串口
203 4 UartPutChar(UsbEp2Buffer[UsbEp2BufferOutputPoint]);
204 4 UsbEp2BufferOutputPoint++; //發送位置后移1
205 4 UsbEp2ByteCount--; //計數值減1
206 4 }
207 3 }
208 2 }
209 1 }
210 ////////////////////////End of function//////////////////////////////
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 440 ----
CONSTANT SIZE = 1290 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 13
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 + -