⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd.s

📁 基于m16的寻迹小车(包含小车题目
💻 S
📖 第 1 页 / 共 2 页
字号:
	.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 + -