📄 lcd.s
字号:
.module lcd.c
.area text(rom, con, rel)
.dbfile d:\我的文档\桌面\小车\car1\lcd.c
.dbfunc e long_to_string _long_to_string fV
; p1 -> R10,R11
; 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
.even
_long_to_string::
xcall push_arg4
xcall push_xgsetF0FC
sbiw R28,26
.dbline -1
.dbline 12
; #define _LCD_C_
; #include "LCD.h"
; #include <iom16v.h>
;
; /*****************************************
; ** 将一个整型数据转化为字符串
; ** 入口参数 要转换的整型数: dataint, 数组p[10]
; ** 改变思路:整数 -->字符串-->加字符串结束标志
; ** 可以转换小于0的整数
; *****************************************/
; void long_to_string( long int dataint, char *p )
; {
.dbline 17
; long int datainttmp;
; char *p1; //指向转换成为数组时用到
; char datachar1[10];
; char datachar2[10];
; uchar n = 0; //取整型数据的位数
clr R0
std y+25,R0
.dbline 18
; uchar i = 0;
std y+24,R0
.dbline 19
; uchar k1 = 0; //取字符个数
clr R12
.dbline 20
; uchar k2 = 0; //取字符个数
clr R14
.dbline 22
;
; if( dataint >= 0 )
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
ldd R2,y+36
ldd R3,y+37
ldd R4,y+38
ldd R5,y+39
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlt L2
X0:
.dbline 23
; datainttmp = ( long int )dataint;
std y+0,R2
std y+1,R3
std y+2,R4
std y+3,R5
xjmp L3
L2:
.dbline 24
; else datainttmp = ( long int )dataint * ( -1 );
ldd R2,y+36
ldd R3,y+37
ldd R4,y+38
ldd R5,y+39
ldi R20,255
ldi R21,255
ldi R22,255
ldi R23,255
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32s
std y+0,R16
std y+1,R17
std y+2,R18
std y+3,R19
L3:
.dbline 26
;
; p1 = datachar2;
movw R24,R28
adiw R24,14
movw R10,R24
xjmp L5
L4:
.dbline 30
;
;
; while( datainttmp != 0 )
; {
.dbline 31
; datachar1[n++] = ( datainttmp % 10 ) + 0x30; //转换为字符并取得这个整型数据的位数 n
ldd R2,y+25
clr R3
movw R6,R2
mov R24,R2
subi R24,255 ; addi 1
std y+25,R24
ldi R20,10
ldi R21,0
ldi R22,0
ldi R23,0
ldd R16,y+0
ldd R17,y+1
ldd R18,y+2
ldd R19,y+3
st -y,R23
st -y,R22
st -y,R21
st -y,R20
xcall mod32s
movw R2,R16
movw R4,R18
ldi R20,48
ldi R21,0
ldi R22,0
ldi R23,0
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
movw R24,R28
adiw R24,4
mov R30,R6
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 32
; datainttmp /= 10;
ldi R20,10
ldi R21,0
ldi R22,0
ldi R23,0
ldd R16,y+0
ldd R17,y+1
ldd R18,y+2
ldd R19,y+3
st -y,R23
st -y,R22
st -y,R21
st -y,R20
xcall div32s
std y+0,R16
std y+1,R17
std y+2,R18
std y+3,R19
.dbline 33
; }
L5:
.dbline 29
ldd R2,y+0
ldd R3,y+1
ldd R4,y+2
ldd R5,y+3
clc
tst R2
cpc R3,R2
cpc R4,R2
cpc R5,R2
breq X7
xjmp L4
X7:
X1:
.dbline 35
;
; if( dataint > 0 ) //如果要转换的整型数据>0
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
ldd R2,y+36
ldd R3,y+37
ldd R4,y+38
ldd R5,y+39
cp R20,R2
cpc R21,R3
cpc R22,R4
cpc R23,R5
brge L7
X2:
.dbline 36
; {
.dbline 37
; k1 = n - 1;
ldd R24,y+25
subi R24,1
mov R12,R24
.dbline 38
; k2 = n;
ldd R14,y+25
.dbline 40
;
; for( i = 0; i < k2; i++, k1-- )
clr R0
std y+24,R0
xjmp L12
L9:
.dbline 41
; {
.dbline 42
; datachar2[k1] = datachar1[i]; //将数字符串倒过来
movw R24,R28
adiw R24,4
ldd R30,y+24
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
movw R24,R28
adiw R24,14
mov R30,R12
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 43
; }
L10:
.dbline 40
ldd R0,y+24
inc R0
std y+24,R0
dec R12
L12:
.dbline 40
ldd R0,y+24
cp R0,R14
brlo L9
X3:
.dbline 44
; datachar2[n] = '\0'; //字符串结束标志
movw R24,R28
adiw R24,14
ldd R30,y+25
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
.dbline 45
; }
xjmp L8
L7:
.dbline 47
;
; else if( dataint < 0 ) //<0
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
ldd R2,y+36
ldd R3,y+37
ldd R4,y+38
ldd R5,y+39
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brge L13
X4:
.dbline 48
; {
.dbline 49
; k1 = n;
ldd R12,y+25
.dbline 50
; k2 = n + 1;
mov R24,R12
subi R24,255 ; addi 1
mov R14,R24
.dbline 52
;
; for( i = 0; i < k2; i++, k1-- )
clr R0
std y+24,R0
xjmp L18
L15:
.dbline 53
; {
.dbline 54
; datachar2[k1] = datachar1[i];
movw R24,R28
adiw R24,4
ldd R30,y+24
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
movw R24,R28
adiw R24,14
mov R30,R12
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 55
; }
L16:
.dbline 52
ldd R0,y+24
inc R0
std y+24,R0
dec R12
L18:
.dbline 52
ldd R0,y+24
cp R0,R14
brlo L15
X5:
.dbline 56
; datachar2[n + 1] = '\0';
movw R24,R28
adiw R24,15
ldd R30,y+25
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
.dbline 57
; datachar2[0] = '-'; //加上负号
ldi R24,45
std y+14,R24
.dbline 58
; }
xjmp L14
L13:
.dbline 60
;
; else if( dataint == 0 ) //=0
ldd R2,y+36
ldd R3,y+37
ldd R4,y+38
ldd R5,y+39
clc
tst R2
cpc R3,R2
cpc R4,R2
cpc R5,R2
brne L20
X6:
.dbline 61
; {
.dbline 62
; datachar2[0] = 0x30;
ldi R24,48
std y+14,R24
.dbline 63
; datachar2[1] = '\0';
clr R2
std y+15,R2
.dbline 64
; }
L20:
L14:
L8:
.dbline 66
;
; p1 = datachar2;
movw R24,R28
adiw R24,14
movw R10,R24
.dbline 68
;
; strcpy( p, p1 );
movw R18,R24
ldd R16,y+40
ldd R17,y+41
xcall _strcpy
.dbline -2
L1:
.dbline 0 ; func end
adiw R28,26
xcall pop_xgsetF0FC
adiw R28,4
ret
.dbsym r p1 10 pc
.dbsym r k2 14 c
.dbsym l datachar2 14 A[10:10]c
.dbsym l n 25 c
.dbsym r k1 12 c
.dbsym l datachar1 4 A[10:10]c
.dbsym l i 24 c
.dbsym l datainttmp 0 L
.dbsym l p 40 pc
.dbsym l dataint 36 L
.dbend
.dbfunc e float_2_string _float_2_string fV
; flag2 -> R12
; flag1 -> R14
; k -> R10
; dataftmp -> y+12
; datastr1 -> y+2
; i -> R20
; p -> R22
; datastr -> y+30
; dataf -> y+26
.even
_float_2_string::
xcall push_arg4
xcall push_xgsetF0FC
sbiw R28,16
ldd R22,y+32
.dbline -1
.dbline 79
; }
;
; /*****************************************
; ** 将一个浮点型数据转化为字符串
; ** 入口参数 要转换的浮点数: dataf, 数组datastr[10], 小数位数 P
; ** 最好小数位数不是
; ** 改变思路:浮点数 --> 整数 -->字符串-->根据各种类型的浮点数不同调整字符位置
; ** 可以转换小于0的浮点数
; *****************************************/
; void float_2_string( float dataf, char *datastr, uchar p )
; {
.dbline 80
; float dataftmp = dataf;
ldd R2,y+26
ldd R3,y+27
ldd R4,y+28
ldd R5,y+29
std y+12,R2
std y+13,R3
std y+14,R4
std y+15,R5
.dbline 82
; char datastr1[10];
; uchar flag1 = 0;
clr R14
.dbline 83
; uchar flag2 = 0;
clr R12
.dbline 85
; uchar k;
; uchar i = 0;
clr R20
.dbline 87
;
; if( (long int)dataf == 0 ) // dataf为 -1 --- 1 之间的数
ldd R16,y+26
ldd R17,y+27
ldd R18,y+28
ldd R19,y+29
xcall fpint
clc
tst R16
cpc R17,R16
cpc R18,R16
cpc R19,R16
breq X15
xjmp L24
X15:
X8:
.dbline 88
; {
.dbline 89
; dataftmp += 2; //随便一个整数 只是为了扩大为首位不为0的数
ldd R2,y+12
ldd R3,y+13
ldd R4,y+14
ldd R5,y+15
ldi R16,<L26
ldi R17,>L26
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R2
movw R18,R4
xcall fpadd2
std y+12,R16
std y+13,R17
std y+14,R18
std y+15,R19
.dbline 90
; flag1 = 1;
clr R14
inc R14
.dbline 91
; if( dataf < 0 )
ldd R2,y+26
ldd R3,y+27
ldd R4,y+28
ldd R5,y+29
ldi R16,<L29
ldi R17,>L29
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R2
movw R18,R4
xcall fpcmp2
brge L27
X9:
.dbline 92
; {
.dbline 93
; flag2 = 1;
clr R12
inc R12
.dbline 94
; dataftmp -= 4; //随便一个整数 只是为了扩大为首位不为0的数
ldd R2,y+12
ldd R3,y+13
ldd R4,y+14
ldd R5,y+15
ldi R16,<L30
ldi R17,>L30
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R2
movw R18,R4
xcall fpsub2
std y+12,R16
std y+13,R17
std y+14,R18
std y+15,R19
.dbline 95
; flag1 = 0;
clr R14
.dbline 96
; }
L27:
.dbline 97
; }
L24:
.dbline 99
;
; for( i = 0; i < p + 1; i++ )
clr R20
xjmp L34
L31:
.dbline 100
; dataftmp = dataftmp * 10;
ldi R16,<L35
ldi R17,>L35
xcall lpm32
movw R24,R28
adiw R24,12
st -y,R25
st -y,R24
xcall fpmule1
std y+12,R16
std y+13,R17
std y+14,R18
std y+15,R19
L32:
.dbline 99
inc R20
L34:
.dbline 99
mov R24,R22
subi R24,255 ; addi 1
cp R20,R24
brlo L31
X10:
.dbline 102
;
; long_to_string( (long int)dataftmp, datastr1 );
movw R24,R28
adiw R24,2
std y+1,R25
std y+0,R24
ldd R16,y+12
ldd R17,y+13
ldd R18,y+14
ldd R19,y+15
xcall fpint
xcall _long_to_string
.dbline 103
; k = strlen( datastr1 );
movw R16,R28
subi R16,254 ; offset = 2
sbci R17,255
xcall _strlen
mov R10,R16
.dbline 105
;
; for( i = 1; i < p + 1; i++ )
ldi R20,1
xjmp L39
L36:
.dbline 106
; *( datastr1 + (k-i) ) = *( datastr1 + (k-i-1) );
mov R2,R20
clr R3
mov R4,R10
clr R5
sub R4,R2
sbc R5,R3
movw R24,R28
adiw R24,1
movw R30,R4
add R30,R24
adc R31,R25
ldd R2,z+0
movw R24,R28
adiw R24,2
movw R30,R4
add R30,R24
adc R31,R25
std z+0,R2
L37:
.dbline 105
inc R20
L39:
.dbline 105
mov R24,R22
subi R24,255 ; addi 1
cp R20,R24
brlo L36
X11:
.dbline 108
;
; *( datastr1 + (k-i) ) = '.';
mov R2,R20
clr R3
mov R30,R10
clr R31
sub R30,R2
sbc R31,R3
movw R24,R28
adiw R24,2
add R30,R24
adc R31,R25
ldi R24,46
std z+0,R24
.dbline 111
;
;
; if( flag1 ) //如果为0.00820之类的数
tst R14
breq L41
X12:
.dbline 112
; {
.dbline 113
; *datastr1 = '0';
ldi R24,48
std y+2,R24
.dbline 114
; flag1 = 0;
clr R14
.dbline 115
; }
L41:
.dbline 117
;
; if( flag2 ) //如果为-0.00820之类的数
tst R12
breq L43
X13:
.dbline 118
; {
.dbline 119
; *datastr1 = '-';
ldi R24,45
std y+2,R24
.dbline 120
; *( datastr1 + 1 ) = '0';
ldi R24,48
std y+3,R24
.dbline 121
; }
L43:
.dbline 123
;
; if( p == 0 )
tst R22
brne L46
X14:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -