📄 tg1286~1.lst
字号:
(0111) int LC,RC,TBC; //左,右和上下边框色
(0112) //[确定ln所在行的起始坐标(左上角)]
(0113) if((ln==0)||(ln==2)) y=0;
841F 6F 07 clr 7,X
8421 20 04 bra 0x8427
(0114) else y=16;
8423 A6 10 ldA #16
8425 E7 07 stA 7,X
(0115) if(ln<=1) Px=0;
8427 E6 0B ldA 11,X
8429 A1 01 cmp #1
842B 22 04 bhi 0x8431
842D 6F 08 clr 8,X
842F 20 04 bra 0x8435
(0116) else Px=8;
8431 A6 08 ldA #8
8433 E7 08 stA 8,X
(0117) //[确定有无边框(有GrE决定)]
(0118) if(GrE==1) //有表框
8435 E6 0C ldA 12,X
8437 A1 01 cmp #1
8439 26 18 bne 0x8453
(0119) {TBC=65535;LC=32768;RC=1;}
843B A6 FF ldA #-1
843D E7 04 stA 4,X
843F A6 FF ldA #-1
8441 E7 05 stA 5,X
8443 A6 80 ldA #-128
8445 E7 02 stA 2,X
8447 A6 00 ldA #0
8449 E7 03 stA 3,X
844B 4F clrA
844C F7 stA 0,X
844D A6 01 ldA #1
844F E7 01 stA 1,X
8451 20 0B bra 0x845E
(0120) else //无边框
(0121) {TBC=0;LC=0;RC=0;}
8453 6F 05 clr 5,X
8455 6F 04 clr 4,X
8457 6F 03 clr 3,X
8459 6F 02 clr 2,X
845B 6F 01 clr 1,X
845D 7F clr 0,X
(0122) Wtite_Command(0b00110110);//扩展指令,绘图开
845E A6 36 ldA #54
8460 87 pshA
8461 CD 85C3 jsr _Wtite_Command
8464 A7 01 aiS #1
8466 95 tSX
(0123) //[在Lcd上指定行上显示矩型边框]
(0124) for(i=0;i<=7;i++,Px++)
8467 6F 06 clr 6,X
8469 20 2A bra 0x8495
(0125) {
846B E6 05 ldA 5,X
846D 87 pshA
846E E6 04 ldA 4,X
8470 87 pshA
8471 E6 08 ldA 8,X
8473 87 pshA
8474 E6 07 ldA 7,X
8476 87 pshA
8477 CD 858D jsr _LcdShGr16P
847A A7 04 aiS #4
847C 95 tSX
(0126) LcdShGr16P(y,Px,TBC); //显示上边框
(0127) LcdShGr16P(y+15,Px,TBC); //显示下边框
847D E6 05 ldA 5,X
847F 87 pshA
8480 E6 04 ldA 4,X
8482 87 pshA
8483 E6 08 ldA 8,X
8485 87 pshA
8486 E6 07 ldA 7,X
8488 AB 0F add #15
848A 87 pshA
848B CD 858D jsr _LcdShGr16P
848E A7 04 aiS #4
8490 95 tSX
(0128) }
8491 6C 06 inc 6,X
8493 6C 08 inc 8,X
8495 E6 06 ldA 6,X
8497 A1 07 cmp #7
8499 23 D0 bls 0x846B
(0129) for(i=1,y++,Px--;i<=14;i++,y++)
849B A6 01 ldA #1
849D E7 06 stA 6,X
849F 6C 07 inc 7,X
84A1 6A 08 dec 8,X
84A3 20 29 bra 0x84CE
(0130) {
84A5 E6 01 ldA 1,X
84A7 87 pshA
84A8 F6 ldA 0,X
84A9 87 pshA
84AA E6 08 ldA 8,X
84AC 87 pshA
84AD E6 07 ldA 7,X
84AF 87 pshA
84B0 CD 858D jsr _LcdShGr16P
84B3 A7 04 aiS #4
84B5 95 tSX
(0131) LcdShGr16P(y,Px,RC); //显示右边框
(0132) LcdShGr16P(y,Px-7,LC); //显示左边框
84B6 E6 03 ldA 3,X
84B8 87 pshA
84B9 E6 02 ldA 2,X
84BB 87 pshA
84BC E6 08 ldA 8,X
84BE A0 07 sub #7
84C0 87 pshA
84C1 E6 07 ldA 7,X
84C3 87 pshA
84C4 CD 858D jsr _LcdShGr16P
84C7 A7 04 aiS #4
84C9 95 tSX
(0133) }
84CA 6C 06 inc 6,X
84CC 6C 07 inc 7,X
84CE E6 06 ldA 6,X
84D0 A1 0E cmp #14
84D2 23 D1 bls 0x84A5
(0134) Wtite_Command(0b00110000);//基本指令
84D4 A6 30 ldA #48
84D6 87 pshA
84D7 CD 85C3 jsr _Wtite_Command
84DA A7 01 aiS #1
84DC 95 tSX
84DD A7 09 aiS #9
84DF 81 rts
_LcdShGrClr:
y --> X+0
Px --> X+1
84E0 A7 FE aiS #-2
84E2 95 tSX
(0135) }
(0136)
(0137) /*LcdShGrClr:在Lcd上清图形显示屏--------------*
(0138) *功 能:在Lcd上清图形显示屏(清GDRAM) *
(0139) *参 数:无 *
(0140) *返 回:无 *
(0141) *--------------------------------------------*/
(0142) void LcdShGrClr(void)
(0143) {
84E3 A6 36 ldA #54
84E5 87 pshA
84E6 CD 85C3 jsr _Wtite_Command
84E9 A7 01 aiS #1
84EB 95 tSX
(0144) unsigned char Px,y;//行页号,列坐标的循环变量
(0145) Wtite_Command(0b00110110);//扩展指令,绘图开
(0146) //[清图形显示屏(清GDRAM)]
(0147) for(y=0;y<=31;y++)
84EC 7F clr 0,X
84ED 20 20 bra 0x850F
(0148) for(Px=0;Px<=15;Px++)
84EF 6F 01 clr 1,X
84F1 20 15 bra 0x8508
(0149) LcdShGr16P(y,Px,0); //写入0为清屏
84F3 45 0000 ldHX #0x0000
84F6 89 pshX
84F7 8B pshH
84F8 95 tSX
84F9 AF 02 aiX #2
84FB E6 01 ldA 1,X
84FD 87 pshA
84FE F6 ldA 0,X
84FF 87 pshA
8500 CD 858D jsr _LcdShGr16P
8503 A7 04 aiS #4
8505 95 tSX
8506 6C 01 inc 1,X
8508 E6 01 ldA 1,X
850A A1 0F cmp #15
850C 23 E5 bls 0x84F3
850E 7C inc 0,X
850F F6 ldA 0,X
8510 A1 1F cmp #31
8512 23 DB bls 0x84EF
(0150) Wtite_Command(0b00110000);//基本指令
8514 A6 30 ldA #48
8516 87 pshA
8517 CD 85C3 jsr _Wtite_Command
851A A7 01 aiS #1
851C 95 tSX
851D A7 02 aiS #2
851F 81 rts
_LcdShGr1P:
value --> X+0
x --> X+5
y --> X+4
8520 A7 FE aiS #-2
8522 95 tSX
(0151) }
(0152)
(0153) /*LcdShGr1P:在Lcd的指定位置上画一个点------------------*
(0154) *功 能:在Lcd的指定位置上画一个点 *
(0155) *参 数:y为纵坐标(0-63),x为横坐标(0-127) *
(0156) *返 回:无 *
(0157) *-----------------------------------------------------*/
(0158) void LcdShGr1P(unsigned char y,unsigned char x)
(0159) {
8523 A6 80 ldA #-128
8525 F7 stA 0,X
8526 A6 00 ldA #0
8528 E7 01 stA 1,X
(0160) unsigned int value=32768;//初始值为0b1000000000000000
(0161) if(y>=32) //第三四行必须调整x和y坐标
852A E6 04 ldA 4,X
852C A1 20 cmp #32
852E 25 0A bcs 0x853A
(0162) {y=y-32;x=x+16*8;}
8530 A0 20 sub #32
8532 E7 04 stA 4,X
8534 E6 05 ldA 5,X
8536 AB 80 add #-128
8538 E7 05 stA 5,X
(0163) value>>=(x-x/16*16); //写入的16位数据
853A 3F 40 clr *__r0
853C E6 05 ldA 5,X
853E B7 4D stA *__rlo
8540 4E 404C mov *__r0,*__rhi
8543 A6 10 ldA #16
8545 87 pshA
8546 4F clrA
8547 87 pshA
8548 CD 8764 jsr __divmod16s
854B A7 02 aiS #2
854D 4E 4C40 mov *__rhi,*__r0
8550 4E 4D41 mov *__rlo,*__r1
8553 A6 04 ldA #4
8555 38 41 lsl *__r1
8557 39 40 rol *__r0
8559 4B FA dbnzA 0x859C
855B 3F 42 clr *__r2
855D E6 05 ldA 5,X
855F B0 41 sub *__r1
8561 B7 41 stA *__r1
8563 B6 42 ldA *__r2
8565 B2 40 sbc *__r0
8567 B6 41 ldA *__r1
8569 A4 0F and #15
856B 27 05 beq 0x8572
856D 74 lsr 0,X
856E 66 01 ror 1,X
8570 4B FB dbnzA 0x85B3
(0164) LcdShGr16P(y,x/16,value);//显示相应的点
8572 E6 01 ldA 1,X
8574 87 pshA
8575 F6 ldA 0,X
8576 87 pshA
8577 E6 05 ldA 5,X
8579 AE 10 ldX #16
857B 8C clrH
857C 52 div
857D 95 tSX
857E AF 02 aiX #2
8580 87 pshA
8581 E6 04 ldA 4,X
8583 87 pshA
8584 CD 858D jsr _LcdShGr16P
8587 A7 04 aiS #4
8589 95 tSX
858A A7 02 aiS #2
858C 81 rts
_LcdShGr16P:
value --> X+4
Px --> X+3
y --> X+2
858D 95 tSX
(0165) }
(0166)
(0167) /*LcdShGr16P:在Lcd指定位置上设置线型16个点的显示-----------*
(0168) *功 能:在Lcd指定位置上设置线型16个点的显示 *
(0169) *参 数:y为纵坐标(0-63),Px为页号(0-15),value为16位数据 *
(0170) *返 回:无 *
(0171) *---------------------------------------------------------*/
(0172) void LcdShGr16P(unsigned char y,unsigned char Px,int value)
(0173) {
858E E6 02 ldA 2,X
8590 AA 80 orA #-128
8592 87 pshA
8593 CD 85C3 jsr _Wtite_Command
8596 A7 01 aiS #1
8598 95 tSX
(0174) //Wtite_Command(0b00110110); //8位数据,扩展指令,绘图开
(0175) Wtite_Command(y|0b10000000);//设置6位绘图列地址
(0176) Wtite_Command(Px|0b10000000);//设置4位绘图行地址
8599 E6 03 ldA 3,X
859B AA 80 orA #-128
859D 87 pshA
859E CD 85C3 jsr _Wtite_Command
85A1 A7 01 aiS #1
85A3 95 tSX
(0177) Wtite_Data((unsigned char)(value>>8));//写入高8个字节
85A4 E6 04 ldA 4,X
85A6 B7 41 stA *__r1
85A8 3F 40 clr *__r0
85AA 3D 41 tst *__r1
85AC 2A 02 bpl 0x85B0
85AE 33 40 com *__r0
85B0 B6 41 ldA *__r1
85B2 87 pshA
85B3 CD 85DE jsr _Wtite_Data
85B6 A7 01 aiS #1
85B8 95 tSX
(0178) Wtite_Data((unsigned char)value); //写入低8个字节
85B9 E6 05 ldA 5,X
85BB 87 pshA
85BC CD 85DE jsr _Wtite_Data
85BF A7 01 aiS #1
85C1 95 tSX
85C2 81 rts
_Wtite_Command:
command --> X+2
85C3 95 tSX
(0179) //Wtite_Command(0b00110000); //8位数据,基本指令
(0180) }
(0181)
(0182) //===========[Lcd基本操作:包括写指令,写数据和延时]===========
(0183) /*Wtite_Command:执行参数中的给定命令-------------------*
(0184) *功 能:执行参数中的给定命令 *
(0185) *参 数:command为待执行的命令码 *
(0186) *返 回:无 *
(0187) *-----------------------------------------------------*/
(0188) void Wtite_Command(unsigned char command)
(0189) {
85C4 13 02 Bclr 1,0x02
(0190) LCD_CtrlPort&=~(1<<LCD_RS); //RS=0
(0191) LCD_CtrlPort&=~(1<<LCD_RW); //RW=0
85C6 15 02 Bclr 2,0x02
(0192) LCD_DataPort=command; //数据上线
85C8 E6 02 ldA 2,X
85CA B7 01 stA 0x01
(0193) LCD_CtrlPort|=(1<<LCD_E); //E=1
85CC 16 02 Bset 3,0x02
(0194) asm("nop"); //使数据稳定
85CE 9D nop
(0195) asm("nop");
85CF 9D nop
(0196) LCD_CtrlPort&=~(1<<LCD_E); //E=0,使数据有效
85D0 17 02 Bclr 3,0x02
(0197) delay72us; //延时>72us
85D2 45 001E ldHX #0x001E
85D5 89 pshX
85D6 8B pshH
85D7 CD 85F9 jsr _DelayTimes
85DA A7 02 aiS #2
85DC 95 tSX
85DD 81 rts
_Wtite_Data:
data --> X+2
85DE 95 tSX
(0198) }
(0199)
(0200) /*Wtite_Data:将参数中给定的数据写入液晶控制器----------*
(0201) *功 能:将参数中给定的数据写入液晶控制器 *
(0202) *参 数:data为待写入的数据 *
(0203) *返 回:无 *
(0204) *-----------------------------------------------------*/
(0205) void Wtite_Data(unsigned char data)
(0206) {
85DF 12 02 Bset 1,0x02
(0207) LCD_CtrlPort|=(1<<LCD_RS); //RS=1
(0208) LCD_CtrlPort&=~(1<<LCD_RW); //RW=0
85E1 15 02 Bclr 2,0x02
(0209) LCD_DataPort=data; //数据上线
85E3 E6 02 ldA 2,X
85E5 B7 01 stA 0x01
(0210) LCD_CtrlPort|=(1<<LCD_E); //E=1
85E7 16 02 Bset 3,0x02
(0211) asm("nop"); //使数据稳定
85E9 9D nop
(0212) asm("nop");
85EA 9D nop
(0213) LCD_CtrlPort&=~(1<<LCD_E); //E=0,使数据有效
85EB 17 02 Bclr 3,0x02
(0214) delay72us; //延时>72us
85ED 45 001E ldHX #0x001E
85F0 89 pshX
85F1 8B pshH
85F2 CD 85F9 jsr _DelayTimes
85F5 A7 02 aiS #2
85F7 95 tSX
85F8 81 rts
_DelayTimes:
i --> X+0
tn --> X+4
85F9 A7 FE aiS #-2
85FB 95 tSX
(0215) }
(0216)
(0217) /*DelayTimes:延时指定时间---------------*
(0218) *功 能:延时指定的时间 *
(0219) *入 口:tn为延时时间数(0到65535) *
(0220) *出 口:无 *
(0221) *--------------------------------------*/
(0222) void DelayTimes(unsigned int tn)
(0223) {
85FC 6F 01 clr 1,X
85FE 7F clr 0,X
85FF 20 0A bra 0x860B
(0224) unsigned int i; //循环变量
(0225) for(i=0;i<tn;i++);
8601 E6 01 ldA 1,X
8603 AB 01 add #1
8605 E7 01 stA 1,X
8607 F6 ldA 0,X
8608 A9 00 adc #0
860A F7 stA 0,X
860B E6 05 ldA 5,X
860D B7 41 stA *__r1
860F E6 04 ldA 4,X
8611 B7 40 stA *__r0
8613 E6 01 ldA 1,X
8615 B7 43 stA *__r3
8617 F6 ldA 0,X
8618 B7 42 stA *__r2
861A 55 42 ldHX *__r2
861C 75 40 cpHX *__r0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -