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