📄 lcd.s
字号:
.dbline -2
L27:
ais #9
.dbline 0 ; func end
rts
.dbsym l RC 0 I
.dbsym l LC 2 I
.dbsym l TBC 4 I
.dbsym l i 6 c
.dbsym l y 7 c
.dbsym l Px 8 c
.dbsym l GrE 12 c
.dbsym l ln 11 c
.dbend
.dbfunc e LcdShGrClr _LcdShGrClr fV
; y -> 0,X
; Px -> 1,X
_LcdShGrClr::
.dbline -1
ais #-2
tsx
.dbline 149
; }
;
; /*LcdShGrClr:在Lcd上清图形显示屏-------------------------------------------*
; *功 能:在Lcd上清图形显示屏(清GDRAM) *
; *参 数:无 *
; *返 回:无 *
; *-------------------------------------------------------------------------*/
; void LcdShGrClr(void)
; {
.dbline 151
; INT8U Px,y; //行页号,列坐标的循环变量
; Wtite_Command(0b00110110);//扩展指令,绘图开
lda #54
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 153
; //[清图形显示屏(清GDRAM)]
; for(y=0;y<=31;y++)
clr ,X
bra L47
L44:
.dbline 154
; for(Px=0;Px<=15;Px++)
clr 1,X
bra L51
L48:
.dbline 155
ldhx #0
pshx
pshh
tsx
aix #2
lda 1,X
psha
lda ,X
psha
jsr _LcdShGr16P
ais #4
tsx
L49:
.dbline 154
inc 1,X
L51:
.dbline 154
lda 1,X
cmp #15
bls L48
L45:
.dbline 153
inc ,X
L47:
.dbline 153
lda ,X
cmp #31
bls L44
.dbline 156
; LcdShGr16P(y,Px,0); //写入0为清屏
; Wtite_Command(0b00110000);//基本指令
lda #48
psha
jsr _Wtite_Command
ais #1
tsx
.dbline -2
L43:
ais #2
.dbline 0 ; func end
rts
.dbsym l y 0 c
.dbsym l Px 1 c
.dbend
.dbfunc e LcdShGr1P _LcdShGr1P fV
; value -> 0,X
; x -> 5,X
; y -> 4,X
_LcdShGr1P::
.dbline -1
ais #-2
tsx
.dbline 165
; }
;
; /*LcdShGr1P:在Lcd的指定位置上画一个点--------------------------------------*
; *功 能:在Lcd的指定位置上画一个点 *
; *参 数:y为纵坐标(0-63),x为横坐标(0-127) *
; *返 回:无 *
; *-------------------------------------------------------------------------*/
; void LcdShGr1P(INT8U y,INT8U x)
; {
.dbline 166
; INT16U value=32768; //初始值为0b1000000000000000
lda #-128
sta ,X
lda #0
sta 1,X
.dbline 167
; if(y>=32) //第三四行必须调整x和y坐标
lda 4,X
cmp #32
blo L53
.dbline 168
; {y=y-32;x=x+16*8;}
.dbline 168
sub #32
sta 4,X
.dbline 168
lda 5,X
add #-128
sta 5,X
.dbline 168
L53:
.dbline 169
; value>>=(x-x/16*16); //写入的16位数据
clr *__r0
lda 5,X
sta *__rlo
mov *__r0,*__rhi
lda #16
psha
clra
psha
jsr __divmod16s
ais #2
mov *__rhi,*__r0
mov *__rlo,*__r1
lda #4
X5:
lsl *__r1
rol *__r0
dbnza X5
clr *__r2
lda 5,X
sub *__r1
sta *__r1
lda *__r2
sbc *__r0
lda *__r1
and #15
beq X7
X6:
lsr ,X
ror 1,X
dbnza X6
X7:
.dbline 170
; LcdShGr16P(y,x/16,value);//显示相应的点
lda 1,X
psha
lda ,X
psha
lda 5,X
ldx #16
clrh
div
tsx
aix #2
psha
lda 4,X
psha
jsr _LcdShGr16P
ais #4
tsx
.dbline -2
L52:
ais #2
.dbline 0 ; func end
rts
.dbsym l value 0 i
.dbsym l x 5 c
.dbsym l y 4 c
.dbend
.dbfunc e LcdShGr16P _LcdShGr16P fV
; value -> 4,X
; Px -> 3,X
; y -> 2,X
_LcdShGr16P::
.dbline -1
tsx
.dbline 179
; }
;
; /*LcdShGr16P:在Lcd指定位置上设置线型16个点的显示---------------------------*
; *功 能:在Lcd指定位置上设置线型16个点的显示 *
; *参 数:y为纵坐标(0-63),Px为页号(0-15),value为16位数据 *
; *返 回:无 *
; *-------------------------------------------------------------------------*/
; void LcdShGr16P(INT8U y,INT8U Px,INT16S value)
; {
.dbline 181
; //Wtite_Command(0b00110110); //8位数据,扩展指令,绘图开
; Wtite_Command(y|0b10000000);//设置6位绘图列地址
lda 2,X
ora #-128
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 182
; Wtite_Command(Px|0b10000000);//设置4位绘图行地址
lda 3,X
ora #-128
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 183
; Wtite_Data((INT8U)(value>>8));//写入高8个字节
lda 4,X
sta *__r1
clr *__r0
tst *__r1
bpl X8
com *__r0
X8:
lda *__r1
psha
jsr _Wtite_Data
ais #1
tsx
.dbline 184
; Wtite_Data((INT8U)value); //写入低8个字节
lda 5,X
psha
jsr _Wtite_Data
ais #1
tsx
.dbline -2
L55:
.dbline 0 ; func end
rts
.dbsym l value 4 I
.dbsym l Px 3 c
.dbsym l y 2 c
.dbend
.dbfunc e Wtite_Command _Wtite_Command fV
; command -> 2,X
_Wtite_Command::
.dbline -1
tsx
.dbline 195
; //Wtite_Command(0b00110000); //8位数据,基本指令
; }
;
; /*===============[Lcd基本操作:包括写指令,写数据和延时]===================*/
; /*Wtite_Command:执行参数中的给定命令---------------------------------------*
; *功 能:执行参数中的给定命令 *
; *参 数:command为待执行的命令码 *
; *返 回:无 *
; *-------------------------------------------------------------------------*/
; void Wtite_Command(INT8U command)
; {
.dbline 196
; LCD_CtrlPort&=~(1<<LCD_RS); //RS=0
bclr #1,0x2
.dbline 197
; LCD_CtrlPort&=~(1<<LCD_RW); //RW=0
bclr #2,0x2
.dbline 198
; LCD_DataPort=command; //数据上线
lda 2,X
sta 0x1
.dbline 199
; LCD_CtrlPort|=(1<<LCD_E); //E=1
bset #3,0x2
.dbline 200
; asm("nop"); //使数据稳定
nop
.dbline 201
; asm("nop");
nop
.dbline 202
; LCD_CtrlPort&=~(1<<LCD_E); //E=0,使数据有效
bclr #3,0x2
.dbline 203
; delay72us; //延时>72us
ldhx #30
pshx
pshh
jsr _DelayTimes
ais #2
tsx
.dbline -2
L56:
.dbline 0 ; func end
rts
.dbsym l command 2 c
.dbend
.dbfunc e Wtite_Data _Wtite_Data fV
; data -> 2,X
_Wtite_Data::
.dbline -1
tsx
.dbline 212
; }
;
; /*Wtite_Data:将参数中给定的数据写入液晶控制器------------------------------*
; *功 能:将参数中给定的数据写入液晶控制器 *
; *参 数:data为待写入的数据 *
; *返 回:无 *
; *-------------------------------------------------------------------------*/
; void Wtite_Data(INT8U data)
; {
.dbline 213
; LCD_CtrlPort|=(1<<LCD_RS); //RS=1
bset #1,0x2
.dbline 214
; LCD_CtrlPort&=~(1<<LCD_RW); //RW=0
bclr #2,0x2
.dbline 215
; LCD_DataPort=data; //数据上线
lda 2,X
sta 0x1
.dbline 216
; LCD_CtrlPort|=(1<<LCD_E); //E=1
bset #3,0x2
.dbline 217
; asm("nop"); //使数据稳定
nop
.dbline 218
; asm("nop");
nop
.dbline 219
; LCD_CtrlPort&=~(1<<LCD_E); //E=0,使数据有效
bclr #3,0x2
.dbline 220
; delay72us; //延时>72us
ldhx #30
pshx
pshh
jsr _DelayTimes
ais #2
tsx
.dbline -2
L57:
.dbline 0 ; func end
rts
.dbsym l data 2 c
.dbend
.dbfunc e DelayTimes _DelayTimes fV
; i -> 0,X
; tn -> 4,X
_DelayTimes::
.dbline -1
ais #-2
tsx
.dbline 229
; }
;
; /*DelayTimes:延时指定时间--------------------------------------------------*
; *功 能:延时指定的时间 *
; *入 口:tn为延时时间数(0到65535) *
; *出 口:无 *
; *-------------------------------------------------------------------------*/
; void DelayTimes(INT16U tn)
; {
.dbline 231
clr 1,X
clr ,X
bra L62
L59:
.dbline 231
L60:
.dbline 231
lda 1,X
add #1
sta 1,X
lda ,X
adc #0
sta ,X
L62:
.dbline 231
; INT16U i; //循环变量
; for(i=0;i<tn;i++);
lda 5,X
sta *__r1
lda 4,X
sta *__r0
lda 1,X
sta *__r3
lda ,X
sta *__r2
ldhx *__r2
cphx *__r0
tsx
blo L59
.dbline -2
L58:
ais #2
.dbline 0 ; func end
rts
.dbsym l i 0 i
.dbsym l tn 4 i
.dbend
.dbfunc e LcdShBigNum _LcdShBigNum fV
; GBit -> 0,X
; SBit -> 1,X
; BBit -> 2,X
; Yi -> 3,X
; Num -> 10,X
; BigNumCodeAdrr -> 8,X
; X -> 7,X
; Y -> 6,X
_LcdShBigNum::
.dbline -1
ais #-4
tsx
.dbline 244
; }
;
; //其他特殊功能函数
; //LcdShBigNum:在Lcd上显示自定义32*16点阵的数字(0--999)---------------------*
; //功 能:在Lcd上显示自定义32*16点阵的数字(0--999) *
; //参 数:X表示Lcd上显示字符的横坐标(0--5),Y为显示字符的纵坐标(0--1) *
; // BigNumCodeAdrr为32*16点阵数字编码首地址,Num为当前的数据值(0--999) *
; //返 回:无 *
; //内部调用:LcdShGr16P:在Lcd指定位置上设置线型16个点的显示 *
; // Wtite_Command:执行参数中的给定命令 *
; //-------------------------------------------------------------------------*
; void LcdShBigNum(INT8U Y,INT8U X,INT16U * BigNumCodeAdrr,INT16U Num)
; {
.dbline 247
lda 6,X
cmp #1
bhi L67
lda 7,X
cmp #5
bhi L67
lda 11,X
sta *__r1
lda 10,X
sta *__r0
ldhx *__r0
cphx #999
tsx
bls L64
L67:
.dbline 247
; INT8U GBit,SBit,BBit; //存放个位,十位,百位数据
; INT8U Yi; //Y坐标方向的循环控制变量
; if(Y>1||X>5||Num>999) goto LcdShBigNum_End; //参数值范围检测
jmp L68
L64:
.dbline 248
; GBit=Num%10; BBit=Num/100; SBit=(Num%100)/10;
lda 11,X
sta *__rlo
lda 10,X
sta *__rhi
lda #10
psha
clra
psha
jsr __divmod16u
pula
pula
sta ,X
.dbline 248
lda 11,X
sta *__rlo
lda 10,X
sta *__rhi
lda #100
psha
clra
psha
jsr __divmod16u
ais #2
mov *__rlo,*__r1
lda *__r1
sta 2,X
.dbline 248
lda 11,X
sta *__rlo
lda 10,X
sta *__rhi
lda #100
psha
clra
psha
jsr __divmod16u
pula
sta *__r0
pula
sta *__rlo
mov *__r0,*__rhi
lda #10
psha
clra
psha
jsr __divmod16u
ais #2
mov *__rlo,*__r1
lda *__r1
sta 1,X
.dbline 249
; Wtite_Command(0b00110110); //扩展指令,绘图开
lda #54
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 250
; if(Y==1) X+=8; //参数调整
lda 6,X
cmp #1
bne L69
.dbline 250
lda 7,X
add #8
sta 7,X
L69:
.dbline 251
; for(Yi=0;Yi<32;Yi++)
clr 3,X
jmp L74
L71:
.dbline 252
; {
.dbline 253
; if(BBit!=0) LcdShGr16P(Yi,X,*(BigNumCodeAdrr+BBit*32+Yi));
lda 2,X
beq L75
.dbline 253
clr *__r0
sta *__r1
lda #5
X9:
lsl *__r1
rol *__r0
dbnza X9
lsl *__r1
rol *__r0
lda *__r1
add 9,X
sta *__r1
lda *__r0
adc 8,X
sta *__r0
clr *__r2
lda 3,X
sta *__r3
lsl *__r3
rol *__r2
lda *__r3
add *__r1
sta *__r1
lda *__r2
adc *__r0
sta *__r0
ldhx *__r0
lda 1,x
sta *__r1
lda ,x
tsx
sta *__r0
lda *__r1
psha
lda *__r0
psha
lda 7,X
psha
lda 3,X
psha
jsr _LcdShGr16P
ais #4
tsx
bra L76
L75:
.dbline 254
; else LcdShGr16P(Yi,X,0x0000);
ldhx #0
pshx
pshh
tsx
aix #2
lda 7,X
psha
lda 3,X
psha
jsr _LcdShGr16P
ais #4
tsx
L76:
.dbline 256
lda 1,X
bne L79
lda 2,X
beq L77
L79:
.dbline 256
;
; if((SBit!=0) ||(BBit!=0)) LcdShGr16P(Yi,X+1,*(BigNumCodeAdrr+SBit*32+Yi));
clr *__r0
lda 1,X
sta *__r1
lda #5
X10:
lsl *__r1
rol *__r0
dbnza X10
lsl *__r1
rol *__r0
lda *__r1
add 9,X
sta *__r1
lda *__r0
adc 8,X
sta *__r0
clr *__r2
lda 3,X
sta *__r3
lsl *__r3
rol *__r2
lda *__r3
add *__r1
sta *__r1
lda *__r2
adc *__r0
sta *__r0
ldhx *__r0
lda 1,x
sta *__r1
lda ,x
tsx
sta *__r0
lda *__r1
psha
lda *__r0
psha
lda 7,X
add #1
psha
lda 3,X
psha
jsr _LcdShGr16P
ais #4
tsx
bra L78
L77:
.dbline 257
; else LcdShGr16P(Yi,X,0x0000);
ldhx #0
pshx
pshh
tsx
aix #2
lda 7,X
psha
lda 3,X
psha
jsr _LcdShGr16P
ais #4
tsx
L78:
.dbline 258
clr *__r0
lda ,X
sta *__r1
lda #5
X11:
lsl *__r1
rol *__r0
dbnza X11
lsl *__r1
rol *__r0
lda *__r1
add 9,X
sta *__r1
lda *__r0
adc 8,X
sta *__r0
clr *__r2
lda 3,X
sta *__r3
lsl *__r3
rol *__r2
lda *__r3
add *__r1
sta *__r1
lda *__r2
adc *__r0
sta *__r0
ldhx *__r0
lda 1,x
sta *__r1
lda ,x
tsx
sta *__r0
lda *__r1
psha
lda *__r0
psha
lda 7,X
add #2
psha
lda 3,X
psha
jsr _LcdShGr16P
ais #4
tsx
.dbline 259
L72:
.dbline 251
inc 3,X
L74:
.dbline 251
lda 3,X
cmp #32
bhs X12
jmp L71
X12:
.dbline 260
; LcdShGr16P(Yi,X+2,*(BigNumCodeAdrr+GBit*32+Yi));
; }
; Wtite_Command(0b00110000); //基本指令
lda #48
psha
jsr _Wtite_Command
ais #1
tsx
L68:
.dbline 261
; LcdShBigNum_End:;
.dbline -2
L63:
ais #4
.dbline 0 ; func end
rts
.dbsym l GBit 0 c
.dbsym l SBit 1 c
.dbsym l BBit 2 c
.dbsym l Yi 3 c
.dbsym l Num 10 i
.dbsym l BigNumCodeAdrr 8 pi
.dbsym l X 7 c
.dbsym l Y 6 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -