leddisp.lst
来自「嵌入式系统中的一个显示器的驱动程序」· LST 代码 · 共 313 行
LST
313 行
C51 COMPILER V6.12 LEDDISP 01/29/2005 21:44:44 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE LEDDISP
OBJECT MODULE PLACED IN .\leddisp.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\leddisp.c DEBUG OBJECTEXTEND
stmt level source
*** WARNING C500 IN LINE 1 OF .\LEDDISP.C: MISSING DEVICE (SECURITY KEY NOT FOUND)
1 #include<head.h>
2
3 void WordLoad(void);
4
5 /*---------------------------------------------------------------------------------*/
6 /* 通讯用的函数 */
7 /*---------------------------------------------------------------------------------*/
8 void COM(void);
9 void NAPCOMM(void);
10 void serial(void);
11 void WSBUF(unsigned char ch);
12 void ModbusCrc(unsigned char x);
13 /*---------------------------------------------------------------------------------*/
14 /* 显示用的函数 */
15 /*---------------------------------------------------------------------------------*/
16 void OUT(unsigned char start,unsigned char size);
17 /*---------------------------------------------------------------------------------*/
18 /* 通讯用的变量 */
19 /*---------------------------------------------------------------------------------*/
20 unsigned int idata CRC2;
21 unsigned int idata yafslong=0,yifslong=0;
22 unsigned char idata comml=0,crc=0,modbus0=0;
23 bit yxfs=0;
24 unsigned data T2MS=0;
25 /*---------------------------------------------------------------------------------*/
26 /* 内部变量 */
27 /*---------------------------------------------------------------------------------*/
28 unsigned char data ledcs=1;
29 unsigned char code dd[64]={0x02,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x0F,0xE0,0x08,0x20,0x0F,0xE0,0x00,0x00
-,
30 0x7F,0xFC,0x40,0x04,0x4F,0xE4,0x48,0x24,0x48,0x24,0x4F,0xE4,0x40,0x14,0x40,0x08,0x08,0x02,0x08,0x02,0x14,0
-x12,0x13,0x12,0x21,0xD2,0x40,0x92,0xBF,0x12,0x21,0x12,
31 0x21,0x12,0x25,0x12,0x22,0x12,0x20,0x82,0x20,0x82,0x20,0x8A,0x1F,0x84,0x00,0x00};
32 unsigned char tempi=0;
33 unsigned char temp=0;
34 unsigned char timei=0;
35
36 unsigned char str[3]="上";
37 main()
38 {
39 1 AUXR=0x00;
40 1
41 1 IE=0X9A;
42 1 IP=0X02;
43 1 TMOD=0X11;
44 1 TH0=0XF8;TL0=0X2F;
45 1 TH1=0X9E;TL0=0X58;
46 1 TR0=1;TR1=1;
47 1
48 1 P1=0Xff;
49 1 XBYTE[0x2003]=0xff;
50 1 XBYTE[0x2001]=0xff;
51 1 XBYTE[0x2002]=0xFc;
52 1 XBYTE[0x2003]=0x3;
C51 COMPILER V6.12 LEDDISP 01/29/2005 21:44:44 PAGE 2
53 1
54 1 SCON=0x50;
55 1 TL2=0;TH2=0;T2CON=0x34; //串行口设置(用T2作为波特率发生定时器)
56 1 RCAP2H=0xFF;RCAP2L=0xDC;RS485=1;
57 1
58 1 de=1;
59 1 RS485=1;
60 1
61 1 WordCode[0]=0xb4;//str[0];
62 1 WordCode[1]=0xb4;//str[1];
63 1
64 1
65 1 for(;;){
66 2
67 2 }
68 1 }
69
70 void TimeInt0(void) interrupt 1
71 {
72 1
73 1 TH0=0XF8;TL0=0X2F;
74 1 P1=0XFF;
75 1
76 1
77 1 XBYTE[0x2001]=Character[temp];//+tempi*32];
78 1 XBYTE[0x2003]=Character[temp+8];//+1+tempi*32];
79 1 XBYTE[0x2000]=Character[temp+16];//+16+tempi*32];
80 1 XBYTE[0x2002]=Character[temp+24];///+17+tempi*32];
81 1
82 1 temp++;
83 1 P1=~ledcs;
84 1 //WordLoad();
85 1 ledcs=ledcs<<1;
86 1 if(ledcs==0){ledcs=1;temp=0;}
87 1
88 1
89 1
90 1 }
91 void TimeInt1(void) interrupt 3
92 {
93 1 TH1=0X9E;TL0=0X58;
94 1 modbus0++;
95 1 if(modbus0 >= 200) {comml=0;} //5s内没有后续报文,清空前面的报文
96 1 COM();
97 1 timei++;
98 1 //if(timei>80){timei=0;tempi=!tempi;}
99 1 if(timei>40){
100 2 char i;
101 2 char tempword;
102 2 timei=0;
103 2 tempword=Character[15];
104 2 for(i=15;i>0;i--)Character[i]=Character[i-1];Character[15]=tempword;
105 2 tempword=Character[31];
106 2 for(i=31;i>16;i--)Character[i]=Character[i-1];Character[31]=tempword;
107 2 }
108 1
109 1
110 1 }
111
112 void WordLoad(void)
113 {
114 1 }
C51 COMPILER V6.12 LEDDISP 01/29/2005 21:44:44 PAGE 3
115
116
117 void serial(void) interrupt 4
118 {
119 1
120 1
121 1 unsigned char ch;
122 1 if(RI)
123 1 { //RTU模式接收
124 2 ch=SBUF;RI=0;modbus0=0;
125 2 if((comml==0)&&(ch!=de)) {return;}
126 2 if(comml < 255)commd[comml++]=ch;// {commd[comml]=ch;comml++;}
127 2 }
128 1 else if(TI)
129 1 {TI=0;
130 2 if(yxfs)
131 2 {SBUF=ssbuf[yifslong++];
132 3 if(yifslong==(yafslong+1))
133 3 {
134 4 yifslong=0;yafslong=0;
135 4 yxfs=0;RS485=1;
136 4 }
137 3
138 3 }
139 2 }
140 1
141 1 }
142
143 void COM(void)
144 {
145 1 unsigned int chh,addr,ch1;
146 1 unsigned char leng1,ch10;
147 1
148 1 while(comml>6)
149 1 {
150 2 if(commd[0]==de && (commd[1]==0x03 || commd[1]==0x06) ) {if(comml>=8) leng1 = 8; else return;}
151 2 else if(commd[0]==de && commd[1]==0x10 && commd[6]<0x60 ) {if(comml>=commd[6]+9) leng1=commd[6]
-+9;else return;}
152 2 else { NAPCOMM(); continue;}
153 2 for(ch1=0,CRC2=0xFFFF;ch1<leng1-2;ch1++) ModbusCrc(commd[ch1]); //计算crc
154 2 if((commd[comml-1]!=CRC2/256)||(commd[comml-2]!=CRC2%256)) {NAPCOMM();}
155 2 else {break;}
156 2 }
157 1
158 1 if (comml<=6) {return;}
159 1
160 1 addr=((commd[2]*256+commd[3]))*2; //开始地址
161 1
162 1
163 1 switch(commd[1])
164 1 {case 0x03:RS485=0; //开始发送数据
165 2 crc=0; //开始冒号
166 2 WSBUF(de);crc+=de; //设备号
167 2 WSBUF(0x03);crc+=3; //功能码
168 2 chh=2*(commd[4]*256+commd[5]);crc+=chh;WSBUF(chh); //
169 2 for(ch1=0;ch1<chh;ch1++)
170 2 {
171 3 // if(addr>=0x0040&&addr<=0x00A0) //浮点数字节倒序
172 3 // {if(addr%2==0) {ch10=XBYTE[0x8000+addr+1];}
173 3 // else {ch10=XBYTE[0x8000+addr-1];}
174 3 // }
175 3 //else {
C51 COMPILER V6.12 LEDDISP 01/29/2005 21:44:44 PAGE 4
176 3 ch10=XBYTE[0x8000+addr];//}
177 3 crc+=ch10;WSBUF(ch10);
178 3 addr=addr+1;
179 3
180 3 } //数据
181 2
182 2 for(ch1=0,CRC2=0xFFFF;ch1<yafslong;ch1++)
183 2 ModbusCrc(ssbuf[ch1]);
184 2 WSBUF(CRC2%256);WSBUF(CRC2/256);
185 2 SBUF=ssbuf[0];yifslong=1;yxfs=1;
186 2 break;
187 2
188 2 case 0x06:
189 2 if(addr == 0x00)
190 2 {}
191 2 else
192 2 {XBYTE[0x8000+addr]=commd[4]; //数据
193 3 XBYTE[0x8000+addr+1]=commd[5];}
194 2 OUT(0,1);
195 2
196 2 RS485=0;
197 2 crc=0; //开始冒号
198 2 WSBUF(de);crc+=de; //设备号
199 2 WSBUF(0x06);crc+=6; //功能码
200 2 ch1=commd[2];crc+=ch1;WSBUF(ch1); //开始地址
201 2 ch1=commd[3];crc+=ch1;WSBUF(ch1);
202 2 ch1=commd[4];crc+=ch1;WSBUF(ch1); //开始地址
203 2 ch1=commd[5];crc+=ch1;WSBUF(ch1);
204 2
205 2 for(ch1=0,CRC2=0xFFFF;ch1<yafslong;ch1++)
206 2 ModbusCrc(ssbuf[ch1]);
207 2 WSBUF(CRC2%256);WSBUF(CRC2/256);
208 2
209 2
210 2 SBUF=ssbuf[0];yifslong=1;yxfs=1;
211 2
212 2 break;
213 2 case 0x10:
214 2 RS485=0; //开始发送数据
215 2 crc=0; //开始冒号
216 2 WSBUF(de);crc+=de; //设备号
217 2 WSBUF(0x10);crc+=0x10; //功能码
218 2 ch1=commd[2];crc+=ch1;WSBUF(ch1);
219 2 ch1=commd[3];crc+=ch1;WSBUF(ch1);
220 2 ch1=commd[4];crc+=ch1;WSBUF(ch1);
221 2 ch1=commd[5];crc+=ch1;WSBUF(ch1);
222 2
223 2 for(ch1=0,CRC2=0xFFFF;ch1<yafslong;ch1++)
224 2 ModbusCrc(ssbuf[ch1]);
225 2 WSBUF(CRC2%256);WSBUF(CRC2/256);
226 2
227 2 SBUF=ssbuf[0];yifslong=1;yxfs=1;
228 2 chh=commd[6];
229 2 for(ch1=0;ch1<chh;ch1++)
230 2 {
231 3 /* if(addr>=0x0040&&addr<=0x00A0) //浮点数字节倒序
232 3 {
233 3 tempaddr = addr + ch1;
234 3 if(tempaddr >= 0x0040 && tempaddr < 0x0060)
235 3 { if(ch1%2==0) {XBYTE[tempaddr+1+0x8000]=commd[7+ch1];}
236 3 else {XBYTE[tempaddr-1+0x8000]=commd[7+ch1];} }
237 3 else if(tempaddr >= 0x0060 && tempaddr < 0x00A0)
C51 COMPILER V6.12 LEDDISP 01/29/2005 21:44:44 PAGE 5
238 3 {
239 3 }
240 3
241 3 }
242 3 else {*/
243 3 XBYTE[addr+ch1+0x8000]=commd[7+ch1];//}
244 3 }
245 2 break;
246 2 }
247 1 comml=0;
248 1 }
249
250 void NAPCOMM(void) //将现在的报文第一个字符除去,并且找出后面第一个为站号的字符并且修整数组
251 {
252 1 unsigned int i14,pos1;
253 1 pos1 = 0;
254 1
255 1 for(i14=1;i14<comml;i14++) {if(commd[i14]==de) {pos1=i14;break;} }
256 1 if(pos1>0) {
257 2 for(i14=pos1;i14<comml;i14++) commd[i14-pos1]=commd[i14]; comml-=pos1; }
258 1 else {comml=0;}
259 1
260 1 }
261
262 void WSBUF(unsigned char ch) //单字节发送
263 {if(yafslong<0xff)ssbuf[yafslong++]=ch;}
264
265
266 void ModbusCrc(unsigned char x)
267 // modbus协议CRC校验, R7为输入校验字节,CRC2为校验字
268 {
269 1 unsigned char k,v;
270 1 CRC2=CRC2^x;
271 1 for(k=0;k<8;k++)
272 1 {
273 2 v=CRC2 %2;
274 2 CRC2=CRC2>>1;
275 2 if(v==1) {CRC2=CRC2^0xa001;}
276 2 }
277 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1681 ----
CONSTANT SIZE = 64 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 12
IDATA SIZE = 9 ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?