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