?? main.lst
字號:
C51 COMPILER V6.23a MAIN 08/06/2002 16:18:58 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: E:\KEIL\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /************************************************************************
2 * 廣州周立功單片機發展有限公司 http://www.zlgmcu.com *
3 ************************************************************************/
4 /************************************************************************
5 * *
6 * SJA1000 BasicCAN模式的通訊測試 *
7 * *
8 ************************************************************************/
9 /************************************************************************
10 * *
11 * 目的: 建立直觀的BasicCAN測試平臺 *
12 * 文件名: main.c *
13 * *
14 * 模塊名: sjanetdemo *
15 * *
16 * 目標系統: 任何基于任何兼容8051指令的微處理器同SJA1000組成的CAN系統*
17 * *
18 * 應用語言: Keil C51 *
19 * *
20 ************************************************************************
21 * 版本 :V1.0 *
22 * *
23 ************************************************************************
24 * 廣州周立功單片機發展有限公司 保留所有的版權 *
25 ************************************************************************/
26
27 #include <AT89X51.H>
28 #include <intrins.h>
29 #include "time_module.C"
30 #include "sja_bcanFunc.C"
31 //#include "sja_peliConf.h"
32 #include "seriele.c"
33 #include "keyled.c"
34 //數據類型定義
35 #define uchar unsigned char
36 #define ulong unsigned long
37 #define uint unsigned int
38
39
40 //設置系統數據緩沖區
41 static uchar data SetSystemBuf[10]; //系統設置數據緩沖區
42
43 static uchar data BandRateBuf; //設置總線波特率值緩沖區
44
45 static uchar idata EditMsSendCount; //編輯自動發送的頻率
46 static uchar idata EditMsSendSave; //保存自動發送的頻率
47
48 static uchar idata SendDataCount; //發送數據顯示
49
50 //鍵盤操作函數
51 extern void Write_Xdata(uint Xadr,uchar Info); // 將info送入外部地址xadr中
52 extern uchar Read_Xdata(uint Xadr); //從外部地址xadr中讀取數據
53 extern void Key_Scan(void); //鍵盤掃描程序
54 extern uchar Key_Get(void); //取鍵盤值
55 extern void PushKey(uchar keynum); //將鍵值送入按鍵處理隊列
C51 COMPILER V6.23a MAIN 08/06/2002 16:18:58 PAGE 2
56 extern uchar PopKey(void); //
57
58 void Key_handle(void); //處理鍵值
59
60 void FundationKey(void); //功能鍵
61 void MoveKey(void); //移位鍵
62 void SearchKey(void); //檢索鍵
63 void EnterKey(void); //確認鍵
64 void IncKey(void); //增加鍵
65 void QuitKey(void); //退出鍵
66 void CanSendKey(void); //發送鍵
67
68 void EnterNext(void); //按確認鍵后進入下一小項處理
69 //led 送顯
70 #define LED_SelBit() disp_pt++;if(disp_pt>4)disp_pt=0//位選
71 extern void Show_LED(void); //顯示處理
72 extern void Write_DispBuf(uchar buf0,uchar buf1,uchar buf2,uchar buf3,uchar buf4);//寫入顯示緩沖區
73 extern uchar GetLedData(void); //將顯示的值換算
74 extern void Error_disp(uchar ErrByte); //將錯誤字送顯
75
76 void InitCPU(void); //初始化函數
77 // 配置sja1000
78 uchar Config_SJA(void); //配置sja1000
79 void CanRcv_Prg(void); //can總線數據接收后處理
80 void CanSend_Prg(void); //can發送數據
81 void CanErr_Prg(void); //發現錯誤后處理
82 void CanDtOver_Prg(void); //超載處理
83 void CanWui_Prg(void); //喚醒中斷處理
84
85 void UartRcv_Prg(void); //串口接收到數據處理
86
87 void DrecDisplay(uchar *databuf); //直通顯示處理函數
88 void TestDispPrg(void); //測試處理函數
89 void ClearDispPrg(uchar *databuf); //消隱處理函數
90 void FlightDispPrg(uchar *databuf); //閃爍處理函數
91 void LiftCrcDispPrg(uchar *databuf); //左循環顯示處理
92 void RightCrcDispPrg(uchar *databuf); //右循環顯示處理
93
94 void AutoSendDataToCanBus(void); //自動發送
95
96 // 外部中斷0
97 static uchar bdata CanBusFlag=0; //can標志
98 sbit CanRcv_Good=CanBusFlag^0; //成功接收標志
99 sbit CanSend_Good=CanBusFlag^1; //成功發送標志
100 sbit CanErrFlag=CanBusFlag^2; //can總線錯誤標志
101 sbit CanDtOverFlag=CanBusFlag^3; //can總線超載標志
102 sbit CanWuiFlag=CanBusFlag^4; //can總線喚醒中斷
103
104 /*-------------------------------------------------------------------------------------------
105 外部中斷0處理程序
106 -------------------------------------------------------------------------------------------*/
107 void ex0_Val(void) interrupt 0 using 1
108 {
109 1 SJA_BCANAdr=REG_INTERRUPT;
110 1 CanBusFlag=*SJA_BCANAdr; //保存sja1000中斷標志
111 1 }
112
113 /*-------------------------------------------------------------------------------------------
114 main程序
115 -------------------------------------------------------------------------------------------*/
116 void main(void)
117 {
C51 COMPILER V6.23a MAIN 08/06/2002 16:18:58 PAGE 3
118 1 uchar status; //狀態字
119 1 Delay_50us(100) ; //50us*100=5ms
120 1 status=Config_SJA(); //配置sja1000
121 1 InitCPU(); //初始化
122 1 if(status!=0) Error_disp(status); //配置sja1000出現錯誤
123 1 else
124 1 { Disp_Can(); //無措顯示CAN1
125 2 Exe_Scon(0xaa,0,0);
126 2 }
127 1 Write_Xdata(Mode_Select,0x00);
128 1 //設置并行方式
129 1 TimeOut_Start(20); //20*50us=1ms,定時周期1ms
130 1 while(1)
131 1 {
132 2 if(_testbit_(T0IR)) //1ms時間到
133 2 {
134 3 LED_SelBit(); //位選
135 3 Key_Scan();
136 3 Show_LED();
137 3 AutoSendDataToCanBus();
138 3 TimeOut_Start(20); //20*50us=1ms,定時周期1ms
139 3 }
140 2 // CanBusFlag=Read_Xdata(REG_INTERRUPT);
141 2 if(_testbit_(CanRcv_Good)) CanRcv_Prg(); //是接收中斷標志
142 2 if(_testbit_(CanSend_Good)) CanSend_Prg(); //是發送中斷標志
143 2 if(_testbit_(CanErrFlag)) CanErr_Prg(); //是錯誤中斷標志
144 2 if(_testbit_(CanDtOverFlag))CanDtOver_Prg();//是超載中斷標志
145 2 if(_testbit_(CanWuiFlag)) CanWui_Prg(); //是喚醒中斷標志
146 2 if(_testbit_(UartRcvGood)) UartRcv_Prg(); //串口接收成功標志
147 2
148 2 Key_handle(); //鍵盤隊列處理
149 2 }
150 1
151 1 }
152
153
154 /*-------------------------------------------------------------------------------------------
155 按鍵隊列處理程序
156 -------------------------------------------------------------------------------------------*/
157 void Key_handle(void)
158 {
159 1 uchar TempData;
160 1 TempData=PopKey();
161 1 switch(TempData)
162 1 {
163 2 case Key0:
164 2 SearchKey();
165 2 break;
166 2 case Key1:
167 2 IncKey();
168 2 break;
169 2 case Key2:
170 2 break;
171 2 case Key3:
172 2 QuitKey();
173 2 break;
174 2 case Key4:
175 2 FundationKey();
176 2 break;
177 2 case Key5:
178 2 MoveKey();
179 2 break;
C51 COMPILER V6.23a MAIN 08/06/2002 16:18:58 PAGE 4
180 2 case Key6:
181 2 EnterKey();
182 2 break;
183 2 case Key7:
184 2 CanSendKey();
185 2 break;
186 2
187 2 default:
188 2 break;
189 2 }
190 1
191 1 }
192
193
194
195 //功能鍵處理
196 bit FunckeyFlag=0; //進入功能標志
197 static uchar data FunckeyCount; //功能選項計數
198 void FundationKey(void)
199 {
200 1 ClearDispAttr();
201 1 if(FunckeyFlag)
202 1 {
203 2 if(++FunckeyCount>3)FunckeyCount=0;
204 2 switch(FunckeyCount)
205 2 {
206 3 case 0:
207 3 FunckeyFlag=0;
208 3 Disp_Can(); //上電顯示CAN1
209 3 DispFlag=0x00;
210 3 break;
211 3 case 1:
212 3 Write_DispBuf(0,0x0b,0x01,0,0); //進入b功能
213 3 FlightLed3=1; //led3閃爍
214 3 break;
215 3 case 2:
216 3 Write_DispBuf(0,0x0c,0x01,0,0); //進入c功能
217 3 FlightLed3=1; //led3閃爍
218 3 break;
219 3 case 3:
220 3 Write_DispBuf(0,0x05,0x0d,0,0);
221 3 break;
222 3 default:
223 3 break;
224 3 }
225 2 }
226 1 else
227 1 {
228 2 FunckeyFlag=1;
229 2 Write_DispBuf(0,0x0a,0x01,0,0); //a1功能
230 2 FlightLed3=1; //led3閃爍
231 2 }
232 1 }
233
234 //檢索鍵處理
235 static uchar data SearchCount; //檢索計數器
236 void SearchKey(void) //檢索鍵
237 {
238 1 if(FunckeyFlag)
239 1 {
240 2 switch(DispBuf[1])
241 2 {
C51 COMPILER V6.23a MAIN 08/06/2002 16:18:58 PAGE 5
242 3 case 0x0a:
243 3 SearchCount=DispBuf[2]; //檢索a功能項
244 3 if(++SearchCount>3)SearchCount=1;
245 3 DispBuf[2]=SearchCount;
246 3 break;
247 3 case 0x0b: //檢索b功能項
248 3 SearchCount=DispBuf[2];
249 3 if(++SearchCount>10)SearchCount=1;
250 3 DispBuf[2]=SearchCount;
251 3 break;
252 3 case 0x0c:
253 3
254 3 default:
255 3 break;
256 3 }
257 2 }//if結束
258 1 }
259
260
261 //移位鍵處理
262 static bit MoveFlag=0; //移位計數
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -