📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 06/01/2005 14:29:41 PAGE 1
C51 COMPILER V7.50, 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 /************************************************************************
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
49 static uchar idata SendDataCount; //发送数据显示
50
51 //键盘操作函数
52 extern void Write_Xdata(uint Xadr,uchar Info); // 将info送入外部地址xadr中
53 extern uchar Read_Xdata(uint Xadr); //从外部地址xadr中读取数据
54 extern void Key_Scan(void); //键盘扫描程序
55 extern uchar Key_Get(void); //取键盘值
C51 COMPILER V7.50 MAIN 06/01/2005 14:29:41 PAGE 2
56 extern void PushKey(uchar keynum); //将键值送入按键处理队列
57 extern uchar PopKey(void); //
58
59 void Key_handle(void); //处理键值
60
61 void FundationKey(void); //功能键
62 void MoveKey(void); //移位键
63 void SearchKey(void); //检索键
64 void EnterKey(void); //确认键
65 void IncKey(void); //增加键
66 void QuitKey(void); //退出键
67 void CanSendKey(void); //发送键
68
69 void EnterNext(void); //按确认键后进入下一小项处理
70 //led 送显
71 #define LED_SelBit() disp_pt++;if(disp_pt>4)disp_pt=0//位选
72 extern void Show_LED(void); //显示处理
73 extern void Write_DispBuf(uchar buf0,uchar buf1,uchar buf2,uchar buf3,uchar buf4);//写入显示缓冲区
74 extern uchar GetLedData(void); //将显示的值换算
75 extern void Error_disp(uchar ErrByte); //将错误字送显
76
77 void InitCPU(void); //初始化函数
78 // 配置sja1000
79 uchar Config_SJA(void); //配置sja1000
80 void CanRcv_Prg(void); //can总线数据接收后处理
81 void CanSend_Prg(void); //can发送数据
82 void CanErr_Prg(void); //发现错误后处理
83 void CanDtOver_Prg(void); //超载处理
84 void CanWui_Prg(void); //唤醒中断处理
85
86 void UartRcv_Prg(void); //串口接收到数据处理
87
88 void DrecDisplay(uchar *databuf); //直通显示处理函数
89 void TestDispPrg(void); //测试处理函数
90 void ClearDispPrg(uchar *databuf); //消隐处理函数
91 void FlightDispPrg(uchar *databuf); //闪烁处理函数
92 void LiftCrcDispPrg(uchar *databuf); //左循环显示处理
93 void RightCrcDispPrg(uchar *databuf); //右循环显示处理
94
95 void AutoSendDataToCanBus(void); //自动发送
96
97 // 外部中断0
98 static uchar bdata CanBusFlag=0; //can标志
99 sbit CanRcv_Good=CanBusFlag^0; //成功接收标志
100 sbit CanSend_Good=CanBusFlag^1; //成功发送标志
101 sbit CanErrFlag=CanBusFlag^2; //can总线错误标志
102 sbit CanDtOverFlag=CanBusFlag^3; //can总线超载标志
103 sbit CanWuiFlag=CanBusFlag^4; //can总线唤醒中断
104
105 /*-------------------------------------------------------------------------------------------
106 外部中断0处理程序
107 -------------------------------------------------------------------------------------------*/
108 void ex0_Val(void) interrupt 0 using 1
109 {
110 1 SJA_BCANAdr=REG_INTERRUPT;
111 1 CanBusFlag=*SJA_BCANAdr; //保存sja1000中断标志
112 1 }
113
114 /*-------------------------------------------------------------------------------------------
115 main程序
116 -------------------------------------------------------------------------------------------*/
117 void main(void)
C51 COMPILER V7.50 MAIN 06/01/2005 14:29:41 PAGE 3
118 {
119 1 uchar status; //状态字
120 1 Delay_50us(100) ; //50us*100=5ms
121 1 status=Config_SJA(); //配置sja1000
122 1 InitCPU(); //初始化
123 1 if(status!=0) Error_disp(status); //配置sja1000出现错误
124 1 else
125 1 { Disp_Can(); //无措显示CAN1
126 2 Exe_Scon(0xaa,0,0);
127 2 }
128 1 Write_Xdata(Mode_Select,0x00);
129 1 //设置并行方式
130 1 TimeOut_Start(20); //20*50us=1ms,定时周期1ms
131 1 while(1)
132 1 {
133 2 if(_testbit_(T0IR)) //1ms时间到
134 2 {
135 3 LED_SelBit(); //位选
136 3 Key_Scan();
137 3 Show_LED();
138 3 AutoSendDataToCanBus();
139 3 TimeOut_Start(20); //20*50us=1ms,定时周期1ms
140 3 }
141 2 // CanBusFlag=Read_Xdata(REG_INTERRUPT);
142 2 if(_testbit_(CanRcv_Good)) CanRcv_Prg(); //是接收中断标志
143 2 if(_testbit_(CanSend_Good)) CanSend_Prg(); //是发送中断标志
144 2 if(_testbit_(CanErrFlag)) CanErr_Prg(); //是错误中断标志
145 2 if(_testbit_(CanDtOverFlag))CanDtOver_Prg();//是超载中断标志
146 2 if(_testbit_(CanWuiFlag)) CanWui_Prg(); //是唤醒中断标志
147 2 if(_testbit_(UartRcvGood)) UartRcv_Prg(); //串口接收成功标志
148 2
149 2 Key_handle(); //键盘队列处理
150 2 }
151 1
152 1 }
153
154
155 /*-------------------------------------------------------------------------------------------
156 按键队列处理程序
157 -------------------------------------------------------------------------------------------*/
158 void Key_handle(void)
159 {
160 1 uchar TempData;
161 1 TempData=PopKey();
162 1 switch(TempData)
163 1 {
164 2 case Key0:
165 2 SearchKey();
166 2 break;
167 2 case Key1:
168 2 IncKey();
169 2 break;
170 2 case Key2:
171 2 break;
172 2 case Key3:
173 2 QuitKey();
174 2 break;
175 2 case Key4:
176 2 FundationKey();
177 2 break;
178 2 case Key5:
179 2 MoveKey();
C51 COMPILER V7.50 MAIN 06/01/2005 14:29:41 PAGE 4
180 2 break;
181 2 case Key6:
182 2 EnterKey();
183 2 break;
184 2 case Key7:
185 2 CanSendKey();
186 2 break;
187 2
188 2 default:
189 2 break;
190 2 }
191 1
192 1 }
193
194
195
196 //功能键处理
197 bit FunckeyFlag=0; //进入功能标志
198 static uchar data FunckeyCount; //功能选项计数
199 void FundationKey(void)
200 {
201 1 ClearDispAttr();
202 1 if(FunckeyFlag)
203 1 {
204 2 if(++FunckeyCount>3)FunckeyCount=0;
205 2 switch(FunckeyCount)
206 2 {
207 3 case 0:
208 3 FunckeyFlag=0;
209 3 Disp_Can(); //上电显示CAN1
210 3 DispFlag=0x00;
211 3 break;
212 3 case 1:
213 3 Write_DispBuf(0,0x0b,0x01,0,0); //进入b功能
214 3 FlightLed3=1; //led3闪烁
215 3 break;
216 3 case 2:
217 3 Write_DispBuf(0,0x0c,0x01,0,0); //进入c功能
218 3 FlightLed3=1; //led3闪烁
219 3 break;
220 3 case 3:
221 3 Write_DispBuf(0,0x05,0x0d,0,0);
222 3 break;
223 3 default:
224 3 break;
225 3 }
226 2 }
227 1 else
228 1 {
229 2 FunckeyFlag=1;
230 2 Write_DispBuf(0,0x0a,0x01,0,0); //a1功能
231 2 FlightLed3=1; //led3闪烁
232 2 }
233 1 }
234
235 //检索键处理
236 static uchar data SearchCount; //检索计数器
237 void SearchKey(void) //检索键
238 {
239 1 if(FunckeyFlag)
240 1 {
241 2 switch(DispBuf[1])
C51 COMPILER V7.50 MAIN 06/01/2005 14:29:41 PAGE 5
242 2 {
243 3 case 0x0a:
244 3 SearchCount=DispBuf[2]; //检索a功能项
245 3 if(++SearchCount>3)SearchCount=1;
246 3 DispBuf[2]=SearchCount;
247 3 break;
248 3 case 0x0b: //检索b功能项
249 3 SearchCount=DispBuf[2];
250 3 if(++SearchCount>10)SearchCount=1;
251 3 DispBuf[2]=SearchCount;
252 3 break;
253 3 case 0x0c:
254 3
255 3 default:
256 3 break;
257 3 }
258 2 }//if结束
259 1 }
260
261
262 //移位键处理
263 static bit MoveFlag=0; //移位计数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -