📄 tg1286~1.lst
字号:
(0145) *返 回:无 *
(0146) *-------------------------------------------------------------------------*/
(0147) void LcdShGrClr(void)
(0148) {
94BF A6 36 ldA #54
94C1 87 pshA
94C2 CD 959F jsr _Wtite_Command
94C5 A7 01 aiS #1
94C7 95 tSX
(0149) INT8U Px,y; //行页号,列坐标的循环变量
(0150) Wtite_Command(0b00110110);//扩展指令,绘图开
(0151) //[清图形显示屏(清GDRAM)]
(0152) for(y=0;y<=31;y++)
94C8 7F clr 0,X
94C9 20 20 bra 0x94EB
(0153) for(Px=0;Px<=15;Px++)
94CB 6F 01 clr 1,X
94CD 20 15 bra 0x94E4
(0154) LcdShGr16P(y,Px,0); //写入0为清屏
94CF 45 0000 ldHX #0x0000
94D2 89 pshX
94D3 8B pshH
94D4 95 tSX
94D5 AF 02 aiX #2
94D7 E6 01 ldA 1,X
94D9 87 pshA
94DA F6 ldA 0,X
94DB 87 pshA
94DC CD 9569 jsr _LcdShGr16P
94DF A7 04 aiS #4
94E1 95 tSX
94E2 6C 01 inc 1,X
94E4 E6 01 ldA 1,X
94E6 A1 0F cmp #15
94E8 23 E5 bls 0x94CF
94EA 7C inc 0,X
94EB F6 ldA 0,X
94EC A1 1F cmp #31
94EE 23 DB bls 0x94CB
(0155) Wtite_Command(0b00110000);//基本指令
94F0 A6 30 ldA #48
94F2 87 pshA
94F3 CD 959F jsr _Wtite_Command
94F6 A7 01 aiS #1
94F8 95 tSX
94F9 A7 02 aiS #2
94FB 81 rts
_LcdShGr1P:
value --> X+0
x --> X+5
y --> X+4
94FC A7 FE aiS #-2
94FE 95 tSX
(0156) }
(0157)
(0158) /*LcdShGr1P:在Lcd的指定位置上画一个点--------------------------------------*
(0159) *功 能:在Lcd的指定位置上画一个点 *
(0160) *参 数:y为纵坐标(0-63),x为横坐标(0-127) *
(0161) *返 回:无 *
(0162) *-------------------------------------------------------------------------*/
(0163) void LcdShGr1P(INT8U y,INT8U x)
(0164) {
94FF A6 80 ldA #-128
9501 F7 stA 0,X
9502 A6 00 ldA #0
9504 E7 01 stA 1,X
(0165) INT16U value=32768; //初始值为0b1000000000000000
(0166) if(y>=32) //第三四行必须调整x和y坐标
9506 E6 04 ldA 4,X
9508 A1 20 cmp #32
950A 25 0A bcs 0x9516
(0167) {y=y-32;x=x+16*8;}
950C A0 20 sub #32
950E E7 04 stA 4,X
9510 E6 05 ldA 5,X
9512 AB 80 add #-128
9514 E7 05 stA 5,X
(0168) value>>=(x-x/16*16); //写入的16位数据
9516 3F 40 clr *__r0
9518 E6 05 ldA 5,X
951A B7 4D stA *__rlo
951C 4E 404C mov *__r0,*__rhi
951F A6 10 ldA #16
9521 87 pshA
9522 4F clrA
9523 87 pshA
9524 CD 98E0 jsr __divmod16s
9527 A7 02 aiS #2
9529 4E 4C40 mov *__rhi,*__r0
952C 4E 4D41 mov *__rlo,*__r1
952F A6 04 ldA #4
9531 38 41 lsl *__r1
9533 39 40 rol *__r0
9535 4B FA dbnzA 0x9578
9537 3F 42 clr *__r2
9539 E6 05 ldA 5,X
953B B0 41 sub *__r1
953D B7 41 stA *__r1
953F B6 42 ldA *__r2
9541 B2 40 sbc *__r0
9543 B6 41 ldA *__r1
9545 A4 0F and #15
9547 27 05 beq 0x954E
9549 74 lsr 0,X
954A 66 01 ror 1,X
954C 4B FB dbnzA 0x958F
(0169) LcdShGr16P(y,x/16,value);//显示相应的点
954E E6 01 ldA 1,X
9550 87 pshA
9551 F6 ldA 0,X
9552 87 pshA
9553 E6 05 ldA 5,X
9555 AE 10 ldX #16
9557 8C clrH
9558 52 div
9559 95 tSX
955A AF 02 aiX #2
955C 87 pshA
955D E6 04 ldA 4,X
955F 87 pshA
9560 CD 9569 jsr _LcdShGr16P
9563 A7 04 aiS #4
9565 95 tSX
9566 A7 02 aiS #2
9568 81 rts
_LcdShGr16P:
value --> X+4
Px --> X+3
y --> X+2
9569 95 tSX
(0170) }
(0171)
(0172) /*LcdShGr16P:在Lcd指定位置上设置线型16个点的显示---------------------------*
(0173) *功 能:在Lcd指定位置上设置线型16个点的显示 *
(0174) *参 数:y为纵坐标(0-63),Px为页号(0-15),value为16位数据 *
(0175) *返 回:无 *
(0176) *-------------------------------------------------------------------------*/
(0177) void LcdShGr16P(INT8U y,INT8U Px,INT16S value)
(0178) {
956A E6 02 ldA 2,X
956C AA 80 orA #-128
956E 87 pshA
956F CD 959F jsr _Wtite_Command
9572 A7 01 aiS #1
9574 95 tSX
(0179) //Wtite_Command(0b00110110); //8位数据,扩展指令,绘图开
(0180) Wtite_Command(y|0b10000000);//设置6位绘图列地址
(0181) Wtite_Command(Px|0b10000000);//设置4位绘图行地址
9575 E6 03 ldA 3,X
9577 AA 80 orA #-128
9579 87 pshA
957A CD 959F jsr _Wtite_Command
957D A7 01 aiS #1
957F 95 tSX
(0182) Wtite_Data((INT8U)(value>>8));//写入高8个字节
9580 E6 04 ldA 4,X
9582 B7 41 stA *__r1
9584 3F 40 clr *__r0
9586 3D 41 tst *__r1
9588 2A 02 bpl 0x958C
958A 33 40 com *__r0
958C B6 41 ldA *__r1
958E 87 pshA
958F CD 95BA jsr _Wtite_Data
9592 A7 01 aiS #1
9594 95 tSX
(0183) Wtite_Data((INT8U)value); //写入低8个字节
9595 E6 05 ldA 5,X
9597 87 pshA
9598 CD 95BA jsr _Wtite_Data
959B A7 01 aiS #1
959D 95 tSX
959E 81 rts
_Wtite_Command:
command --> X+2
959F 95 tSX
(0184) //Wtite_Command(0b00110000); //8位数据,基本指令
(0185) }
(0186)
(0187) /*===============[Lcd基本操作:包括写指令,写数据和延时]===================*/
(0188) /*Wtite_Command:执行参数中的给定命令---------------------------------------*
(0189) *功 能:执行参数中的给定命令 *
(0190) *参 数:command为待执行的命令码 *
(0191) *返 回:无 *
(0192) *-------------------------------------------------------------------------*/
(0193) void Wtite_Command(INT8U command)
(0194) {
95A0 13 02 Bclr 1,0x02
(0195) LCD_CtrlPort&=~(1<<LCD_RS); //RS=0
(0196) LCD_CtrlPort&=~(1<<LCD_RW); //RW=0
95A2 15 02 Bclr 2,0x02
(0197) LCD_DataPort=command; //数据上线
95A4 E6 02 ldA 2,X
95A6 B7 01 stA 0x01
(0198) LCD_CtrlPort|=(1<<LCD_E); //E=1
95A8 16 02 Bset 3,0x02
(0199) asm("nop"); //使数据稳定
95AA 9D nop
(0200) asm("nop");
95AB 9D nop
(0201) LCD_CtrlPort&=~(1<<LCD_E); //E=0,使数据有效
95AC 17 02 Bclr 3,0x02
(0202) delay72us; //延时>72us
95AE 45 001E ldHX #0x001E
95B1 89 pshX
95B2 8B pshH
95B3 CD 95D5 jsr _DelayTimes
95B6 A7 02 aiS #2
95B8 95 tSX
95B9 81 rts
_Wtite_Data:
data --> X+2
95BA 95 tSX
(0203) }
(0204)
(0205) /*Wtite_Data:将参数中给定的数据写入液晶控制器------------------------------*
(0206) *功 能:将参数中给定的数据写入液晶控制器 *
(0207) *参 数:data为待写入的数据 *
(0208) *返 回:无 *
(0209) *-------------------------------------------------------------------------*/
(0210) void Wtite_Data(INT8U data)
(0211) {
95BB 12 02 Bset 1,0x02
(0212) LCD_CtrlPort|=(1<<LCD_RS); //RS=1
(0213) LCD_CtrlPort&=~(1<<LCD_RW); //RW=0
95BD 15 02 Bclr 2,0x02
(0214) LCD_DataPort=data; //数据上线
95BF E6 02 ldA 2,X
95C1 B7 01 stA 0x01
(0215) LCD_CtrlPort|=(1<<LCD_E); //E=1
95C3 16 02 Bset 3,0x02
(0216) asm("nop"); //使数据稳定
95C5 9D nop
(0217) asm("nop");
95C6 9D nop
(0218) LCD_CtrlPort&=~(1<<LCD_E); //E=0,使数据有效
95C7 17 02 Bclr 3,0x02
(0219) delay72us; //延时>72us
95C9 45 001E ldHX #0x001E
95CC 89 pshX
95CD 8B pshH
95CE CD 95D5 jsr _DelayTimes
95D1 A7 02 aiS #2
95D3 95 tSX
95D4 81 rts
_DelayTimes:
i --> X+0
tn --> X+4
95D5 A7 FE aiS #-2
95D7 95 tSX
(0220) }
(0221)
(0222) /*DelayTimes:延时指定时间--------------------------------------------------*
(0223) *功 能:延时指定的时间 *
(0224) *入 口:tn为延时时间数(0到65535) *
(0225) *出 口:无 *
(0226) *-------------------------------------------------------------------------*/
(0227) void DelayTimes(INT16U tn)
(0228) {
95D8 6F 01 clr 1,X
95DA 7F clr 0,X
95DB 20 0A bra 0x95E7
(0229) INT16U i; //循环变量
(0230) for(i=0;i<tn;i++);
95DD E6 01 ldA 1,X
95DF AB 01 add #1
95E1 E7 01 stA 1,X
95E3 F6 ldA 0,X
95E4 A9 00 adc #0
95E6 F7 stA 0,X
95E7 E6 05 ldA 5,X
95E9 B7 41 stA *__r1
95EB E6 04 ldA 4,X
95ED B7 40 stA *__r0
95EF E6 01 ldA 1,X
95F1 B7 43 stA *__r3
95F3 F6 ldA 0,X
95F4 B7 42 stA *__r2
95F6 55 42 ldHX *__r2
95F8 75 40 cpHX *__r0
95FA 95 tSX
95FB 25 E0 bcs 0x95DD
95FD A7 02 aiS #2
95FF 81 rts
_LcdShBigNum:
GBit --> X+0
BBit --> X+1
SBit --> X+2
Yi --> X+3
Num --> X+10
BigNumCodeAdrr --> X+8
X --> X+7
Y --> X+6
9600 A7 FC aiS #-4
9602 95 tSX
(0231) }
(0232)
(0233) //其他特殊功能函数
(0234) /*LcdShBigNum:在Lcd上显示自定义32*16点阵的数字(0--999)---------------------*
(0235) *功 能:在Lcd上显示自定义32*16点阵的数字(0--999) *
(0236) *参 数:X表示Lcd上显示字符的横坐标(0--5),Y为显示字符的纵坐标(0--1) *
(0237) * BigNumCodeAdrr为32*16点阵数字编码首地址,Num为当前的数据值(0--999) *
(0238) *返 回:无 *
(0239) *内部调用:LcdShGr16P:在Lcd指定位置上设置线型16个点的显示 *
(0240) * Wtite_Command:执行参数中的给定命令 *
(0241) *-------------------------------------------------------------------------*/
(0242) void LcdShBigNum(INT8U Y,INT8U X,INT16U * BigNumCodeAdrr,INT16U Num)
(0243) {
9603 E6 06 ldA 6,X
9605 A1 01 cmp #1
9607 22 16 bhi 0x961F
9609 E6 07 ldA 7,X
960B A1 05 cmp #5
960D 22 10 bhi 0x961F
960F E6 0B ldA 11,X
9611 B7 41 stA *__r1
9613 E6 0A ldA 10,X
9615 B7 40 stA *__r0
9617 55 40 ldHX *__r0
9619 65 03E7 cpHX #0x03E7
961C 95 tSX
961D 23 03 bls 0x9622
(0244) INT8U GBit,SBit,BBit; //存放个位,十位,百位数据
(0245) INT8U Yi; //Y坐标方向的循环控制变量
(0246) if(Y>1||X>5||Num>999) goto LcdShBigNum_End; //参数值范围检测
961F CC 979D jmp 0x979D
(0247) GBit=Num%10; BBit=Num/100; SBit=(Num%100)/10;
9622 E6 0B ldA 11,X
9624 B7 4D stA *__rlo
9626 E6 0A ldA 10,X
9628 B7 4C stA *__rhi
962A A6 0A ldA #10
962C 87 pshA
962D 4F clrA
962E 87 pshA
962F CD 993E jsr __divmod16u
9632 86 pulA
9633 86 pulA
9634 F7 stA 0,X
9635 E6 0B ldA 11,X
9637 B7 4D stA *__rlo
9639 E6 0A ldA 10,X
963B B7 4C stA *__rhi
963D A6 64 ldA #100
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -