📄 lcd.s
字号:
.module lcd.c
.area text
.dbfile lcd.c
.dbfunc e Lcdinit _Lcdinit fV
_Lcdinit::
.dbline -1
.dbline 33
; /*-----------------------------------------------------*
; *文件描述:本文件包含了液晶显示相关子程序,分别为: *
; *(1)Lcdinit:液晶初始化子程序 *
; *(2)LcdShCh:在液晶显示屏上显示字符数据 *
; *(3)LcdShGrRe:在Lcd的指定行上显示或取消矩型边框 *
; *(4)LcdShGrCil:在Lcd上显示或取消空心圆型 *
; *-----------------------------------------------------*/
;
; //包含头文件
; #include "gp32c.h"
; #include "lcd.h"
; //定义延时子程序
; #define delay1600us DelayTimes(4000) //延时>1.6ms
; #define delay72us DelayTimes(30) //延时>72us
; #define delay40ms DelayTimes(10000) //延时>40ms
; //内部调用函数声明
; void DelayTimes(unsigned int); //延时指定时间
; void Wtite_Command(unsigned char);//将控制命令写入Lcd
; void Wtite_Data(unsigned char); //将数据写入Lcd
; void LcdShGrClr(void); //在Lcd上清图形显示屏
; //在Lcd指定位置上设置线型16个点的显示
; void LcdShGr16P(unsigned char,unsigned char,int);
; //在Lcd指定位置上画1个点
; void LcdShGr1P(unsigned char,unsigned char);
;
; //==================[Lcd初始化操作]==========================
; /*Lcdinit:初始化液晶-----------------------------------*
; *功 能:初始化液晶,设置显示方式,清屏、C自动+1 *
; *参 数:无 *
; *返 回:无 *
; *-----------------------------------------------------*/
; void Lcdinit(void)
; {
.dbline 34
; LCD_CtrlPortDDR=0x07; //控制口低三位设置为输出
lda #7
sta 0x6
.dbline 35
; LCD_DataPortDDR=0xff; //数据口设置为输出
lda #-1
sta 0x5
.dbline 37
; //[Lcd初始化]
; delay40ms; //延时>40ms
ldhx #10000
pshx
pshh
jsr _DelayTimes
ais #2
.dbline 38
; Wtite_Command(0b00110000); //8位数据,基本指令
lda #48
psha
jsr _Wtite_Command
ais #1
.dbline 39
; Wtite_Command(0b00001100); //开显示
lda #12
psha
jsr _Wtite_Command
ais #1
.dbline 40
; Wtite_Command(0b00000001); //清屏
lda #1
psha
jsr _Wtite_Command
ais #1
.dbline 41
; delay1600us; //延时>1.6ms
ldhx #4000
pshx
pshh
jsr _DelayTimes
ais #2
.dbline 42
; Wtite_Command(0b00000110); //进入模式设定
lda #6
psha
jsr _Wtite_Command
ais #1
.dbline 43
; 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 53
; }
;
; //==================[Lcd显示字符操作]========================
; /*LcdShCh:在液晶显示屏上显示字符数据-------------------*
; *功 能:在液晶显示屏上显示以LcdSBuff为首地址的64个数据 *
; *参 数:待显示的64个数据的首地址 *
; *返 回:无 *
; *-----------------------------------------------------*/
; void LcdShCh(unsigned char *LcdSBuff)
; {
.dbline 56
; unsigned char i; //data数组计数器(0-63)
; //[Lcd显示64个数据]
; Wtite_Command(0x80); //DDRAM地址设置
lda #-128
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 57
; for(i=0;i<64;i++) //显示data中的64个数据
clr ,X
bra L6
L3:
.dbline 58
; {
.dbline 60
; //[Lcd按行显示16个数据]
; if((i<=15)||(i>=48)) //第一行和第四行不变
lda ,X
cmp #15
bls L9
cmp #48
blo L7
L9:
.dbline 61
; 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 62
; else if(i<=31) //显示的第二行为缓冲的第三行
lda ,X
cmp #31
bhi L10
.dbline 63
; 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 65
; 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 66
L4:
.dbline 57
inc ,X
L6:
.dbline 57
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 81
; }
; }
;
; //=====[Lcd画图操作:包括画圆,画矩形框,图形清屏,画点等]=====
; /*LcdShGrCil:在Lcd上显示或取消空心圆型-----------------*
; *功 能:在Lcd上的指定位置显示或取消空心圆型 *
; *参 数:Cx为圆心横坐标,Cy为圆心纵坐标 *
; * CR为圆的半径,GrE确定图形是否有效 *
; * GrCilMV为显示圆型时的正误差值 *
; * 例如:半径为10,误差为4;半径为30,误差为30 *
; *返 回:无 *
; *-----------------------------------------------------*/
; void LcdShGrCil(unsigned char Cy,unsigned char Cx,
; unsigned char CR,unsigned char
; GrCilMV,unsigned char GrE)
; {
.dbline 84
; unsigned char x,y; //坐标的循环控制变量
; long int mistake; //显示时的误差值
; Wtite_Command(0b00110110); //扩展指令,绘图开
lda #54
psha
jsr _Wtite_Command
ais #1
tsx
.dbline 85
; for(y=Cy-CR;y<=Cy+CR;y++)
lda 8,X
sub 10,X
sta ,X
jmp L16
L13:
.dbline 86
; for(x=Cx-CR;x<=Cx+CR;x++)
lda 9,X
sub 10,X
sta 5,X
jmp L20
L17:
.dbline 87
; {
.dbline 88
; 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 90
; //误差在范围之内时,显示该点
; 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 91
; {
.dbline 92
; if(GrE==1) LcdShGr1P(y,x);//显示该点
lda 12,X
cmp #1
bne L23
.dbline 92
lda 5,X
psha
lda ,X
psha
jsr _LcdShGr1P
ais #2
tsx
bra L24
L23:
.dbline 94
; //清除该点
; else if(y<=31) LcdShGr16P(y,(x/16),0);
lda ,X
cmp #31
bhi L25
.dbline 94
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 95
; 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 96
; }
L21:
.dbline 97
L18:
.dbline 86
inc 5,X
L20:
.dbline 86
lda 9,X
add 10,X
sta *__r0
lda 5,X
cmp *__r0
bhi X3
jmp L17
X3:
L14:
.dbline 85
inc ,X
L16:
.dbline 85
lda 8,X
add 10,X
sta *__r0
lda ,X
cmp *__r0
bhi X4
jmp L13
X4:
.dbline 99
; }
; // 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 108
; }
;
; /*LcdShGrRe:在Lcd的指定行上显示或取消矩型边框--------*
; *功 能:在Lcd上指定行上显示或取消矩型边框 *
; *参 数:ln为指定的行数(0-3), GrE确定图形是否有效 *
; *返 回:无 *
; *---------------------------------------------------*/
; void LcdShGrRe(unsigned char ln,unsigned char GrE)
; {
.dbline 113
lda 11,X
beq L30
cmp #2
bne L28
L30:
.dbline 113
; unsigned char Px,y;//行页号坐标,列坐标
; unsigned char i; //循环变量
; int LC,RC,TBC; //左,右和上下边框色
; //[确定ln所在行的起始坐标(左上角)]
; if((ln==0)||(ln==2)) y=0;
clr 7,X
bra L29
L28:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -