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

📄 lcddrive.s

📁 AVR-MEGA8单片机中使用AD转换的一个例子
💻 S
📖 第 1 页 / 共 2 页
字号:
	.dbline 141
; 
; 	LCD_COM =0x06;//DDRAM的地址计数器(AC)加1
	ldi R24,6
	sts _LCD_COM,R24
	.dbline 142
; 	Write_LCD_Com();//调用写指令子程序
	rcall _Write_LCD_Com
	.dbline 143
; 	Delay(5);//39uS
	ldi R16,5
	ldi R17,0
	rcall _Delay
	.dbline 145
; 
; 	AC_X=1;AC_Y=1;
	ldi R24,1
	sts _AC_X,R24
	.dbline 145
	sts _AC_Y,R24
	.dbline -2
L39:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_Contrl_Cursor _LCD_Contrl_Cursor fV
;             ON -> R10
	.even
_LCD_Contrl_Cursor::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 149
; }
; 
; void LCD_Contrl_Cursor(uchar ON)		//打开游标显示
; { 
	.dbline 150
; 	if (ON) LCD_COM =0x0F;else LCD_COM=0x0C;	//ON:显示打开,光标开,反白显示
	tst R10
	breq L41
X10:
	.dbline 150
	ldi R24,15
	sts _LCD_COM,R24
	rjmp L42
L41:
	.dbline 150
	ldi R24,12
	sts _LCD_COM,R24
L42:
	.dbline 151
; 	Write_LCD_Com();//调用写指令子程序
	rcall _Write_LCD_Com
	.dbline 152
; 	Delay(5);//39uS
	ldi R16,5
	ldi R17,0
	rcall _Delay
	.dbline -2
L40:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r ON 10 c
	.dbend
	.dbfunc e DispSetCursor _DispSetCursor fV
;              y -> R12
;              x -> R10
	.even
_DispSetCursor::
	st -y,R10
	st -y,R12
	mov R12,R18
	mov R10,R16
	.dbline -1
	.dbline 158
; }
; 
; void DispSetCursor(uchar x,uchar y)	//设置光标到指定位置
; //x:串首字符在LCD屏幕上列的位置(水平位置) 0<=x<=7  
; //y:串首字符在LCD屏幕上行的位置(垂直位置) 0<=y<=3 
; {
	.dbline 159
;    LCD_COM=CharMap[y][x];		//查表得到DDRAM地址AC
	ldi R24,<_CharMap
	ldi R25,>_CharMap
	mov R2,R12
	clr R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	add R2,R24
	adc R3,R25
	mov R30,R10
	clr R31
	add R30,R2
	adc R31,R3
	lpm R2,Z
	sts _LCD_COM,R2
	.dbline 160
;    Write_LCD_Com();
	rcall _Write_LCD_Com
	.dbline -2
L43:
	.dbline 0 ; func end
	ld R12,y+
	ld R10,y+
	ret
	.dbsym r y 12 c
	.dbsym r x 10 c
	.dbend
	.dbfunc e DispHalfWord _DispHalfWord fV
;             HH -> <dead>
;           LASC -> y+4
;           HASC -> y+2
;              y -> R12
;              x -> R10
	.even
_DispHalfWord::
	st -y,R10
	st -y,R12
	mov R12,R18
	mov R10,R16
	.dbline -1
	.dbline 164
; }
; 
; void DispHalfWord(uchar x,uchar y,uchar HASC,uchar LASC)	//在指定位置处显示半角ASCII字符	
; {	
	.dbline 166
; 	unsigned int HH;
; 	LCD_COM=CharMap[y][x];		//查表得到DDRAM地址AC
	ldi R24,<_CharMap
	ldi R25,>_CharMap
	mov R2,R12
	clr R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	lsl R2
	rol R3
	add R2,R24
	adc R3,R25
	mov R30,R10
	clr R31
	add R30,R2
	adc R31,R3
	lpm R2,Z
	sts _LCD_COM,R2
	.dbline 167
; 	Write_LCD_Com();
	rcall _Write_LCD_Com
	.dbline 169
; 	
; 	LCD_DAT=HASC;
	ldd R0,y+2
	sts _LCD_DAT,R0
	.dbline 170
; 	Write_LCD_Data();	//显示ASCII字符
	rcall _Write_LCD_Data
	.dbline 171
; 	LCD_DAT=LASC;
	ldd R0,y+4
	sts _LCD_DAT,R0
	.dbline 172
; 	Write_LCD_Data();	//显示ASCII字符
	rcall _Write_LCD_Data
	.dbline -2
L44:
	.dbline 0 ; func end
	ld R12,y+
	ld R10,y+
	ret
	.dbsym l HH 1 i
	.dbsym l LASC 4 c
	.dbsym l HASC 2 c
	.dbsym r y 12 c
	.dbsym r x 10 c
	.dbend
	.dbfunc e PrintS _PrintS fV
;             Ty -> R10
;             Tx -> R20
;              i -> R22
;            str -> R12,R13
;              y -> R20
;              x -> R14
	.even
_PrintS::
	rcall push_xgsetF0FC
	mov R20,R18
	mov R14,R16
	sbiw R28,3
	ldd R12,y+13
	ldd R13,y+14
	.dbline -1
	.dbline 180
; }
; 
; //**************************************在指定位置处打印ASCII字符串**********************************
; //x:串首字符在LCD屏幕上列的位置(水平位置) 0<=x<=7  
; //y:串首字符在LCD屏幕上行的位置(垂直位置) 0<=y<=3 
; //*str:存放ASCII字符串的指针
; void PrintS(uchar x,uchar y,uchar *str)		//在指定位置打印字符串
; {
	.dbline 183
; 	uchar i,Tx,Ty;
; //	EA=0;
; 	Ty=y;Tx=x;
	mov R10,R20
	.dbline 183
	mov R20,R14
	.dbline 184
; 	for(i=0;str[i]!='\0';i=i+2)
	clr R22
	rjmp L49
L46:
	.dbline 185
; 	{
	.dbline 186
; 		DispHalfWord(Tx,Ty,str[i],str[i+1]);
	mov R2,R22
	clr R3
	add R2,R12
	adc R3,R13
	movw R30,R2
	ldd R2,z+1
	std y+2,R2
	ldd R2,z+0
	std y+0,R2
	mov R18,R10
	mov R16,R20
	rcall _DispHalfWord
	.dbline 187
; 		Tx++;
	inc R20
	.dbline 188
; 		if (Tx>=8) { Ty=(Ty+1)&0x03;Tx=0; }
	cpi R20,8
	brlo L50
X11:
	.dbline 188
	.dbline 188
	mov R24,R10
	subi R24,255    ; addi 1
	andi R24,3
	mov R10,R24
	.dbline 188
	clr R20
	.dbline 188
L50:
	.dbline 189
; 	}
L47:
	.dbline 184
	subi R22,254    ; addi 2
L49:
	.dbline 184
	mov R30,R22
	clr R31
	add R30,R12
	adc R31,R13
	ldd R2,z+0
	tst R2
	brne L46
X12:
	.dbline -2
L45:
	.dbline 0 ; func end
	adiw R28,3
	rjmp pop_xgsetF0FC
	.dbsym r Ty 10 c
	.dbsym r Tx 20 c
	.dbsym r i 22 c
	.dbsym r str 12 pc
	.dbsym r y 20 c
	.dbsym r x 14 c
	.dbend
	.dbfunc e PrintSLen _PrintSLen fV
;             Ty -> R10
;             Tx -> R22
;              i -> R20
;            Len -> R12
;            str -> R14,R15
;              y -> R22
;              x -> R20
	.even
_PrintSLen::
	rcall push_xgsetF0FC
	mov R22,R18
	mov R20,R16
	sbiw R28,3
	ldd R14,y+13
	ldd R15,y+14
	ldd R12,y+15
	.dbline -1
	.dbline 201
; //	EA=1;
; }
; 
; 
; 
; //**************************************在指定位置打印指定长度字符串**********************************
; //x:串首字符在LCD屏幕上列的位置(水平位置) 0<=x<=7  
; //y:串首字符在LCD屏幕上行的位置(垂直位置) 0<=y<=3 
; //*str:存放ASCII字符串的指针
; //Len:字符串的长度,字节为单位
; void PrintSLen(uchar x,uchar y,uchar *str,uchar Len)		//在指定位置打印字符串
; {
	.dbline 203
; 	uchar i,Tx,Ty;
; 	Ty=y;Tx=x;
	mov R10,R22
	.dbline 203
	mov R22,R20
	.dbline 204
; 	for(i=0;i<Len;i=i+2)
	clr R20
	rjmp L56
L53:
	.dbline 205
; 	{
	.dbline 206
; 	 	if((Len-i)==1) DispHalfWord(Tx,Ty,str[i],'\0'); else DispHalfWord(Tx,Ty,str[i],str[i+1]);
	mov R24,R12
	sub R24,R20
	cpi R24,1
	brne L57
X13:
	.dbline 206
	clr R2
	std y+2,R2
	mov R30,R20
	clr R31
	add R30,R14
	adc R31,R15
	ldd R2,z+0
	std y+0,R2
	mov R18,R10
	mov R16,R22
	rcall _DispHalfWord
	rjmp L58
L57:
	.dbline 206
	mov R2,R20
	clr R3
	add R2,R14
	adc R3,R15
	movw R30,R2
	ldd R2,z+1
	std y+2,R2
	ldd R2,z+0
	std y+0,R2
	mov R18,R10
	mov R16,R22
	rcall _DispHalfWord
L58:
	.dbline 207
; 		Tx++;
	inc R22
	.dbline 208
; 		if (Tx>=8) { Ty=(Ty+1)&0x03;Tx=0; }
	cpi R22,8
	brlo L59
X14:
	.dbline 208
	.dbline 208
	mov R24,R10
	subi R24,255    ; addi 1
	andi R24,3
	mov R10,R24
	.dbline 208
	clr R22
	.dbline 208
L59:
	.dbline 209
; 	}
L54:
	.dbline 204
	subi R20,254    ; addi 2
L56:
	.dbline 204
	cp R20,R12
	brlo L53
X15:
	.dbline -2
L52:
	.dbline 0 ; func end
	adiw R28,3
	rjmp pop_xgsetF0FC
	.dbsym r Ty 10 c
	.dbsym r Tx 22 c
	.dbsym r i 20 c
	.dbsym r Len 12 c
	.dbsym r str 14 pc
	.dbsym r y 22 c
	.dbsym r x 20 c
	.dbend
	.dbfunc e DisplayNumChar _DisplayNumChar fV
;          srnum -> R12
;          tnnum -> R22
;          hunum -> R20
;          knnum -> R14
;             ll -> R22,R23
;              h -> R10
;              l -> y+13
	.even
_DisplayNumChar::
	rcall push_arg4
	rcall push_xgsetF0FC
	mov R10,R18
	sbiw R28,3
	ldd R22,y+17
	ldd R23,y+18
	.dbline -1
	.dbline 215
; //	EA=1;
; }
; 
; 
; void DisplayNumChar(unsigned char l,unsigned char h,unsigned int ll)
; {
	.dbline 217
;   unsigned char knnum,hunum,tnnum,srnum;  //百、十、个位
;   knnum=ll/1000;
	ldi R18,1000
	ldi R19,3
	movw R16,R22
	rcall div16u
	mov R14,R16
	.dbline 218
;   hunum=ll/100-10*knnum; 	//百位
	ldi R24,10
	mul R24,R14
	movw R2,R0
	ldi R18,100
	ldi R19,0
	movw R16,R22
	rcall div16u
	mov R20,R16
	sub R20,R2
	sbc R21,R3
	.dbline 219
;   srnum=ll%10;		//个位
	ldi R18,10
	ldi R19,0
	movw R16,R22
	rcall mod16u
	mov R12,R16
	.dbline 220
;   tnnum=(ll-knnum*1000-hunum*100)/10; //十位
	mov R18,R14
	clr R19
	ldi R16,1000
	ldi R17,3
	rcall empy16s
	movw R2,R16
	movw R16,R22
	sub R16,R2
	sbc R17,R3
	ldi R24,100
	mul R24,R20
	sub R16,R0
	sbc R17,R1
	ldi R18,10
	ldi R19,0
	rcall div16u
	mov R22,R16
	.dbline 222
;   
;   knnum+=0x30;hunum+=0x30;srnum+=0x30;tnnum+=0x30;
	mov R24,R14
	subi R24,208    ; addi 48
	mov R14,R24
	.dbline 222
	subi R20,208    ; addi 48
	.dbline 222
	mov R24,R12
	subi R24,208    ; addi 48
	mov R12,R24
	.dbline 222
	subi R22,208    ; addi 48
	.dbline 223
;   DispHalfWord(l,h,knnum,hunum);
	std y+2,R20
	std y+0,R14
	mov R18,R10
	ldd R16,y+13
	rcall _DispHalfWord
	.dbline 224
;   DispHalfWord(l+1,h,tnnum,srnum);
	std y+2,R12
	std y+0,R22
	mov R18,R10
	ldd R16,y+13
	subi R16,255    ; addi 1
	rcall _DispHalfWord
	.dbline -2
L61:
	.dbline 0 ; func end
	adiw R28,3
	rcall pop_xgsetF0FC
	adiw R28,4
	ret
	.dbsym r srnum 12 c
	.dbsym r tnnum 22 c
	.dbsym r hunum 20 c
	.dbsym r knnum 14 c
	.dbsym r ll 22 i
	.dbsym r h 10 c
	.dbsym l l 13 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\学习\AVRpro\Mega8程序\TestADC\LCDDrive.C
_AC_Y::
	.blkb 1
	.dbsym e AC_Y _AC_Y c
_AC_X::
	.blkb 1
	.dbsym e AC_X _AC_X c
_LCD_DAT::
	.blkb 1
	.dbsym e LCD_DAT _LCD_DAT c
_LCD_COM::
	.blkb 1
	.dbsym e LCD_COM _LCD_COM c
; }

⌨️ 快捷键说明

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