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

📄 lcd.s

📁 基于m16的寻迹小车(包含小车题目
💻 S
📖 第 1 页 / 共 2 页
字号:
	.dbline 124
;     {
	.dbline 125
;         *( datastr1 + (k-i) ) = '\0';
	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
	clr R2
	std z+0,R2
	.dbline 126
;     }
L46:
	.dbline 128
; 
;     strcpy( datastr, datastr1 );
	movw R18,R28
	subi R18,254  ; offset = 2
	sbci R19,255
	ldd R16,y+30
	ldd R17,y+31
	xcall _strcpy
	.dbline -2
L23:
	.dbline 0 ; func end
	adiw R28,16
	xcall pop_xgsetF0FC
	adiw R28,4
	ret
	.dbsym r flag2 12 c
	.dbsym r flag1 14 c
	.dbsym r k 10 c
	.dbsym l dataftmp 12 D
	.dbsym l datastr1 2 A[10:10]c
	.dbsym r i 20 c
	.dbsym r p 22 c
	.dbsym l datastr 30 pc
	.dbsym l dataf 26 D
	.dbend
	.dbfunc e LCD_en_write _LCD_en_write fV
	.even
_LCD_en_write::
	.dbline -1
	.dbline 139
; }
; //*********************************************************************************************
; 
; //==========================================
; //函数名称:液晶模块使能
; //函数作用: 使能液晶
; //入口参数: 无
; //返回类型:无
; //==========================================
; void LCD_en_write(void)
; {
	.dbline 140
;   EN_SET;
	sbi 0x1b,3
	.dbline 141
;   delay_nus(4);
	ldi R16,4
	ldi R17,0
	xcall _delay_nus
	.dbline 142
;   EN_CLR;
	cbi 0x1b,3
	.dbline -2
L48:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_write_command _LCD_write_command fV
;        command -> R20
	.even
_LCD_write_command::
	st -y,R20
	mov R20,R16
	.dbline -1
	.dbline 152
; }
; 
; //==========================================
; //函数名称:写指令
; //函数作用:
; //入口参数: 液晶指令command
; //返回类型:无
; //==========================================
; void LCD_write_command(uchar command)
; {
	.dbline 153
;   delay_nus( 16 );
	ldi R16,16
	ldi R17,0
	xcall _delay_nus
	.dbline 154
;   RS_CLR;
	cbi 0x1b,1
	.dbline 155
;   DB &= 0X0F;           //清高四位
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 156
;   DB |= command & 0xf0; //写高四位
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 157
;   LCD_en_write();
	xcall _LCD_en_write
	.dbline 158
;   command=command << 4;   //低四位移到高四位
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 159
;   DB &= 0x0f;             //清高四位
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 160
;   DB |= command & 0xf0;   //写低四位
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 161
;   LCD_en_write();
	xcall _LCD_en_write
	.dbline -2
L49:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r command 20 c
	.dbend
	.dbfunc e LCD_write_data _LCD_write_data fV
;           DATA -> R20
	.even
_LCD_write_data::
	st -y,R20
	mov R20,R16
	.dbline -1
	.dbline 172
;   //delay_nms(2);         //清屏指令时间很长, 保险起见,可以增加
; }
; 
; //==========================================
; //函数名称:写数据
; //函数作用:
; //入口参数: 数据DATA
; //返回类型:无
; //==========================================
; void LCD_write_data(uchar DATA)
; {
	.dbline 173
;   delay_nus(16);
	ldi R16,16
	ldi R17,0
	xcall _delay_nus
	.dbline 174
;   RS_SET;           //RS=1
	sbi 0x1b,1
	.dbline 175
;   DB &= 0X0f;       //清高四位
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 176
;   DB |= DATA&0xf0;  //写高四位
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 177
;   LCD_en_write();
	xcall _LCD_en_write
	.dbline 178
;   DATA = DATA << 4; //低四位移到高四位
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 179
;   DB &= 0X0f;       //清高四位
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 180
;   DB |= DATA&0xf0;  //写低四位
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 181
;   LCD_en_write();
	xcall _LCD_en_write
	.dbline -2
L50:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r DATA 20 c
	.dbend
	.dbfunc e LCD_init _LCD_init fV
	.even
_LCD_init::
	.dbline -1
	.dbline 191
; }
; 
; //==========================================
; //函数名称:液晶初始化函数
; //函数作用:
; //入口参数: 无
; //返回类型:无
; //==========================================
; void LCD_init( void )
; {
	.dbline 192
;   DB_DDR_OUT;
	.dbline 192
	in R24,0x1a
	ori R24,240
	out 0x1a,R24
	in R24,0x1a
	ori R24,10
	out 0x1a,R24
	.dbline 192
	.dbline 192
	.dbline 193
;   LCD_write_command(0x28);
	ldi R16,40
	xcall _LCD_write_command
	.dbline 194
;   LCD_en_write();           //********总结这里一定要加这液晶使能*********
	xcall _LCD_en_write
	.dbline 195
;   delay_nus(20);
	ldi R16,20
	ldi R17,0
	xcall _delay_nus
	.dbline 196
;   LCD_write_command(0x28);  //4位显示
	ldi R16,40
	xcall _LCD_write_command
	.dbline 197
;   LCD_write_command(0x0c);  //显示开
	ldi R16,12
	xcall _LCD_write_command
	.dbline 198
;   LCD_write_command(0x01);  //清屏
	ldi R16,1
	xcall _LCD_write_command
	.dbline 199
;   delay_nms(5);             //延时一定要长
	ldi R16,5
	ldi R17,0
	xcall _delay_nms
	.dbline -2
L51:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_set_rc _LCD_set_rc fV
;        address -> R20
;              c -> R22
;              r -> R10
	.even
_LCD_set_rc::
	xcall push_xgsetF00C
	mov R22,R18
	mov R10,R16
	.dbline -1
	.dbline 209
; }
; 
; //==========================================
; //函数名称:写地址
; //函数作用:
; //入口参数: 行位置r, 列位置c
; //返回类型:无
; //==========================================
; void LCD_set_rc( uchar r, uchar c )
; {
	.dbline 212
;     uchar address;
; 
;     if (r == 1)
	mov R24,R10
	cpi R24,1
	brne L53
X16:
	.dbline 213
;     address = 0x80 + c;
	mov R20,R22
	subi R20,128    ; addi 128
	xjmp L54
L53:
	.dbline 214
;     else if(r == 2)
	mov R24,R10
	cpi R24,2
	brne L55
X17:
	.dbline 215
;     address = 0xc0 + c;
	mov R20,R22
	subi R20,64    ; addi 192
L55:
L54:
	.dbline 217
; 
;     LCD_write_command( address );
	mov R16,R20
	xcall _LCD_write_command
	.dbline -2
L52:
	.dbline 0 ; func end
	xjmp pop_xgsetF00C
	.dbsym r address 20 c
	.dbsym r c 22 c
	.dbsym r r 10 c
	.dbend
	.dbfunc e LCD_write_string _LCD_write_string fV
;              s -> R20,R21
;              c -> R12
;              r -> R10
	.even
_LCD_write_string::
	xcall push_xgset303C
	mov R12,R18
	mov R10,R16
	ldd R20,y+6
	ldd R21,y+7
	.dbline -1
	.dbline 228
; }
; 
; //==========================================
; //函数名称:写字符串
; //函数作用: 在指定位置写一串字符串
; //入口参数: 行位置r, 列位置c, 字符串*s
; //返回类型:无
; //示例    : LCD_write_string( 1, 2, "dongxixiaonanbei" );
; //==========================================
; void LCD_write_string(uchar r, uchar c, uchar *s)
; {
	.dbline 229
;     LCD_set_rc( r, c ); //写地址
	mov R18,R12
	mov R16,R10
	xcall _LCD_set_rc
	xjmp L59
L58:
	.dbline 232
; 
;     while( *s )     	 	// 写显示字符
;     {
	.dbline 233
;       LCD_write_data( *s );
	movw R30,R20
	ldd R16,z+0
	xcall _LCD_write_data
	.dbline 234
;       s++;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 235
;     }
L59:
	.dbline 231
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L58
X18:
	.dbline -2
L57:
	.dbline 0 ; func end
	xjmp pop_xgset303C
	.dbsym r s 20 pc
	.dbsym r c 12 c
	.dbsym r r 10 c
	.dbend
	.dbfunc e LCD_write_char _LCD_write_char fV
;           DATA -> y+2
;              c -> R12
;              r -> R10
	.even
_LCD_write_char::
	st -y,R10
	st -y,R12
	mov R12,R18
	mov R10,R16
	.dbline -1
	.dbline 241
; }
; 
; //写字符
; //示例   : LCD_write_char( 1, 2, 'a' );
; void LCD_write_char(uchar r, uchar c, uchar DATA)				
; {
	.dbline 242
;  	 LCD_set_rc( r, c );
	mov R18,R12
	mov R16,R10
	xcall _LCD_set_rc
	.dbline 243
; 	 LCD_write_data( DATA );
	ldd R16,y+2
	xcall _LCD_write_data
	.dbline -2
L61:
	.dbline 0 ; func end
	ld R12,y+
	ld R10,y+
	ret
	.dbsym l DATA 2 c
	.dbsym r c 12 c
	.dbsym r r 10 c
	.dbend
	.dbfunc e LCD_write_array _LCD_write_array fV
;              i -> R10
;          array -> R12,R13
;              c -> R22
;              r -> R20
	.even
_LCD_write_array::
	xcall push_xgsetF03C
	mov R22,R18
	mov R20,R16
	sbiw R28,1
	ldd R12,y+9
	ldd R13,y+10
	.dbline -1
	.dbline 255
; }
; 
; //==========================================
; //函数名称:写字符数组
; //函数作用: 在指定位置写一串字符串
; //入口参数: 行位置r, 列位置c, 字符数组chardata[], 字符个数
; //返回类型:无
; //示例    : uchar a[] = "dongxixiaonanbei@163.com"
; //          LCD_write_array( 1, 2, a );
; //==========================================
; void LCD_write_array( uchar r, uchar c, uchar array[] )
; {
	.dbline 256
;  	uchar i = 0;
	clr R10
	xjmp L64
L63:
	.dbline 258
;     while( array[i] != '\0' )
; 	{
	.dbline 259
; 	 	 LCD_write_char( r, c, array[i] );
	mov R30,R10
	clr R31
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	std y+0,R2
	mov R18,R22
	mov R16,R20
	xcall _LCD_write_char
	.dbline 260
; 	     if( ++c == 16 )
	mov R24,R22
	subi R24,255    ; addi 1
	mov R22,R24
	cpi R22,16
	brne L66
X19:
	.dbline 261
; 		 {
	.dbline 262
; 		     if( r == 1 )
	cpi R20,1
	brne L68
X20:
	.dbline 263
; 			 {   
	.dbline 264
; 			     c = 0;
	clr R22
	.dbline 265
; 				 r = 2;
	ldi R20,2
	.dbline 266
; 		  	  	 LCD_write_char( r, c, array[i] );
	mov R30,R10
	clr R31
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	std y+0,R2
	mov R18,R22
	mov R16,R20
	xcall _LCD_write_char
	.dbline 267
; 			 }
	xjmp L69
L68:
	.dbline 269
; 			 
; 			 else if( r == 2 )
	cpi R20,2
	brne L70
X21:
	.dbline 270
; 			 {
	.dbline 271
; 			  	 c = 0;
	clr R22
	.dbline 272
; 				 r = 1;
	ldi R20,1
	.dbline 273
; 				 LCD_write_char( r, c, array[i] );
	mov R30,R10
	clr R31
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	std y+0,R2
	mov R18,R22
	mov R16,R20
	xcall _LCD_write_char
	.dbline 274
; 		     }
L70:
L69:
	.dbline 275
; 	     }
L66:
	.dbline 276
; 		 i++;
	inc R10
	.dbline 277
; 	}  
L64:
	.dbline 257
	mov R30,R10
	clr R31
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	tst R2
	breq X23
	xjmp L63
X23:
X22:
	.dbline -2
L62:
	.dbline 0 ; func end
	adiw R28,1
	xjmp pop_xgsetF03C
	.dbsym r i 10 c
	.dbsym r array 12 pc
	.dbsym r c 22 c
	.dbsym r r 20 c
	.dbend
	.dbfunc e LCD_write_datalongint _LCD_write_datalongint fV
;              a -> y+2
;    datalongint -> y+14
;              c -> R12
;              r -> R10
	.even
_LCD_write_datalongint::
	st -y,R10
	st -y,R12
	mov R12,R18
	mov R10,R16
	sbiw R28,12
	.dbline -1
	.dbline 283
; }
; 
; //写整数
; //例子: LCD_write_datalongint( 1, 5, 89 );  在液晶第一行,第5列显示89
; void LCD_write_datalongint( uchar r, uchar c, long int datalongint )
; {
	.dbline 285
;     char a[10];
;     long_to_string( datalongint, a ) ;
	movw R24,R28
	adiw R24,2
	std y+1,R25
	std y+0,R24
	ldd R16,y+14
	ldd R17,y+15
	ldd R18,y+16
	ldd R19,y+17
	xcall _long_to_string
	.dbline 286
; 	LCD_write_string( r, c, a );
	movw R24,R28
	adiw R24,2
	std y+1,R25
	std y+0,R24
	mov R18,R12
	mov R16,R10
	xcall _LCD_write_string
	.dbline -2
L72:
	.dbline 0 ; func end
	adiw R28,12
	ld R12,y+
	ld R10,y+
	ret
	.dbsym l a 2 A[10:10]c
	.dbsym l datalongint 14 L
	.dbsym r c 12 c
	.dbsym r r 10 c
	.dbend
	.dbfunc e LCD_write_datafloat _LCD_write_datafloat fV
;              a -> y+3
;              p -> y+19
;          dataf -> y+15
;              c -> R12
;              r -> R10
	.even
_LCD_write_datafloat::
	st -y,R10
	st -y,R12
	mov R12,R18
	mov R10,R16
	sbiw R28,13
	.dbline -1
	.dbline 292
; }
; 
; //写浮点型数据
; //例子: LCD_write_datafloat( 1, 5, -0.33, 4 );  在液晶第一行,第5列显示-0.33, 显示小数点后4位。
; void LCD_write_datafloat( uchar r, uchar c, float dataf, uchar p )
; {
	.dbline 294
;     char a[10];
;     float_2_string( dataf, a, p );
	ldd R0,y+19
	std y+2,R0
	movw R24,R28
	adiw R24,3
	std y+1,R25
	std y+0,R24
	ldd R16,y+15
	ldd R17,y+16
	ldd R18,y+17
	ldd R19,y+18
	xcall _float_2_string
	.dbline 295
;     LCD_write_string( r, c, a );
	movw R24,R28
	adiw R24,3
	std y+1,R25
	std y+0,R24
	mov R18,R12
	mov R16,R10
	xcall _LCD_write_string
	.dbline -2
L73:
	.dbline 0 ; func end
	adiw R28,13
	ld R12,y+
	ld R10,y+
	ret
	.dbsym l a 3 A[10:10]c
	.dbsym l p 19 c
	.dbsym l dataf 15 D
	.dbsym r c 12 c
	.dbsym r r 10 c
	.dbend
	.area lit(rom, con, rel)
L35:
	.word 0x0,0x4120
L30:
	.word 0x0,0x4080
L29:
	.word 0x0,0x0
L26:
	.word 0x0,0x4000
; }
; //******************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -