📄 lcd.s
字号:
.dbline 114
; else y=16;
lda #16
sta 7,X
L29:
.dbline 115
; if(ln<=1) Px=0;
lda 11,X
cmp #1
bhi L31
.dbline 115
clr 8,X
bra L32
L31:
.dbline 116
; else Px=8;
lda #8
sta 8,X
L32:
.dbline 118
; //[确定有无边框(有GrE决定)]
; if(GrE==1) //有表框
lda 12,X
cmp #1
bne L33
.dbline 119
; {TBC=65535;LC=32768;RC=1;}
.dbline 119
lda #-1
sta 4,X
lda #-1
sta 5,X
.dbline 119
lda #-128
sta 2,X
lda #0
sta 3,X
.dbline 119
clra
sta ,X
lda #1
sta 1,X
.dbline 119
bra L34
L33:
.dbline 121
; else //无边框
; {TBC=0;LC=0;RC=0;}
.dbline 121
clr 5,X
clr 4,X
.dbline 121
clr 3,X
clr 2,X
.dbline 121
clr 1,X
clr ,X
.dbline 121
L34:
.dbline 122
; Wtite_Command(0b00110110);//扩展指令,绘图开
lda #54
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 124
; //[在Lcd上指定行上显示矩型边框]
; for(i=0;i<=7;i++,Px++)
clr 6,X
bra L38
L35:
.dbline 125
.dbline 126
lda 5,X
psha
lda 4,X
psha
lda 8,X
psha
lda 7,X
psha
jsr _LcdShGr16P
ais #4
tsx
.dbline 127
lda 5,X
psha
lda 4,X
psha
lda 8,X
psha
lda 7,X
add #15
psha
jsr _LcdShGr16P
ais #4
tsx
.dbline 128
L36:
.dbline 124
inc 6,X
inc 8,X
L38:
.dbline 124
lda 6,X
cmp #7
bls L35
.dbline 129
; {
; LcdShGr16P(y,Px,TBC); //显示上边框
; LcdShGr16P(y+15,Px,TBC); //显示下边框
; }
; for(i=1,y++,Px--;i<=14;i++,y++)
lda #1
sta 6,X
inc 7,X
dec 8,X
bra L42
L39:
.dbline 130
.dbline 131
lda 1,X
psha
lda ,X
psha
lda 8,X
psha
lda 7,X
psha
jsr _LcdShGr16P
ais #4
tsx
.dbline 132
lda 3,X
psha
lda 2,X
psha
lda 8,X
sub #7
psha
lda 7,X
psha
jsr _LcdShGr16P
ais #4
tsx
.dbline 133
L40:
.dbline 129
inc 6,X
inc 7,X
L42:
.dbline 129
lda 6,X
cmp #14
bls L39
.dbline 134
; {
; LcdShGr16P(y,Px,RC); //显示右边框
; LcdShGr16P(y,Px-7,LC); //显示左边框
; }
; Wtite_Command(0b00110000);//基本指令
lda #48
psha
jsr _Wtite_Command
ais #1
tsx
.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 143
; }
;
; /*LcdShGrClr:在Lcd上清图形显示屏--------------*
; *功 能:在Lcd上清图形显示屏(清GDRAM) *
; *参 数:无 *
; *返 回:无 *
; *--------------------------------------------*/
; void LcdShGrClr(void)
; {
.dbline 145
; unsigned char Px,y;//行页号,列坐标的循环变量
; Wtite_Command(0b00110110);//扩展指令,绘图开
lda #54
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 147
; //[清图形显示屏(清GDRAM)]
; for(y=0;y<=31;y++)
clr ,X
bra L47
L44:
.dbline 148
; for(Px=0;Px<=15;Px++)
clr 1,X
bra L51
L48:
.dbline 149
ldhx #0
pshx
pshh
tsx
aix #2
lda 1,X
psha
lda ,X
psha
jsr _LcdShGr16P
ais #4
tsx
L49:
.dbline 148
inc 1,X
L51:
.dbline 148
lda 1,X
cmp #15
bls L48
L45:
.dbline 147
inc ,X
L47:
.dbline 147
lda ,X
cmp #31
bls L44
.dbline 150
; 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 159
; }
;
; /*LcdShGr1P:在Lcd的指定位置上画一个点------------------*
; *功 能:在Lcd的指定位置上画一个点 *
; *参 数:y为纵坐标(0-63),x为横坐标(0-127) *
; *返 回:无 *
; *-----------------------------------------------------*/
; void LcdShGr1P(unsigned char y,unsigned char x)
; {
.dbline 160
; unsigned int value=32768;//初始值为0b1000000000000000
lda #-128
sta ,X
lda #0
sta 1,X
.dbline 161
; if(y>=32) //第三四行必须调整x和y坐标
lda 4,X
cmp #32
blo L53
.dbline 162
; {y=y-32;x=x+16*8;}
.dbline 162
sub #32
sta 4,X
.dbline 162
lda 5,X
add #-128
sta 5,X
.dbline 162
L53:
.dbline 163
; 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 164
; 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 173
; }
;
; /*LcdShGr16P:在Lcd指定位置上设置线型16个点的显示-----------*
; *功 能:在Lcd指定位置上设置线型16个点的显示 *
; *参 数:y为纵坐标(0-63),Px为页号(0-15),value为16位数据 *
; *返 回:无 *
; *---------------------------------------------------------*/
; void LcdShGr16P(unsigned char y,unsigned char Px,int value)
; {
.dbline 175
; //Wtite_Command(0b00110110); //8位数据,扩展指令,绘图开
; Wtite_Command(y|0b10000000);//设置6位绘图列地址
lda 2,X
ora #-128
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 176
; Wtite_Command(Px|0b10000000);//设置4位绘图行地址
lda 3,X
ora #-128
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 177
; Wtite_Data((unsigned char)(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 178
; Wtite_Data((unsigned char)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 189
; //Wtite_Command(0b00110000); //8位数据,基本指令
; }
;
; //===========[Lcd基本操作:包括写指令,写数据和延时]===========
; /*Wtite_Command:执行参数中的给定命令-------------------*
; *功 能:执行参数中的给定命令 *
; *参 数:command为待执行的命令码 *
; *返 回:无 *
; *-----------------------------------------------------*/
; void Wtite_Command(unsigned char command)
; {
.dbline 190
; LCD_CtrlPort&=~(1<<LCD_RS); //RS=0
bclr #1,0x2
.dbline 191
; LCD_CtrlPort&=~(1<<LCD_RW); //RW=0
bclr #2,0x2
.dbline 192
; LCD_DataPort=command; //数据上线
lda 2,X
sta 0x1
.dbline 193
; LCD_CtrlPort|=(1<<LCD_E); //E=1
bset #3,0x2
.dbline 194
; asm("nop"); //使数据稳定
nop
.dbline 195
; asm("nop");
nop
.dbline 196
; LCD_CtrlPort&=~(1<<LCD_E); //E=0,使数据有效
bclr #3,0x2
.dbline 197
; 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 206
; }
;
; /*Wtite_Data:将参数中给定的数据写入液晶控制器----------*
; *功 能:将参数中给定的数据写入液晶控制器 *
; *参 数:data为待写入的数据 *
; *返 回:无 *
; *-----------------------------------------------------*/
; void Wtite_Data(unsigned char data)
; {
.dbline 207
; LCD_CtrlPort|=(1<<LCD_RS); //RS=1
bset #1,0x2
.dbline 208
; LCD_CtrlPort&=~(1<<LCD_RW); //RW=0
bclr #2,0x2
.dbline 209
; LCD_DataPort=data; //数据上线
lda 2,X
sta 0x1
.dbline 210
; LCD_CtrlPort|=(1<<LCD_E); //E=1
bset #3,0x2
.dbline 211
; asm("nop"); //使数据稳定
nop
.dbline 212
; asm("nop");
nop
.dbline 213
; LCD_CtrlPort&=~(1<<LCD_E); //E=0,使数据有效
bclr #3,0x2
.dbline 214
; 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 223
; }
;
; /*DelayTimes:延时指定时间---------------*
; *功 能:延时指定的时间 *
; *入 口:tn为延时时间数(0到65535) *
; *出 口:无 *
; *--------------------------------------*/
; void DelayTimes(unsigned int tn)
; {
.dbline 225
clr 1,X
clr ,X
bra L62
L59:
.dbline 225
L60:
.dbline 225
lda 1,X
add #1
sta 1,X
lda ,X
adc #0
sta ,X
L62:
.dbline 225
; unsigned int 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -