📄 lcd.s
字号:
.module LCD.c
.area text
.dbfile LCD.c
.dbfunc e LCDInit _LCDInit fV
_LCDInit::
.dbline -1
.dbline 34
; /*-------------------------------------------------------------------------*
; *文件描述:本文件包含了液晶显示相关子程序,分别为: *
; *(1)Lcdinit:液晶初始化子程序 *
; *(2)LcdShCh:在液晶显示屏上显示字符数据 *
; *(3)LcdShGrRe:在Lcd的指定行上显示或取消矩型边框 *
; *(4)LcdShGrCil:在Lcd上显示或取消空心圆型 *
; *-------------------------------------------------------------------------*/
;
; //包含头文件
; #include "LCD.h" //Lcd头文件
;
; //定义延时子程序
; #define delay1600us DelayTimes(4000) //延时>1.6ms
; #define delay72us DelayTimes(30) //延时>72us
; #define delay40ms DelayTimes(10000) //延时>40ms
;
; //内部调用函数声明
; //在Lcd指定位置上设置线型16个点的显示
; void LcdShGr16P(INT8U,INT8U,INT16S);
; //在Lcd指定位置上画1个点
; void LcdShGr1P(INT8U,INT8U);
; void DelayTimes(INT16U); //延时指定时间
; void Wtite_Command(INT8U); //将控制命令写入Lcd
; void Wtite_Data(INT8U); //将数据写入Lcd
; void LcdShGrClr(void); //在Lcd上清图形显示屏
;
; /*===========================[Lcd初始化操作]==============================*/
; //Lcdinit:初始化液晶-------------------------------------------------------*
; //功 能:初始化液晶,设置显示方式,清屏、C自动+1 *
; //参 数:无 *
; //返 回:无 *
; //-------------------------------------------------------------------------*
; void LCDInit(void)
; {
.dbline 37
; /*控制口高四位设置为输出*/
; // LCD_CtrlPort|=1<<LCD_BL;//BL=1,关掉背光
; LCD_CtrlPortDDR|=(1<<LCD_RS);//RS的方向为输出
bset #1,0x6
.dbline 38
; LCD_CtrlPortDDR|=(1<<LCD_RW);//RW的方向为输出
bset #2,0x6
.dbline 39
; LCD_CtrlPortDDR|=(1<<LCD_E); // E的方向为输出
bset #3,0x6
.dbline 40
; LCD_CtrlPortDDR|=(1<<LCD_BL);//BL的方向为输出
bset #4,0x6
.dbline 42
; //数据口设置为输出
; LCD_DataPortDDR=0xff;
lda #-1
sta 0x5
.dbline 44
; //[Lcd初始化]
; delay40ms; //延时>40ms
ldhx #10000
pshx
pshh
jsr _DelayTimes
ais #2
.dbline 45
; Wtite_Command(0b00110000); //8位数据,基本指令
lda #48
psha
jsr _Wtite_Command
ais #1
.dbline 46
; Wtite_Command(0b00001100); //开显示
lda #12
psha
jsr _Wtite_Command
ais #1
.dbline 47
; Wtite_Command(0b00000001); //清屏
lda #1
psha
jsr _Wtite_Command
ais #1
.dbline 48
; delay1600us; //延时>1.6ms
ldhx #4000
pshx
pshh
jsr _DelayTimes
ais #2
.dbline 49
; Wtite_Command(0b00000110); //进入模式设定
lda #6
psha
jsr _Wtite_Command
ais #1
.dbline 50
; LcdShGrClr(); //清Lcd图形显示屏
jsr _LcdShGrClr
tsx
.dbline -2
L1:
.dbline 0 ; func end
rts
.dbend
.dbfunc e LcdShCh _LcdShCh fV
; i -> 0,X
; LcdSBuff -> 3,X
_LcdShCh::
.dbline -1
ais #-1
tsx
.dbline 61
; // LCD_CtrlPort&=~(1<<LCD_BL);//BL=0,打开背光
; }
;
; /*=======================[Lcd显示字符操作]================================*/
; /*LcdShCh:在液晶显示屏上显示字符数据---------------------------------------*
; *功 能:在液晶显示屏上显示以LcdSBuff为首地址的64个数据 *
; *参 数:待显示的64个数据的首地址 *
; *返 回:无 *
; *-------------------------------------------------------------------------*/
; void LcdShCh(INT8U *LcdSBuff)
; {
.dbline 64
; unsigned char i; //data数组计数器(0-63)
; //[Lcd显示64个数据]
; Wtite_Command(0x80); //DDRAM地址设置
lda #-128
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 65
; for(i=0;i<64;i++) //显示data中的64个数据
clr ,X
bra L6
L3:
.dbline 66
; {
.dbline 68
; //[Lcd按行显示16个数据]
; if((i<=15)||(i>=48)) //第一行和第四行不变
lda ,X
cmp #15
bls L9
cmp #48
blo L7
L9:
.dbline 69
; Wtite_Data(LcdSBuff[i]);
clr *__r0
lda ,X
add 4,X
sta *__r1
lda *__r0
adc 3,X
sta *__r0
ldhx *__r0
lda ,x
psha
jsr _Wtite_Data
ais #1
tsx
bra L8
L7:
.dbline 70
; else if(i<=31) //显示的第二行为缓冲的第三行
lda ,X
cmp #31
bhi L10
.dbline 71
; Wtite_Data(LcdSBuff[i+16]);
clr *__r0
add 4,X
sta *__r1
lda *__r0
adc 3,X
sta *__r0
ldhx *__r0
aix #16
lda ,x
psha
jsr _Wtite_Data
ais #1
tsx
bra L11
L10:
.dbline 73
; else //显示的第三行为缓冲的第二行
; Wtite_Data(LcdSBuff[i-16]);
clr *__r0
lda ,X
sub #16
sta *__r1
lda *__r0
sbc #0
sta *__r0
lda *__r1
add 4,X
sta *__r1
lda *__r0
adc 3,X
sta *__r0
ldhx *__r0
lda ,x
psha
jsr _Wtite_Data
ais #1
tsx
L11:
L8:
.dbline 74
L4:
.dbline 65
inc ,X
L6:
.dbline 65
lda ,X
cmp #64
blo L3
.dbline -2
L2:
ais #1
.dbline 0 ; func end
rts
.dbsym l i 0 c
.dbsym l LcdSBuff 3 pc
.dbend
.dbfunc e LcdShGrCil _LcdShGrCil fV
; y -> 0,X
; mistake -> 1,X
; x -> 5,X
; GrE -> 12,X
; GrCilMV -> 11,X
; CR -> 10,X
; Cx -> 9,X
; Cy -> 8,X
_LcdShGrCil::
.dbline -1
ais #-6
tsx
.dbline 87
; }
; }
;
; /*===[Lcd画图操作:包括画圆,画矩形框,图形清屏,画点等]===================*/
; /*LcdShGrCil:在Lcd上显示或取消空心圆型-------------------------------------*
; *功 能:在Lcd上的指定位置显示或取消空心圆型 *
; *参 数:Cx为圆心横坐标,Cy为圆心纵坐标 *
; * CR为圆的半径,GrE确定图形是否有效 *
; * GrCilMV为显示圆型时的正误差值 *
; * 例如:半径为10,误差为4;半径为30,误差为30 *
; *返 回:无 *
; *-------------------------------------------------------------------------*/
; void LcdShGrCil(INT8U Cy,INT8U Cx,INT8U CR,INT8U GrCilMV,INT8U GrE)
; {
.dbline 90
; INT8U x,y; //坐标的循环控制变量
; INT32S mistake; //显示时的误差值
; Wtite_Command(0b00110110); //扩展指令,绘图开
lda #54
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 91
; for(y=Cy-CR;y<=Cy+CR;y++)
lda 8,X
sub 10,X
sta ,X
jmp L16
L13:
.dbline 92
; for(x=Cx-CR;x<=Cx+CR;x++)
lda 9,X
sub 10,X
sta 5,X
jmp L20
L17:
.dbline 93
; {
.dbline 94
; mistake=(x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)-CR*CR;
clr *__r0
lda 9,X
sta *__r1
clr *__r2
lda 5,X
sub *__r1
sta *__r1
lda *__r2
sbc *__r0
sta *__r0
clr *__r2
lda 8,X
sta *__r3
clr *__r4
lda ,X
sub *__r3
sta *__r3
lda *__r4
sbc *__r2
sta *__r2
lda *__r3
psha
lda *__r2
psha
lda *__r3
psha
lda *__r2
psha
jsr __mul16
ais #4
mov *__rlo,*__r3
mov *__rhi,*__r2
lda *__r1
psha
lda *__r0
psha
lda *__r1
psha
lda *__r0
psha
jsr __mul16
ais #4
mov *__rlo,*__r1
mov *__rhi,*__r0
lda *__r1
add *__r3
sta *__r1
lda *__r0
adc *__r2
sta *__r0
clr *__r2
lda 10,X
sta *__r3
clr *__r4
lda 10,X
psha
lda *__r4
psha
lda *__r3
psha
lda *__r2
psha
jsr __mul16
ais #4
mov *__rlo,*__r3
mov *__rhi,*__r2
lda *__r1
sub *__r3
sta *__r1
lda *__r0
sbc *__r2
sta *__r0
clra
sta 2,X
sta 1,X
lda *__r1
sta 4,X
lda *__r0
sta 3,X
bpl X0
com 2,X
com 1,X
X0:
.dbline 96
; //误差在范围之内时,显示该点
; if((mistake<=GrCilMV)&&(mistake>=-GrCilMV))
clr *__r2
clr *__r1
clr *__r0
lda 11,X
sta *__r3
lda 4,X
psha
lda 3,X
psha
lda 2,X
psha
lda 1,X
psha
lda *__r3
psha
lda *__r2
psha
lda *__r1
psha
lda *__r0
psha
jsr __cmp32
ais #8
ble X2
jmp L21
X2:
clr *__r0
lda 11,X
sta *__r1
lda *__r0
nega
psha
lda *__r1
nega
sta *__r1
pula
sbc #0
sta *__r0
mov *__r1,*__r3
mov *__r0,*__r2
clr *__r1
clr *__r0
tst *__r2
bpl X1
com *__r1
com *__r0
X1:
lda 4,X
psha
lda 3,X
psha
lda 2,X
psha
lda 1,X
psha
lda *__r3
psha
lda *__r2
psha
lda *__r1
psha
lda *__r0
psha
jsr __cmp32
ais #8
blt L21
.dbline 97
; {
.dbline 98
; if(GrE==1) LcdShGr1P(y,x);//显示该点
lda 12,X
cmp #1
bne L23
.dbline 98
lda 5,X
psha
lda ,X
psha
jsr _LcdShGr1P
ais #2
tsx
bra L24
L23:
.dbline 100
; //清除该点
; else if(y<=31) LcdShGr16P(y,(x/16),0);
lda ,X
cmp #31
bhi L25
.dbline 100
ldhx #0
pshx
pshh
tsx
aix #2
lda 5,X
ldx #16
clrh
div
tsx
aix #2
psha
lda ,X
psha
jsr _LcdShGr16P
ais #4
tsx
bra L26
L25:
.dbline 101
; else LcdShGr16P(y-32,x/16+8,0);
ldhx #0
pshx
pshh
tsx
aix #2
lda 5,X
ldx #16
clrh
div
tsx
aix #2
add #8
psha
lda ,X
sub #32
psha
jsr _LcdShGr16P
ais #4
tsx
L26:
L24:
.dbline 102
; }
L21:
.dbline 103
L18:
.dbline 92
inc 5,X
L20:
.dbline 92
lda 9,X
add 10,X
sta *__r0
lda 5,X
cmp *__r0
bhi X3
jmp L17
X3:
L14:
.dbline 91
inc ,X
L16:
.dbline 91
lda 8,X
add 10,X
sta *__r0
lda ,X
cmp *__r0
bhi X4
jmp L13
X4:
.dbline 105
; }
; //LcdShGr1P(Cy,Cx);//显示圆心
; Wtite_Command(0b00110000);//基本指令
lda #48
psha
jsr _Wtite_Command
ais #1
tsx
.dbline -2
L12:
ais #6
.dbline 0 ; func end
rts
.dbsym l y 0 c
.dbsym l mistake 1 L
.dbsym l x 5 c
.dbsym l GrE 12 c
.dbsym l GrCilMV 11 c
.dbsym l CR 10 c
.dbsym l Cx 9 c
.dbsym l Cy 8 c
.dbend
.dbfunc e LcdShGrRe _LcdShGrRe fV
; RC -> 0,X
; LC -> 2,X
; TBC -> 4,X
; i -> 6,X
; y -> 7,X
; Px -> 8,X
; GrE -> 12,X
; ln -> 11,X
_LcdShGrRe::
.dbline -1
ais #-9
tsx
.dbline 114
; }
;
; /*LcdShGrRe:在Lcd的指定行上显示或取消矩型边框------------------------------*
; *功 能:在Lcd上指定行上显示或取消矩型边框 *
; *参 数:ln为指定的行数(0-3), GrE确定图形是否有效 *
; *返 回:无 *
; *-------------------------------------------------------------------------*/
; void LcdShGrRe(INT8U ln,INT8U GrE)
; {
.dbline 119
lda 11,X
beq L30
cmp #2
bne L28
L30:
.dbline 119
; INT8U Px,y; //行页号坐标,列坐标
; INT8U i; //循环变量
; INT16S LC,RC,TBC; //左,右和上下边框色
; //[确定ln所在行的起始坐标(左上角)]
; if((ln==0)||(ln==2)) y=0;
clr 7,X
bra L29
L28:
.dbline 120
; else y=16;
lda #16
sta 7,X
L29:
.dbline 121
; if(ln<=1) Px=0;
lda 11,X
cmp #1
bhi L31
.dbline 121
clr 8,X
bra L32
L31:
.dbline 122
; else Px=8;
lda #8
sta 8,X
L32:
.dbline 124
; //[确定有无边框(有GrE决定)]
; if(GrE==1) //有表框
lda 12,X
cmp #1
bne L33
.dbline 125
; {TBC=65535;LC=32768;RC=1;}
.dbline 125
lda #-1
sta 4,X
lda #-1
sta 5,X
.dbline 125
lda #-128
sta 2,X
lda #0
sta 3,X
.dbline 125
clra
sta ,X
lda #1
sta 1,X
.dbline 125
bra L34
L33:
.dbline 127
; else //无边框
; {TBC=0;LC=0;RC=0;}
.dbline 127
clr 5,X
clr 4,X
.dbline 127
clr 3,X
clr 2,X
.dbline 127
clr 1,X
clr ,X
.dbline 127
L34:
.dbline 128
; Wtite_Command(0b00110110);//扩展指令,绘图开
lda #54
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 130
; //[在Lcd上指定行上显示矩型边框]
; for(i=0;i<=7;i++,Px++)
clr 6,X
bra L38
L35:
.dbline 131
.dbline 132
lda 5,X
psha
lda 4,X
psha
lda 8,X
psha
lda 7,X
psha
jsr _LcdShGr16P
ais #4
tsx
.dbline 133
lda 5,X
psha
lda 4,X
psha
lda 8,X
psha
lda 7,X
add #15
psha
jsr _LcdShGr16P
ais #4
tsx
.dbline 134
L36:
.dbline 130
inc 6,X
inc 8,X
L38:
.dbline 130
lda 6,X
cmp #7
bls L35
.dbline 135
; {
; 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 136
.dbline 137
lda 1,X
psha
lda ,X
psha
lda 8,X
psha
lda 7,X
psha
jsr _LcdShGr16P
ais #4
tsx
.dbline 138
lda 3,X
psha
lda 2,X
psha
lda 8,X
sub #7
psha
lda 7,X
psha
jsr _LcdShGr16P
ais #4
tsx
.dbline 139
L40:
.dbline 135
inc 6,X
inc 7,X
L42:
.dbline 135
lda 6,X
cmp #14
bls L39
.dbline 140
; {
; LcdShGr16P(y,Px,RC); //显示右边框
; LcdShGr16P(y,Px-7,LC); //显示左边框
; }
; Wtite_Command(0b00110000);//基本指令
lda #48
psha
jsr _Wtite_Command
ais #1
tsx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -