📄 car1.lst
字号:
3D2 DFEF RCALL _delay_1ms
3D3 5F4F SUBI R20,0xFF
3D4 4F5F SBCI R21,0xFF
3D5 154A CP R20,R10
3D6 055B CPC R21,R11
3D7 F3D0 BCS 0x03D2
3D8 940C 0781 JMP pop_xgset300C
_delay_ns:
i --> R10
n --> R12
3DA 92AA ST R10,-Y
3DB 92CA ST R12,-Y
3DC 2EC0 MOV R12,R16
(0036) }
(0037)
(0038) //延时1S
(0039) void delay_ns( uchar n )
(0040) {
(0041) uchar i;
(0042) for( i = 0; i < n; i++ )
3DD 24AA CLR R10
3DE C004 RJMP 0x03E3
(0043) {
(0044) delay_nms( 1000 );
3DF EE08 LDI R16,0xE8
3E0 E013 LDI R17,3
3E1 DFEA RCALL _delay_nms
3E2 94A3 INC R10
3E3 14AC CP R10,R12
3E4 F3D0 BCS 0x03DF
3E5 90C9 LD R12,Y+
3E6 90A9 LD R10,Y+
3E7 9508 RET
_long_to_string:
p1 --> R10
k2 --> R14
datachar2 --> Y,+14
n --> Y,+25
k1 --> R12
datachar1 --> Y,+4
i --> Y,+24
datainttmp --> Y,+0
p --> Y,+40
dataint --> Y,+36
3E8 940E 06C3 CALL push_arg4
3EA 940E 0771 CALL push_xgsetF0FC
3EC 976A SBIW R28,0x1A
FILE: d:\我的文档\桌面\小车\car1\lcd.c
(0001) #define _LCD_C_
(0002) #include "LCD.h"
(0003) #include <iom16v.h>
(0004)
(0005) /*****************************************
(0006) ** 将一个整型数据转化为字符串
(0007) ** 入口参数 要转换的整型数: dataint, 数组p[10]
(0008) ** 改变思路:整数 -->字符串-->加字符串结束标志
(0009) ** 可以转换小于0的整数
(0010) *****************************************/
(0011) void long_to_string( long int dataint, char *p )
(0012) {
(0013) long int datainttmp;
(0014) char *p1; //指向转换成为数组时用到
(0015) char datachar1[10];
(0016) char datachar2[10];
(0017) uchar n = 0; //取整型数据的位数
3ED 2400 CLR R0
3EE 8E09 STD Y+25,R0
(0018) uchar i = 0;
3EF 8E08 STD Y+24,R0
(0019) uchar k1 = 0; //取字符个数
3F0 24CC CLR R12
(0020) uchar k2 = 0; //取字符个数
3F1 24EE CLR R14
(0021)
(0022) if( dataint >= 0 )
3F2 E040 LDI R20,0
3F3 E050 LDI R21,0
3F4 E060 LDI R22,0
3F5 E070 LDI R23,0
3F6 A02C LDD R2,Y+36
3F7 A03D LDD R3,Y+37
3F8 A04E LDD R4,Y+38
3F9 A05F LDD R5,Y+39
3FA 1624 CP R2,R20
3FB 0635 CPC R3,R21
3FC 0646 CPC R4,R22
3FD 0657 CPC R5,R23
3FE F02C BLT 0x0404
(0023) datainttmp = ( long int )dataint;
3FF 8228 STD Y+0,R2
400 8239 STD Y+1,R3
401 824A STD Y+2,R4
402 825B STD Y+3,R5
403 C014 RJMP 0x0418
(0024) else datainttmp = ( long int )dataint * ( -1 );
404 A02C LDD R2,Y+36
405 A03D LDD R3,Y+37
406 A04E LDD R4,Y+38
407 A05F LDD R5,Y+39
408 EF4F LDI R20,0xFF
409 EF5F LDI R21,0xFF
40A EF6F LDI R22,0xFF
40B EF7F LDI R23,0xFF
40C 925A ST R5,-Y
40D 924A ST R4,-Y
40E 923A ST R3,-Y
40F 922A ST R2,-Y
410 018A MOVW R16,R20
411 019B MOVW R18,R22
412 940E 0732 CALL empy32u
414 8308 STD Y+0,R16
415 8319 STD Y+1,R17
416 832A STD Y+2,R18
417 833B STD Y+3,R19
(0025)
(0026) p1 = datachar2;
418 01CE MOVW R24,R28
419 960E ADIW R24,0xE
41A 015C MOVW R10,R24
41B C037 RJMP 0x0453
(0027)
(0028)
(0029) while( datainttmp != 0 )
(0030) {
(0031) datachar1[n++] = ( datainttmp % 10 ) + 0x30; //转换为字符并取得这个整型数据的位数 n
41C 8C29 LDD R2,Y+25
41D 2433 CLR R3
41E 0131 MOVW R6,R2
41F 2D82 MOV R24,R2
420 5F8F SUBI R24,0xFF
421 8F89 STD Y+25,R24
422 E04A LDI R20,0xA
423 E050 LDI R21,0
424 E060 LDI R22,0
425 E070 LDI R23,0
426 8108 LDD R16,Y+0
427 8119 LDD R17,Y+1
428 812A LDD R18,Y+2
429 813B LDD R19,Y+3
42A 937A ST R23,-Y
42B 936A ST R22,-Y
42C 935A ST R21,-Y
42D 934A ST R20,-Y
42E 940E 06D0 CALL mod32s
430 0118 MOVW R2,R16
431 0129 MOVW R4,R18
432 E340 LDI R20,0x30
433 E050 LDI R21,0
434 E060 LDI R22,0
435 E070 LDI R23,0
436 0E24 ADD R2,R20
437 1E35 ADC R3,R21
438 1E46 ADC R4,R22
439 1E57 ADC R5,R23
43A 01CE MOVW R24,R28
43B 9604 ADIW R24,4
43C 2DE6 MOV R30,R6
43D 27FF CLR R31
43E 0FE8 ADD R30,R24
43F 1FF9 ADC R31,R25
440 8220 STD Z+0,R2
(0032) datainttmp /= 10;
441 E04A LDI R20,0xA
442 E050 LDI R21,0
443 E060 LDI R22,0
444 E070 LDI R23,0
445 8108 LDD R16,Y+0
446 8119 LDD R17,Y+1
447 812A LDD R18,Y+2
448 813B LDD R19,Y+3
449 937A ST R23,-Y
44A 936A ST R22,-Y
44B 935A ST R21,-Y
44C 934A ST R20,-Y
44D 940E 06CE CALL div32s
44F 8308 STD Y+0,R16
450 8319 STD Y+1,R17
451 832A STD Y+2,R18
452 833B STD Y+3,R19
453 8028 LDD R2,Y+0
454 8039 LDD R3,Y+1
455 804A LDD R4,Y+2
456 805B LDD R5,Y+3
457 9488 BCLR 0
458 2022 TST R2
459 0432 CPC R3,R2
45A 0442 CPC R4,R2
45B 0452 CPC R5,R2
45C F009 BEQ 0x045E
45D CFBE RJMP 0x041C
(0033) }
(0034)
(0035) if( dataint > 0 ) //如果要转换的整型数据>0
45E E040 LDI R20,0
45F E050 LDI R21,0
460 E060 LDI R22,0
461 E070 LDI R23,0
462 A02C LDD R2,Y+36
463 A03D LDD R3,Y+37
464 A04E LDD R4,Y+38
465 A05F LDD R5,Y+39
466 1542 CP R20,R2
467 0553 CPC R21,R3
468 0564 CPC R22,R4
469 0575 CPC R23,R5
46A F52C BGE 0x0490
(0036) {
(0037) k1 = n - 1;
46B 8D89 LDD R24,Y+25
46C 5081 SUBI R24,1
46D 2EC8 MOV R12,R24
(0038) k2 = n;
46E 8CE9 LDD R14,Y+25
(0039)
(0040) for( i = 0; i < k2; i++, k1-- )
46F 2400 CLR R0
470 8E08 STD Y+24,R0
471 C012 RJMP 0x0484
(0041) {
(0042) datachar2[k1] = datachar1[i]; //将数字符串倒过来
472 01CE MOVW R24,R28
473 9604 ADIW R24,4
474 8DE8 LDD R30,Y+24
475 27FF CLR R31
476 0FE8 ADD R30,R24
477 1FF9 ADC R31,R25
478 8020 LDD R2,Z+0
479 01CE MOVW R24,R28
47A 960E ADIW R24,0xE
47B 2DEC MOV R30,R12
47C 27FF CLR R31
47D 0FE8 ADD R30,R24
47E 1FF9 ADC R31,R25
47F 8220 STD Z+0,R2
480 8C08 LDD R0,Y+24
481 9403 INC R0
482 8E08 STD Y+24,R0
483 94CA DEC R12
484 8C08 LDD R0,Y+24
485 140E CP R0,R14
486 F358 BCS 0x0472
(0043) }
(0044) datachar2[n] = '\0'; //字符串结束标志
487 01CE MOVW R24,R28
488 960E ADIW R24,0xE
489 8DE9 LDD R30,Y+25
48A 27FF CLR R31
48B 0FE8 ADD R30,R24
48C 1FF9 ADC R31,R25
48D 2422 CLR R2
48E 8220 STD Z+0,R2
(0045) }
48F C042 RJMP 0x04D2
(0046)
(0047) else if( dataint < 0 ) //<0
490 E040 LDI R20,0
491 E050 LDI R21,0
492 E060 LDI R22,0
493 E070 LDI R23,0
494 A02C LDD R2,Y+36
495 A03D LDD R3,Y+37
496 A04E LDD R4,Y+38
497 A05F LDD R5,Y+39
498 1624 CP R2,R20
499 0635 CPC R3,R21
49A 0646 CPC R4,R22
49B 0657 CPC R5,R23
49C F53C BGE 0x04C4
(0048) {
(0049) k1 = n;
49D 8CC9 LDD R12,Y+25
(0050) k2 = n + 1;
49E 2D8C MOV R24,R12
49F 5F8F SUBI R24,0xFF
4A0 2EE8 MOV R14,R24
(0051)
(0052) for( i = 0; i < k2; i++, k1-- )
4A1 2400 CLR R0
4A2 8E08 STD Y+24,R0
4A3 C012 RJMP 0x04B6
(0053) {
(0054) datachar2[k1] = datachar1[i];
4A4 01CE MOVW R24,R28
4A5 9604 ADIW R24,4
4A6 8DE8 LDD R30,Y+24
4A7 27FF CLR R31
4A8 0FE8 ADD R30,R24
4A9 1FF9 ADC R31,R25
4AA 8020 LDD R2,Z+0
4AB 01CE MOVW R24,R28
4AC 960E ADIW R24,0xE
4AD 2DEC MOV R30,R12
4AE 27FF CLR R31
4AF 0FE8 ADD R30,R24
4B0 1FF9 ADC R31,R25
4B1 8220 STD Z+0,R2
4B2 8C08 LDD R0,Y+24
4B3 9403 INC R0
4B4 8E08 STD Y+24,R0
4B5 94CA DEC R12
4B6 8C08 LDD R0,Y+24
4B7 140E CP R0,R14
4B8 F358 BCS 0x04A4
(0055) }
(0056) datachar2[n + 1] = '\0';
4B9 01CE MOVW R24,R28
4BA 960F ADIW R24,0xF
4BB 8DE9 LDD R30,Y+25
4BC 27FF CLR R31
4BD 0FE8 ADD R30,R24
4BE 1FF9 ADC R31,R25
4BF 2422 CLR R2
4C0 8220 STD Z+0,R2
(0057) datachar2[0] = '-'; //加上负号
4C1 E28D LDI R24,0x2D
4C2 878E STD Y+14,R24
(0058) }
4C3 C00E RJMP 0x04D2
(0059)
(0060) else if( dataint == 0 ) //=0
4C4 A02C LDD R2,Y+36
4C5 A03D LDD R3,Y+37
4C6 A04E LDD R4,Y+38
4C7 A05F LDD R5,Y+39
4C8 9488 BCLR 0
4C9 2022 TST R2
4CA 0432 CPC R3,R2
4CB 0442 CPC R4,R2
4CC 0452 CPC R5,R2
4CD F421 BNE 0x04D2
(0061) {
(0062) datachar2[0] = 0x30;
4CE E380 LDI R24,0x30
4CF 878E STD Y+14,R24
(0063) datachar2[1] = '\0';
4D0 2422 CLR R2
4D1 862F STD Y+15,R2
(0064) }
(0065)
(0066) p1 = datachar2;
4D2 01CE MOVW R24,R28
4D3 960E ADIW R24,0xE
4D4 015C MOVW R10,R24
(0067)
(0068) strcpy( p, p1 );
4D5 019C MOVW R18,R24
4D6 A508 LDD R16,Y+40
4D7 A519 LDD R17,Y+41
4D8 940E 06AE CALL _strcpy
4DA 966A ADIW R28,0x1A
4DB 940E 0766 CALL pop_xgsetF0FC
4DD 9624 ADIW R28,4
4DE 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
4DF 940E 06C3 CALL push_arg4
4E1 940E 0771 CALL push_xgsetF0FC
4E3 9760 SBIW R28,0x10
4E4 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;
4E5 8C2A LDD R2,Y+26
4E6 8C3B LDD R3,Y+27
4E7 8C4C LDD R4,Y+28
4E8 8C5D LDD R5,Y+29
4E9 862C STD Y+12,R2
4EA 863D STD Y+13,R3
4EB 864E STD Y+14,R4
4EC 865F STD Y+15,R5
(0081) char datastr1[10];
(0082) uchar flag1 = 0;
4ED 24EE CLR R14
(0083) uchar flag2 = 0;
4EE 24CC CLR R12
(0084) uchar k;
(0085) uchar i = 0;
4EF 2744 CLR R20
(0086)
(0087) if( (long int)dataf == 0 ) // dataf为 -1 --- 1 之间的数
4F0 8D0A LDD R16,Y+26
4F1 8D1B LDD R17,Y+27
4F2 8D2C LDD R18,Y+28
4F3 8D3D LDD R19,Y+29
4F4 940E 087E CALL fpint
4F6 9488 BCLR 0
4F7 2300 TST R16
4F8 0710 CPC R17,R16
4F9 0720 CPC R18,R16
4FA 0730 CPC R19,R16
4FB F009 BEQ 0x04FD
4FC C03E RJMP 0x053B
(0088) {
(0089) dataftmp += 2; //随便一个整数 只是为了扩大为首位不为0的数
4FD 842C LDD R2,Y+12
4FE 843D LDD R3,Y+13
4FF 844E LDD R4,Y+14
500 845F LDD R5,Y+15
501 E600 LDI R16,0x60
502 E010 LDI R17,0
503 940E 07EC CALL lpm32
505 933A ST R19,-Y
506 932A ST R18,-Y
507 931A ST R17,-Y
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -