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

📄 lcd.s

📁 基于m16的寻迹寻光小车程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module lcd.c
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\自动充电小车\自动充电小车\298\lcd.c
	.dbfunc e LCD_en_write _LCD_en_write fV
	.even
_LCD_en_write::
	.dbline -1
	.dbline 11
; #define _LCD_C_
; #include "LCD.h"
; #include <iom16v.h>
; //==========================================
; //函数名称:液晶模块使能
; //函数作用: 使能液晶
; //入口参数: 无
; //返回类型:无
; //==========================================
; void LCD_en_write(void)
; {
	.dbline 12
;   EN_SET;
	sbi 0x18,7
	.dbline 13
;   delay_nus(4);
	ldi R16,4
	ldi R17,0
	xcall _delay_nus
	.dbline 14
;   EN_CLR;
	cbi 0x18,7
	.dbline -2
L1:
	.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 24
; }
; 
; //==========================================
; //函数名称:写指令
; //函数作用:
; //入口参数: 液晶指令command
; //返回类型:无
; //==========================================
; void LCD_write_command(uchar command)
; {
	.dbline 25
;   delay_nus( 16 );
	ldi R16,16
	ldi R17,0
	xcall _delay_nus
	.dbline 26
;   RS_CLR;
	cbi 0x18,6
	.dbline 27
;   DB &= 0X0F;           //清高四位
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 28
;   DB |= command & 0xf0; //写高四位
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 29
;   LCD_en_write();
	xcall _LCD_en_write
	.dbline 30
;   command=command << 4;   //低四位移到高四位
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 31
;   DB &= 0x0f;             //清高四位
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 32
;   DB |= command & 0xf0;   //写低四位
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 33
;   LCD_en_write();
	xcall _LCD_en_write
	.dbline -2
L2:
	.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 44
;   //delay_nms(2);         //清屏指令时间很长, 保险起见,可以增加
; }
; 
; //==========================================
; //函数名称:写数据
; //函数作用:
; //入口参数: 数据DATA
; //返回类型:无
; //==========================================
; void LCD_write_data(uchar DATA)
; {
	.dbline 45
;   delay_nus(16);
	ldi R16,16
	ldi R17,0
	xcall _delay_nus
	.dbline 46
;   RS_SET;           //RS=1
	sbi 0x18,6
	.dbline 47
;   DB &= 0X0f;       //清高四位
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 48
;   DB |= DATA&0xf0;  //写高四位
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 49
;   LCD_en_write();
	xcall _LCD_en_write
	.dbline 50
;   DATA = DATA << 4; //低四位移到高四位
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 51
;   DB &= 0X0f;       //清高四位
	in R24,0x1b
	andi R24,15
	out 0x1b,R24
	.dbline 52
;   DB |= DATA&0xf0;  //写低四位
	mov R24,R20
	andi R24,240
	in R2,0x1b
	or R2,R24
	out 0x1b,R2
	.dbline 53
;   LCD_en_write();
	xcall _LCD_en_write
	.dbline -2
L3:
	.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 63
; }
; 
; //==========================================
; //函数名称:液晶初始化函数
; //函数作用:
; //入口参数: 无
; //返回类型:无
; //==========================================
; void LCD_init( void )
; {
	.dbline 64
;   DB_DDR_OUT;
	.dbline 64
	in R24,0x1a
	ori R24,240
	out 0x1a,R24
	in R24,0x17
	ori R24,192
	out 0x17,R24
	.dbline 64
	.dbline 64
	.dbline 65
;   LCD_write_command(0x28);
	ldi R16,40
	xcall _LCD_write_command
	.dbline 66
;   LCD_en_write();           //********总结这里一定要加这液晶使能*********
	xcall _LCD_en_write
	.dbline 67
;   delay_nus(20);
	ldi R16,20
	ldi R17,0
	xcall _delay_nus
	.dbline 68
;   LCD_write_command(0x28);  //4位显示
	ldi R16,40
	xcall _LCD_write_command
	.dbline 69
;   LCD_write_command(0x0c);  //显示开
	ldi R16,12
	xcall _LCD_write_command
	.dbline 70
;   LCD_write_command(0x01);  //清屏
	ldi R16,1
	xcall _LCD_write_command
	.dbline 71
;   delay_nms(5);             //延时一定要长
	ldi R16,5
	ldi R17,0
	xcall _delay_nms
	.dbline -2
L4:
	.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 81
; }
; 
; //==========================================
; //函数名称:写地址
; //函数作用:
; //入口参数: 行位置r, 列位置c
; //返回类型:无
; //==========================================
; void LCD_set_rc( uchar r, uchar c )
; {
	.dbline 84
;     uchar address;
; 
;     if (r == 1)
	mov R24,R10
	cpi R24,1
	brne L6
X0:
	.dbline 85
;     address = 0x80 + c;
	mov R20,R22
	subi R20,128    ; addi 128
	xjmp L7
L6:
	.dbline 86
;     else if(r == 2)
	mov R24,R10
	cpi R24,2
	brne L8
X1:
	.dbline 87
;     address = 0xc0 + c;
	mov R20,R22
	subi R20,64    ; addi 192
L8:
L7:
	.dbline 89
; 
;     LCD_write_command( address );
	mov R16,R20
	xcall _LCD_write_command
	.dbline -2
L5:
	.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 99
; }
; 
; //==========================================
; //函数名称:写字符串
; //函数作用: 在指定位置写一串字符串
; //入口参数: 行位置r, 列位置c, 字符串*s
; //返回类型:无
; //==========================================
; void LCD_write_string(uchar r, uchar c, uchar *s)
; {
	.dbline 100
;     LCD_set_rc( r, c ); //写地址
	mov R18,R12
	mov R16,R10
	xcall _LCD_set_rc
	xjmp L12
L11:
	.dbline 103
; 
;     while( *s )     	 	// 写显示字符
;     {
	.dbline 104
;       LCD_write_data( *s );
	movw R30,R20
	ldd R16,z+0
	xcall _LCD_write_data
	.dbline 105
;       s++;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 106
;     }
L12:
	.dbline 102
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L11
X2:
	.dbline -2
L10:
	.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 110
; }
; 
; void LCD_write_char(uchar r, uchar c, uchar DATA)				   //写字符
; {
	.dbline 111
;  	 LCD_set_rc( r, c );
	mov R18,R12
	mov R16,R10
	xcall _LCD_set_rc
	.dbline 112
; 	 LCD_write_data( DATA );
	ldd R16,y+2
	xcall _LCD_write_data
	.dbline -2
L14:
	.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 122
; }
; 
; //==========================================
; //函数名称:写字符数组
; //函数作用: 在指定位置写一串字符串
; //入口参数: 行位置r, 列位置c, 字符数组chardata[], 字符个数
; //返回类型:无
; //==========================================
; void LCD_write_array( uchar r, uchar c, uchar array[] )
; {
	.dbline 123
;  	uchar i = 0;
	clr R10
	xjmp L17
L16:
	.dbline 125
;     while( array[i] != '\0' )
; 	{
	.dbline 126
; 	 	 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 127
; 	     if( ++c == 16 )
	mov R24,R22
	subi R24,255    ; addi 1
	mov R22,R24
	cpi R22,16
	brne L19
X3:
	.dbline 128
; 		 {
	.dbline 129
; 		     if( r == 1 )
	cpi R20,1
	brne L21
X4:
	.dbline 130
; 			 {   
	.dbline 131
; 			     c = 0;
	clr R22
	.dbline 132
; 				 r = 2;
	ldi R20,2
	.dbline 133
; 		  	  	 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 134
; 			 }
	xjmp L22
L21:
	.dbline 136
; 			 
; 			 else if( r == 2 )
	cpi R20,2
	brne L23
X5:
	.dbline 137
; 			 {
	.dbline 138
; 			  	 c = 0;
	clr R22
	.dbline 139
; 				 r = 1;
	ldi R20,1
	.dbline 140
; 				 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 141
; 		     }
L23:
L22:
	.dbline 142
; 	     }
L19:
	.dbline 143
; 		 i++;
	inc R10
	.dbline 144
; 	}  
L17:
	.dbline 124
	mov R30,R10
	clr R31
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	tst R2
	breq X7
	xjmp L16
X7:
X6:
	.dbline -2
L15:
	.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 lengh_longint _lengh_longint fc
;         data_n -> R20
;        datatmp -> y+0
;    datalongint -> y+5
	.even
_lengh_longint::
	xcall push_arg4
	st -y,R20
	sbiw R28,4
	.dbline -1
	.dbline 149
; }
; 
; //返回整形数据的长度
; char lengh_longint( long unsigned datalongint )
; {
	.dbline 150
;     long signed datatmp = datalongint;
	ldd R2,y+5
	ldd R3,y+6
	ldd R4,y+7
	ldd R5,y+8
	std y+0,R2
	std y+1,R3
	std y+2,R4
	std y+3,R5
	.dbline 151
;     uchar data_n = 0;
	clr R20
	xjmp L27
L26:
	.dbline 153
;     while( datatmp != 0 )
;     {
	.dbline 154
;         datatmp /= 10;
	ldi R24,10
	ldi R25,0
	ldi R26,0
	ldi R27,0
	ldd R16,y+0
	ldd R17,y+1
	ldd R18,y+2
	ldd R19,y+3
	st -y,R27
	st -y,R26
	st -y,R25
	st -y,R24
	xcall div32s
	std y+0,R16
	std y+1,R17
	std y+2,R18
	std y+3,R19
	.dbline 155
;         data_n++;
	inc R20
	.dbline 156
;     }
L27:
	.dbline 152
	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
	brne L26
X8:
	.dbline 158
; 
;     if( datalongint == 0 )
	ldd R2,y+5
	ldd R3,y+6
	ldd R4,y+7
	ldd R5,y+8
	clc
	tst R2
	cpc R3,R2
	cpc R4,R2
	cpc R5,R2
	brne L29
X9:
	.dbline 159
;     {
	.dbline 160
;         data_n = 1;
	ldi R20,1
	.dbline 161
;     }
L29:
	.dbline 163
; 
;     return data_n;
	mov R16,R20
	.dbline -2
L25:
	.dbline 0 ; func end
	adiw R28,4
	ld R20,y+
	adiw R28,4
	ret
	.dbsym r data_n 20 c
	.dbsym l datatmp 0 L
	.dbsym l datalongint 5 l
	.dbend
	.dbfunc e LCD_write_datalongint _LCD_write_datalongint fV
;      datachar2 -> y+13
;             kk -> R14
;              k -> R22
;              n -> R10
;      datachar1 -> y+5
;     datainttmp -> y+1
;              i -> R12
;        dataint -> y+35
;              c -> R20
;              r -> y+31
	.even
_LCD_write_datalongint::
	xcall push_arg4
	xcall push_xgsetF0FC
	mov R20,R18
	sbiw R28,21
	.dbline -1
	.dbline 174
; }
; 
; 
; //==========================================
; //函数名称:显示一个整型数据
; //函数作用: 在指定位置显示整数
; //入口参数: 行位置r, 列位置c, 字符数组dataint[]
; //返回类型:无
; //==========================================
; void LCD_write_datalongint( uchar r, uchar c, long int dataint )
; {
	.dbline 177
;     uchar datachar1[8];
;     uchar datachar2[8];
;     uchar n = 0;
	clr R10
	.dbline 178
;     uchar i =0;
	clr R12
	.dbline 179
;     uchar k =0;        //取字符个数
	clr R22
	.dbline 180
;     uchar kk = 0;      //取字符个数
	clr R14
	.dbline 181
; 	long int datainttmp = dataint;
	ldd R2,y+35

⌨️ 快捷键说明

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