📄 1602test.lst
字号:
(0056) datachar2[n + 1] = '\0';
17D 01CE MOVW R24,R28
17E 960F ADIW R24,0xF
17F 8DE9 LDD R30,Y+25
180 27FF CLR R31
181 0FE8 ADD R30,R24
182 1FF9 ADC R31,R25
183 2422 CLR R2
184 8220 STD Z+0,R2
(0057) datachar2[0] = '-'; //加上负号
185 E28D LDI R24,0x2D
186 878E STD Y+14,R24
(0058) }
187 C00E RJMP 0x0196
(0059)
(0060) else if( dataint == 0 ) //=0
188 A02C LDD R2,Y+36
189 A03D LDD R3,Y+37
18A A04E LDD R4,Y+38
18B A05F LDD R5,Y+39
18C 9488 BCLR 0
18D 2022 TST R2
18E 0432 CPC R3,R2
18F 0442 CPC R4,R2
190 0452 CPC R5,R2
191 F421 BNE 0x0196
(0061) {
(0062) datachar2[0] = 0x30;
192 E380 LDI R24,0x30
193 878E STD Y+14,R24
(0063) datachar2[1] = '\0';
194 2422 CLR R2
195 862F STD Y+15,R2
(0064) }
(0065)
(0066) p1 = datachar2;
196 01CE MOVW R24,R28
197 960E ADIW R24,0xE
198 015C MOVW R10,R24
(0067)
(0068) strcpy( p, p1 );
199 019C MOVW R18,R24
19A A508 LDD R16,Y+40
19B A519 LDD R17,Y+41
19C 940E 0449 CALL _strcpy
19E 966A ADIW R28,0x1A
19F 940E 0501 CALL pop_xgsetF0FC
1A1 9624 ADIW R28,4
1A2 9508 RET
_float_2_string:
flag2 --> R12
flag1 --> R14
k --> R10
dataftmp --> Y,+12
datastr1 --> Y,+2
i --> R20
p --> R22
datastr --> Y,+30
dataf --> Y,+26
1A3 940E 045E CALL push_arg4
1A5 940E 050C CALL push_xgsetF0FC
1A7 9760 SBIW R28,0x10
1A8 A168 LDD R22,Y+32
(0069) }
(0070)
(0071) /*****************************************
(0072) ** 将一个浮点型数据转化为字符串
(0073) ** 入口参数 要转换的浮点数: dataf, 数组datastr[10], 小数位数 P
(0074) ** 最好小数位数不是
(0075) ** 改变思路:浮点数 --> 整数 -->字符串-->根据各种类型的浮点数不同调整字符位置
(0076) ** 可以转换小于0的浮点数
(0077) *****************************************/
(0078) void float_2_string( float dataf, char *datastr, uchar p )
(0079) {
(0080) float dataftmp = dataf;
1A9 8C2A LDD R2,Y+26
1AA 8C3B LDD R3,Y+27
1AB 8C4C LDD R4,Y+28
1AC 8C5D LDD R5,Y+29
1AD 862C STD Y+12,R2
1AE 863D STD Y+13,R3
1AF 864E STD Y+14,R4
1B0 865F STD Y+15,R5
(0081) char datastr1[10];
(0082) uchar flag1 = 0;
1B1 24EE CLR R14
(0083) uchar flag2 = 0;
1B2 24CC CLR R12
(0084) uchar k;
(0085) uchar i = 0;
1B3 2744 CLR R20
(0086)
(0087) if( (long int)dataf == 0 ) // dataf为 -1 --- 1 之间的数
1B4 8D0A LDD R16,Y+26
1B5 8D1B LDD R17,Y+27
1B6 8D2C LDD R18,Y+28
1B7 8D3D LDD R19,Y+29
1B8 940E 060F CALL fpint
1BA 9488 BCLR 0
1BB 2300 TST R16
1BC 0710 CPC R17,R16
1BD 0720 CPC R18,R16
1BE 0730 CPC R19,R16
1BF F009 BEQ 0x01C1
1C0 C03E RJMP 0x01FF
(0088) {
(0089) dataftmp += 2; //随便一个整数 只是为了扩大为首位不为0的数
1C1 842C LDD R2,Y+12
1C2 843D LDD R3,Y+13
1C3 844E LDD R4,Y+14
1C4 845F LDD R5,Y+15
1C5 E600 LDI R16,0x60
1C6 E010 LDI R17,0
1C7 940E 057D CALL lpm32
1C9 933A ST R19,-Y
1CA 932A ST R18,-Y
1CB 931A ST R17,-Y
1CC 930A ST R16,-Y
1CD 0181 MOVW R16,R2
1CE 0192 MOVW R18,R4
1CF 940E 05F9 CALL fpadd2
1D1 870C STD Y+12,R16
1D2 871D STD Y+13,R17
1D3 872E STD Y+14,R18
1D4 873F STD Y+15,R19
(0090) flag1 = 1;
1D5 24EE CLR R14
1D6 94E3 INC R14
(0091) if( dataf < 0 )
1D7 8C2A LDD R2,Y+26
1D8 8C3B LDD R3,Y+27
1D9 8C4C LDD R4,Y+28
1DA 8C5D LDD R5,Y+29
1DB E50C LDI R16,0x5C
1DC E010 LDI R17,0
1DD 940E 057D CALL lpm32
1DF 933A ST R19,-Y
1E0 932A ST R18,-Y
1E1 931A ST R17,-Y
1E2 930A ST R16,-Y
1E3 0181 MOVW R16,R2
1E4 0192 MOVW R18,R4
1E5 940E 0755 CALL fpcmp2
1E7 F4BC BGE 0x01FF
(0092) {
(0093) flag2 = 1;
1E8 24CC CLR R12
1E9 94C3 INC R12
(0094) dataftmp -= 4; //随便一个整数 只是为了扩大为首位不为0的数
1EA 842C LDD R2,Y+12
1EB 843D LDD R3,Y+13
1EC 844E LDD R4,Y+14
1ED 845F LDD R5,Y+15
1EE E508 LDI R16,0x58
1EF E010 LDI R17,0
1F0 940E 057D CALL lpm32
1F2 933A ST R19,-Y
1F3 932A ST R18,-Y
1F4 931A ST R17,-Y
1F5 930A ST R16,-Y
1F6 0181 MOVW R16,R2
1F7 0192 MOVW R18,R4
1F8 940E 0604 CALL fpsub2
1FA 870C STD Y+12,R16
1FB 871D STD Y+13,R17
1FC 872E STD Y+14,R18
1FD 873F STD Y+15,R19
(0095) flag1 = 0;
1FE 24EE CLR R14
(0096) }
(0097) }
(0098)
(0099) for( i = 0; i < p + 1; i++ )
1FF 2744 CLR R20
200 C00F RJMP 0x0210
(0100) dataftmp = dataftmp * 10;
201 E504 LDI R16,0x54
202 E010 LDI R17,0
203 940E 057D CALL lpm32
205 01CE MOVW R24,R28
206 960C ADIW R24,0xC
207 939A ST R25,-Y
208 938A ST R24,-Y
209 940E 0733 CALL fpmule1
20B 870C STD Y+12,R16
20C 871D STD Y+13,R17
20D 872E STD Y+14,R18
20E 873F STD Y+15,R19
20F 9543 INC R20
210 2F86 MOV R24,R22
211 5F8F SUBI R24,0xFF
212 1748 CP R20,R24
213 F368 BCS 0x0201
(0101)
(0102) long_to_string( (long int)dataftmp, datastr1 );
214 01CE MOVW R24,R28
215 9602 ADIW R24,2
216 8399 STD Y+1,R25
217 8388 STD Y+0,R24
218 850C LDD R16,Y+12
219 851D LDD R17,Y+13
21A 852E LDD R18,Y+14
21B 853F LDD R19,Y+15
21C 940E 060F CALL fpint
21E DE8D RCALL _long_to_string
(0103) k = strlen( datastr1 );
21F 018E MOVW R16,R28
220 5F0E SUBI R16,0xFE
221 4F1F SBCI R17,0xFF
222 940E 0452 CALL _strlen
224 2EA0 MOV R10,R16
(0104)
(0105) for( i = 1; i < p + 1; i++ )
225 E041 LDI R20,1
226 C013 RJMP 0x023A
(0106) *( datastr1 + (k-i) ) = *( datastr1 + (k-i-1) );
227 2E24 MOV R2,R20
228 2433 CLR R3
229 2C4A MOV R4,R10
22A 2455 CLR R5
22B 1842 SUB R4,R2
22C 0853 SBC R5,R3
22D 01CE MOVW R24,R28
22E 9601 ADIW R24,1
22F 01F2 MOVW R30,R4
230 0FE8 ADD R30,R24
231 1FF9 ADC R31,R25
232 8020 LDD R2,Z+0
233 01CE MOVW R24,R28
234 9602 ADIW R24,2
235 01F2 MOVW R30,R4
236 0FE8 ADD R30,R24
237 1FF9 ADC R31,R25
238 8220 STD Z+0,R2
239 9543 INC R20
23A 2F86 MOV R24,R22
23B 5F8F SUBI R24,0xFF
23C 1748 CP R20,R24
23D F348 BCS 0x0227
(0107)
(0108) *( datastr1 + (k-i) ) = '.';
23E 2E24 MOV R2,R20
23F 2433 CLR R3
240 2DEA MOV R30,R10
241 27FF CLR R31
242 19E2 SUB R30,R2
243 09F3 SBC R31,R3
244 01CE MOVW R24,R28
245 9602 ADIW R24,2
246 0FE8 ADD R30,R24
247 1FF9 ADC R31,R25
248 E28E LDI R24,0x2E
249 8380 STD Z+0,R24
(0109)
(0110)
(0111) if( flag1 ) //如果为0.00820之类的数
24A 20EE TST R14
24B F019 BEQ 0x024F
(0112) {
(0113) *datastr1 = '0';
24C E380 LDI R24,0x30
24D 838A STD Y+2,R24
(0114) flag1 = 0;
24E 24EE CLR R14
(0115) }
(0116)
(0117) if( flag2 ) //如果为-0.00820之类的数
24F 20CC TST R12
250 F021 BEQ 0x0255
(0118) {
(0119) *datastr1 = '-';
251 E28D LDI R24,0x2D
252 838A STD Y+2,R24
(0120) *( datastr1 + 1 ) = '0';
253 E380 LDI R24,0x30
254 838B STD Y+3,R24
(0121) }
(0122)
(0123) if( p == 0 )
255 2366 TST R22
256 F461 BNE 0x0263
(0124) {
(0125) *( datastr1 + (k-i) ) = '\0';
257 2E24 MOV R2,R20
258 2433 CLR R3
259 2DEA MOV R30,R10
25A 27FF CLR R31
25B 19E2 SUB R30,R2
25C 09F3 SBC R31,R3
25D 01CE MOVW R24,R28
25E 9602 ADIW R24,2
25F 0FE8 ADD R30,R24
260 1FF9 ADC R31,R25
261 2422 CLR R2
262 8220 STD Z+0,R2
(0126) }
(0127)
(0128) strcpy( datastr, datastr1 );
263 019E MOVW R18,R28
264 5F2E SUBI R18,0xFE
265 4F3F SBCI R19,0xFF
266 8D0E LDD R16,Y+30
267 8D1F LDD R17,Y+31
268 940E 0449 CALL _strcpy
26A 9660 ADIW R28,0x10
26B 940E 0501 CALL pop_xgsetF0FC
26D 9624 ADIW R28,4
26E 9508 RET
(0129) }
(0130) //*********************************************************************************************
(0131)
(0132) //==========================================
(0133) //函数名称:液晶模块使能
(0134) //函数作用: 使能液晶
(0135) //入口参数: 无
(0136) //返回类型:无
(0137) //==========================================
(0138) void LCD_en_write(void)
(0139) {
(0140) EN_SET;
_LCD_en_write:
26F 9ADB SBI 0x1B,3
(0141) delay_nus(4);
270 E004 LDI R16,4
271 E010 LDI R17,0
272 940E 0078 CALL _delay_nus
(0142) EN_CLR;
274 98DB CBI 0x1B,3
275 9508 RET
_LCD_write_command:
command --> R20
276 934A ST R20,-Y
277 2F40 MOV R20,R16
(0143) }
(0144)
(0145) //==========================================
(0146) //函数名称:写指令
(0147) //函数作用:
(0148) //入口参数: 液晶指令command
(0149) //返回类型:无
(0150) //==========================================
(0151) void LCD_write_command(uchar command)
(0152) {
(0153) delay_nus( 16 );
278 E100 LDI R16,0x10
279 E010 LDI R17,0
27A 940E 0078 CALL _delay_nus
(0154) RS_CLR;
27C 98DA CBI 0x1B,2
(0155) DB &= 0X0F; //清高四位
27D B38B IN R24,0x1B
27E 708F ANDI R24,0xF
27F BB8B OUT 0x1B,R24
(0156) DB |= command & 0xf0; //写高四位
280 2F84 MOV R24,R20
281 7F80 ANDI R24,0xF0
282 B22B IN R2,0x1B
283 2A28 OR R2,R24
284 BA2B OUT 0x1B,R2
(0157) LCD_en_write();
285 DFE9 RCALL _LCD_en_write
(0158) command=command << 4; //低四位移到高四位
286 2F84 MOV R24,R20
287 708F ANDI R24,0xF
288 9582 SWAP R24
289 2F48 MOV R20,R24
(0159) DB &= 0x0f; //清高四位
28A B38B IN R24,0x1B
28B 708F ANDI R24,0xF
28C BB8B OUT 0x1B,R24
(0160) DB |= command & 0xf0; //写低四位
28D 2F84 MOV R24,R20
28E 7F80 ANDI R24,0xF0
28F B22B IN R2,0x1B
290 2A28 OR R2,R24
291 BA2B OUT 0x1B,R2
(0161) LCD_en_write();
292 DFDC RCALL _LCD_en_write
293 9149 LD R20,Y+
294 9508 RET
_LCD_write_data:
DATA --> R20
295 934A ST R20,-Y
296 2F40 MOV R20,R16
(0162) //delay_nms(2); //清屏指令时间很长, 保险起见,可以增加
(0163) }
(0164)
(0165) //==========================================
(0166) //函数名称:写数据
(0167) //函数作用:
(0168) //入口参数: 数据DATA
(0169) //返回类型:无
(0170) //==========================================
(0171) void LCD_write_data(uchar DATA)
(0172) {
(0173) delay_nus(16);
297 E100 LDI R16,0x10
298 E010 LDI R17,0
299 940E 0078 CALL _delay_nus
(0174) RS_SET; //RS=1
29B 9ADA SBI 0x1B,2
(0175) DB &= 0X0f; //清高四位
29C B38B IN R24,0x1B
29D 708F ANDI R24,0xF
29E BB8B OUT 0x1B,R24
(0176) DB |= DATA&0xf0; //写高四位
29F 2F84 MOV R24,R20
2A0 7F80 ANDI R24,0xF0
2A1 B22B IN R2,0x1B
2A2 2A28 OR R2,R24
2A3 BA2B OUT 0x1B,R2
(0177) LCD_en_write();
2A4 DFCA RCALL _LCD_en_write
(0178) DATA = DATA << 4; //低四位移到高四位
2A5 2F84 MOV R24,R20
2A6 708F ANDI R24,0xF
2A7 9582 SWAP R24
2A8 2F48 MOV R20,R24
(0179) DB &= 0X0f; //清高四位
2A9 B38B IN R24,0x1B
2AA 708F ANDI R24,0xF
2AB BB8B OUT 0x1B,R24
(0180) DB |= DATA&0xf0; //写低四位
2AC 2F84 MOV R24,R20
2AD 7F80 ANDI R24,0xF0
2AE B22B IN R2,0x1B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -