📄 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 + -