📄 rs485.lst
字号:
C51 COMPILER V7.02b RS485 06/20/2006 18:46:34 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE RS485
OBJECT MODULE PLACED IN rs485.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE rs485.c DEBUG OBJECTEXTEND
stmt level source
1 /*------------------------------------------------*/
2 /*
3 串口通讯程序,分与分机通讯程序和与管理机通讯程序,
4 Rs_int是中断程序, 负责对通讯的接收、发送
5 Message_treat是主要的针对通讯以后的处理程序
6 */
7 /*----------------------------------------------------*/
8 #include "defineh.h"
9 #include "sbitdef.h"
10 #include "Rs485.h"
11 /*----------------------------------------------------*/
12 extern void Count_Flash_Offset(void);
13
14 extern void Clr_Display(void);
15 extern void disp_detail(void);
16 extern void disp_main(void);
17 extern void No_Message_Guide(void);
18 extern void Inqire_Frame(void);
19 extern void disp_color(uchar row);
20 extern void init_timer2(void);
21 extern void init_timer0();
22 extern void clr_timer2();
23 extern void delay();
24
25 void answer_comm();
26 /*---------------------------------------*/
27 void delays60ms()
28 {
29 1 uchar data j;
30 1 uint data i;
31 1 for(j=0;j<3;j++)
32 1 for(i=0;i<=4000;i++);
33 1 }
34
35 /*-----------------------------------------*/
36 void Clr_Rx()
37 {
38 1 Rx_bit=0;//no received a valid frame
39 1 Rx_count=0;//count for bytes
40 1 Rx_sum=0; //a frame check_sum
41 1
42 1 }
43 /*----------------------------------------*/
44 void txstart()
45 {
46 1 mRs485G=send;
47 1 Tx_bit=transiting;
48 1 Tx_count=0;
49 1 SBUF=SENDSTART;
50 1 Tx_sum=SENDSTART;
51 1 }
52 /*----------------------------------------*/
53 void save_homemessage()
54 {
55 1 if(*(info_buffer+1)==ALLINFO)
C51 COMPILER V7.02b RS485 06/20/2006 18:46:34 PAGE 2
56 1 {
57 2 lounumH=0;
58 2 lounumL=0;
59 2 infonumber=*(info_buffer+5);
60 2 }
61 1 else
62 1 {
63 2 lounumH=*(info_buffer+3);
64 2 lounumL=*(info_buffer+4);
65 2 infonumber=*(info_buffer+5);
66 2 }
67 1
68 1 }
69 /*----------------------------------------------------*/
70 /* Dec_Cem Rountine
71
72 DESCRIPTION:this rountine used to transfer a data from 10进制to 16进制
73 */
74 /*-----------------------------------------------------*/
75 uchar Dec_Cem(uchar dec_data)
76 {
77 1 uchar data i,k;
78 1
79 1 i=dec_data;
80 1 k=dec_data;
81 1 i=i>>4;
82 1 i=i&0x0f;
83 1
84 1 k=k&0x0f;
85 1 k=i&0x0a+k;
86 1 return(k);
87 1 }
88 /*-------------------------------------------*/
89 /* 确认命令的实际意义
90 Description: 一共有几种方式:节能型没有下翻,03智能没有取消
91 返回数据0x0f 代表下翻, 0xf0代表上翻
92 返回数据0xaa 代表取消,0x55代表确认
93 0X00代表命令无效
94 */
95 /*-------------------------------------------*/
96 uchar check_page_command()
97 {
98 1
99 1 if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==NEXTMSN))
100 1 {
101 2 Clr_Rx();
102 2 return (pagedown); //MEAN PAGE DOWN
103 2 }
104 1
105 1 else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==UPMSN))
106 1 {
107 2 Clr_Rx();
108 2 return( pageup); //MEAN PAGE UP
109 2 }
110 1
111 1 else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==CANCELMSN))
112 1 {
113 2 Clr_Rx();
114 2 return( cancel); //MEAN cancel
115 2 }
116 1
117 1 else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==DELMSN))
C51 COMPILER V7.02b RS485 06/20/2006 18:46:34 PAGE 3
118 1 {
119 2 Clr_Rx();
120 2 return( delete); //MEAN cancel
121 2 }
122 1
123 1 else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==CONFIRMMSN))
124 1 {
125 2 Clr_Rx();
126 2 return( confirm); //MEAN PAGE UP
127 2 }
128 1
129 1 else if((*info_buffer==RESEIVESTART)&&(*(info_buffer+1)==EXTEXIT))
130 1 {
131 2 Clr_Rx();
132 2 return( exit); //MEAN PAGE UP
133 2 }
134 1 else
135 1 {
136 2 Clr_Rx();
137 2 return( 0x00);
138 2 }
139 1
140 1 }
141 /*------------------------------------------*/
142 /* 进入信息处理周期
143 描述:
144 进入前带来有关楼层信息:号码,户内形式,
145 进入后,通过纪录信息的情况变量 self_bigoffset,self_smalloffset; pub_bigoffset,pub_smalloffset;
146 以及wink_offset
147 */
148 /*---------------------------------------------*/
149 void message_treat() /*返回应答*/
150 {
151 1 uchar data i;
152 1
153 1 answer_comm();
154 1
155 1 read_block=0x1000*(0X20*(Dec_Cem(lounumH)+Dec_Cem(lounumL-1)/0x10)+Dec_Cem(lounumL-1)%0x10); //房号<33..
-读编号x0x10,读信息初识地址x1000
156 1 address_pointer=read_block;
157 1 Count_Flash_Offset();
158 1
159 1 self_newscount=offset_biggest; //现在offset_biggest记录的是信息数量
160 1 self_smalloffset=offset_smallest; //现在已经修改,offset_smallest记录的是最小的位置
161 1 self_bigoffset=offset_biggestplace;
162 1
163 1 read_block=0x00000000;
164 1 Count_Flash_Offset();
165 1 pub_newscount=offset_biggest; //现在offset_biggest记录的是信息数量
166 1 pub_smalloffset=offset_smallest; //现在已经修改,offset_smallest记录的是最小的位置
167 1 pub_bigoffset=offset_biggestplace;
168 1
169 1 wink_offset=self_newscount+pub_newscount;
170 1 Clr_Display();
171 1
172 1 if(wink_offset==0)
173 1 {
174 2 No_Message_Guide();
175 2 }
176 1 else
177 1 {
178 2 disp_detail();
C51 COMPILER V7.02b RS485 06/20/2006 18:46:34 PAGE 4
179 2 }
180 1
181 1 CNTRL=TRUE; //USED TO RELAY
182 1 init_timer2();
183 1
184 1 while((timeout2<0x3e8)&&EnWork_bit) //lookup message for 30s or home-user close,finished a cycle
185 1 {
186 2 if(Rx_bit)
187 2 {
188 3 i=check_page_command();
189 3 }
190 2
191 2 if(((self_newscount+pub_newscount)==0)&&(i==exit)) //NO MESSAGE,if push the spec key ,out the operation
192 2 {
193 3 EnWork_bit=FALSE;
194 3 i=0;
195 3 }
196 2
197 2 else if((i==pagedown)&&((self_newscount+pub_newscount)!=0))
198 2 {
199 3 if(wink_offset!=0)
200 3 {
201 4 wink_offset--;
202 4 if((self_newscount+pub_newscount-wink_offset)%rowcharacter==0) //换页
203 4 {
204 5 Clr_Display();
205 5 disp_detail();
206 5 disp_color((self_newscount+pub_newscount-wink_offset)%rowcharacter);
207 5 }
208 4 else
209 4 {
210 5 disp_color((self_newscount+pub_newscount-wink_offset)%rowcharacter);
211 5 }
212 4 }
213 3 else //到达最后,等待退出到上一层
214 3 {
215 4 Inqire_Frame();
216 4 i=0;
217 4 while((timeout2<0x3e8)&&(i!=pagedown)&&((i!=cancel)&&(kindBYTE==1)))
218 4 {
219 5 if(Rx_bit)
220 5 {
221 6 i=check_page_command();
222 6 }
223 5 }
224 4 Clr_Display();
225 4 wink_offset=self_newscount+pub_newscount;
226 4 disp_detail();
227 4 disp_color(0);
228 4 }
229 3 i=0;
230 3 }
231 2
232 2 else if((i==pageup)&&(self_newscount+pub_newscount!=0))
233 2 {
234 3 if(wink_offset==(self_newscount+pub_newscount)) //top of the detail
235 3 {
236 4 EnWork_bit=0;
237 4 }
238 3 else
239 3 {
240 4 wink_offset++;
C51 COMPILER V7.02b RS485 06/20/2006 18:46:34 PAGE 5
241 4 if((self_newscount+pub_newscount-wink_offset)%rowcharacter==0) //换页
242 4 {
243 5 Clr_Display();
244 5 disp_detail();
245 5 disp_color((self_newscount+pub_newscount-wink_offset)%rowcharacter);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -