📄 lcddrive.s
字号:
.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 + -