📄 tg1286~1.lst
字号:
913A 55 92 ldHX 0xFFFFFF92
913C 89 pshX
913D 8B pshH
913E A6 00 ldA #0
9140 87 pshA
9141 A6 80 ldA #-128
9143 87 pshA
9144 B6 91 ldA 0xFFFFFF91
9146 87 pshA
9147 B6 90 ldA 0xFFFFFF90
9149 87 pshA
914A CD 9600 jsr _LcdShBigNum
914D A7 06 aiS #6
914F 95 tSX
(0031) //在指定位置显示点
(0032) //LcdShGr1P(31,64);
(0033) //清除定时器溢出标志位
(0034) T1SC&=~(1<<TOFBit);
9150 1F 20 Bclr 7,0x20
(0035) asm("CLI"); //开总中断
9152 9A clI
9153 86 pulA
9154 B7 4D stA *__rlo
9156 86 pulA
9157 B7 4C stA *__rhi
9159 86 pulA
915A B7 4B stA *__r11
915C 86 pulA
915D B7 4A stA *__r10
915F 86 pulA
9160 B7 49 stA *__r9
9162 86 pulA
9163 B7 48 stA *__r8
9165 86 pulA
9166 B7 47 stA *__r7
9168 86 pulA
9169 B7 46 stA *__r6
916B 86 pulA
916C B7 45 stA *__r5
916E 86 pulA
916F B7 44 stA *__r4
9171 86 pulA
9172 B7 43 stA *__r3
9174 86 pulA
9175 B7 42 stA *__r2
9177 86 pulA
9178 B7 41 stA *__r1
917A 86 pulA
917B B7 40 stA *__r0
917D 8A pulH
917E 80 rti
_isrDummy:
917F 8B pshH
(0036) }
(0037)
(0038) //未定义的中断处理函数,本函数不能删除
(0039) #pragma interrupt_handler isrDummy
(0040) void isrDummy(void)
(0041) {
9180 8A pulH
9181 80 rti
FILE: lcd.c
(0001) /*-------------------------------------------------------------------------*
(0002) *文件描述:本文件包含了液晶显示相关子程序,分别为: *
(0003) *(1)Lcdinit:液晶初始化子程序 *
(0004) *(2)LcdShCh:在液晶显示屏上显示字符数据 *
(0005) *(3)LcdShGrRe:在Lcd的指定行上显示或取消矩型边框 *
(0006) *(4)LcdShGrCil:在Lcd上显示或取消空心圆型 *
(0007) *-------------------------------------------------------------------------*/
(0008)
(0009) //包含头文件
(0010) #include "lcd.h" //Lcd头文件
(0011)
(0012) //定义延时子程序
(0013) #define delay1600us DelayTimes(4000) //延时>1.6ms
(0014) #define delay72us DelayTimes(30) //延时>72us
(0015) #define delay40ms DelayTimes(10000) //延时>40ms
(0016)
(0017) //内部调用函数声明
(0018) //在Lcd指定位置上设置线型16个点的显示
(0019) void LcdShGr16P(INT8U,INT8U,INT16S);
(0020) //在Lcd指定位置上画1个点
(0021) void LcdShGr1P(INT8U,INT8U);
(0022) void DelayTimes(INT16U); //延时指定时间
(0023) void Wtite_Command(INT8U); //将控制命令写入Lcd
(0024) void Wtite_Data(INT8U); //将数据写入Lcd
(0025) void LcdShGrClr(void); //在Lcd上清图形显示屏
(0026)
(0027) /*===========================[Lcd初始化操作]==============================*/
(0028) /*Lcdinit:初始化液晶-------------------------------------------------------*
(0029) *功 能:初始化液晶,设置显示方式,清屏、C自动+1 *
(0030) *参 数:无 *
(0031) *返 回:无 *
(0032) *-------------------------------------------------------------------------*/
(0033) void Lcdinit(void)
(0034) {
_Lcdinit:
9182 12 06 Bset 1,0x06
(0035) /*控制口高四位设置为输出*/
(0036) LCD_CtrlPortDDR|=(1<<LCD_RS);//RS的方向为输出
(0037) LCD_CtrlPortDDR|=(1<<LCD_RW);//RW的方向为输出
9184 14 06 Bset 2,0x06
(0038) LCD_CtrlPortDDR|=(1<<LCD_E); // E的方向为输出
9186 16 06 Bset 3,0x06
(0039) LCD_CtrlPortDDR|=(1<<LCD_BL);//BL的方向为输出
9188 18 06 Bset 4,0x06
(0040) //数据口设置为输出
(0041) LCD_DataPortDDR=0xff;
918A A6 FF ldA #-1
918C B7 05 stA 0x05
(0042) //[Lcd初始化]
(0043) delay40ms; //延时>40ms
918E 45 2710 ldHX #0x2710
9191 89 pshX
9192 8B pshH
9193 CD 95D5 jsr _DelayTimes
9196 A7 02 aiS #2
(0044) Wtite_Command(0b00110000); //8位数据,基本指令
9198 A6 30 ldA #48
919A 87 pshA
919B CD 959F jsr _Wtite_Command
919E A7 01 aiS #1
(0045) Wtite_Command(0b00001100); //开显示
91A0 A6 0C ldA #12
91A2 87 pshA
91A3 CD 959F jsr _Wtite_Command
91A6 A7 01 aiS #1
(0046) Wtite_Command(0b00000001); //清屏
91A8 A6 01 ldA #1
91AA 87 pshA
91AB CD 959F jsr _Wtite_Command
91AE A7 01 aiS #1
(0047) delay1600us; //延时>1.6ms
91B0 45 0FA0 ldHX #0x0FA0
91B3 89 pshX
91B4 8B pshH
91B5 CD 95D5 jsr _DelayTimes
91B8 A7 02 aiS #2
(0048) Wtite_Command(0b00000110); //进入模式设定
91BA A6 06 ldA #6
91BC 87 pshA
91BD CD 959F jsr _Wtite_Command
91C0 A7 01 aiS #1
(0049) LcdShGrClr(); //清Lcd图形显示屏
91C2 CD 94BC jsr _LcdShGrClr
91C5 95 tSX
(0050) LCD_CtrlPort&=~(1<<LCD_BL);//BL=0,打开背光
91C6 19 02 Bclr 4,0x02
91C8 81 rts
_LcdShCh:
i --> X+0
LcdSBuff --> X+3
91C9 A7 FF aiS #-1
91CB 95 tSX
(0051) }
(0052)
(0053) /*=======================[Lcd显示字符操作]================================*/
(0054) /*LcdShCh:在液晶显示屏上显示字符数据---------------------------------------*
(0055) *功 能:在液晶显示屏上显示以LcdSBuff为首地址的64个数据 *
(0056) *参 数:待显示的64个数据的首地址 *
(0057) *返 回:无 *
(0058) *-------------------------------------------------------------------------*/
(0059) void LcdShCh(INT8U *LcdSBuff)
(0060) {
91CC A6 80 ldA #-128
91CE 87 pshA
91CF CD 959F jsr _Wtite_Command
91D2 A7 01 aiS #1
91D4 95 tSX
(0061) unsigned char i; //data数组计数器(0-63)
(0062) //[Lcd显示64个数据]
(0063) Wtite_Command(0x80); //DDRAM地址设置
(0064) for(i=0;i<64;i++) //显示data中的64个数据
91D5 7F clr 0,X
91D6 20 65 bra 0x923D
(0065) {
91D8 F6 ldA 0,X
91D9 A1 0F cmp #15
91DB 23 04 bls 0x91E1
91DD A1 30 cmp #48
91DF 25 19 bcs 0x91FA
(0066) //[Lcd按行显示16个数据]
(0067) if((i<=15)||(i>=48)) //第一行和第四行不变
(0068) Wtite_Data(LcdSBuff[i]);
91E1 3F 40 clr *__r0
91E3 F6 ldA 0,X
91E4 EB 04 add 4,X
91E6 B7 41 stA *__r1
91E8 B6 40 ldA *__r0
91EA E9 03 adc 3,X
91EC B7 40 stA *__r0
91EE 55 40 ldHX *__r0
91F0 F6 ldA 0,X
91F1 87 pshA
91F2 CD 95BA jsr _Wtite_Data
91F5 A7 01 aiS #1
91F7 95 tSX
91F8 20 42 bra 0x923C
(0069) else if(i<=31) //显示的第二行为缓冲的第三行
91FA F6 ldA 0,X
91FB A1 1F cmp #31
91FD 22 1A bhi 0x9219
(0070) Wtite_Data(LcdSBuff[i+16]);
91FF 3F 40 clr *__r0
9201 EB 04 add 4,X
9203 B7 41 stA *__r1
9205 B6 40 ldA *__r0
9207 E9 03 adc 3,X
9209 B7 40 stA *__r0
920B 55 40 ldHX *__r0
920D AF 10 aiX #16
920F F6 ldA 0,X
9210 87 pshA
9211 CD 95BA jsr _Wtite_Data
9214 A7 01 aiS #1
9216 95 tSX
9217 20 23 bra 0x923C
(0071) else //显示的第三行为缓冲的第二行
(0072) Wtite_Data(LcdSBuff[i-16]);
9219 3F 40 clr *__r0
921B F6 ldA 0,X
921C A0 10 sub #16
921E B7 41 stA *__r1
9220 B6 40 ldA *__r0
9222 A2 00 sbc #0
9224 B7 40 stA *__r0
9226 B6 41 ldA *__r1
9228 EB 04 add 4,X
922A B7 41 stA *__r1
922C B6 40 ldA *__r0
922E E9 03 adc 3,X
9230 B7 40 stA *__r0
9232 55 40 ldHX *__r0
9234 F6 ldA 0,X
9235 87 pshA
9236 CD 95BA jsr _Wtite_Data
9239 A7 01 aiS #1
923B 95 tSX
(0073) }
923C 7C inc 0,X
923D F6 ldA 0,X
923E A1 40 cmp #64
9240 25 96 bcs 0x91D8
9242 A7 01 aiS #1
9244 81 rts
_LcdShGrCil:
y --> X+0
mistake --> X+1
x --> X+5
GrE --> X+12
GrCilMV --> X+11
CR --> X+10
Cx --> X+9
Cy --> X+8
9245 A7 FA aiS #-6
9247 95 tSX
(0074) }
(0075)
(0076) /*===[Lcd画图操作:包括画圆,画矩形框,图形清屏,画点等]===================*/
(0077) /*LcdShGrCil:在Lcd上显示或取消空心圆型-------------------------------------*
(0078) *功 能:在Lcd上的指定位置显示或取消空心圆型 *
(0079) *参 数:Cx为圆心横坐标,Cy为圆心纵坐标 *
(0080) * CR为圆的半径,GrE确定图形是否有效 *
(0081) * GrCilMV为显示圆型时的正误差值 *
(0082) * 例如:半径为10,误差为4;半径为30,误差为30 *
(0083) *返 回:无 *
(0084) *-------------------------------------------------------------------------*/
(0085) void LcdShGrCil(INT8U Cy,INT8U Cx,INT8U CR,INT8U GrCilMV,INT8U GrE)
(0086) {
9248 A6 36 ldA #54
924A 87 pshA
924B CD 959F jsr _Wtite_Command
924E A7 01 aiS #1
9250 95 tSX
(0087) INT8U x,y; //坐标的循环控制变量
(0088) INT32S mistake; //显示时的误差值
(0089) Wtite_Command(0b00110110); //扩展指令,绘图开
(0090) for(y=Cy-CR;y<=Cy+CR;y++)
9251 E6 08 ldA 8,X
9253 E0 0A sub 10,X
9255 F7 stA 0,X
9256 CC 93D6 jmp 0x93D6
(0091) for(x=Cx-CR;x<=Cx+CR;x++)
9259 E6 09 ldA 9,X
925B E0 0A sub 10,X
925D E7 05 stA 5,X
925F CC 93C6 jmp 0x93C6
(0092) {
9262 3F 40 clr *__r0
9264 E6 09 ldA 9,X
9266 B7 41 stA *__r1
9268 3F 42 clr *__r2
926A E6 05 ldA 5,X
926C B0 41 sub *__r1
926E B7 41 stA *__r1
9270 B6 42 ldA *__r2
9272 B2 40 sbc *__r0
9274 B7 40 stA *__r0
9276 3F 42 clr *__r2
9278 E6 08 ldA 8,X
927A B7 43 stA *__r3
927C 3F 44 clr *__r4
927E F6 ldA 0,X
927F B0 43 sub *__r3
9281 B7 43 stA *__r3
9283 B6 44 ldA *__r4
9285 B2 42 sbc *__r2
9287 B7 42 stA *__r2
9289 B6 43 ldA *__r3
928B 87 pshA
928C B6 42 ldA *__r2
928E 87 pshA
928F B6 43 ldA *__r3
9291 87 pshA
9292 B6 42 ldA *__r2
9294 87 pshA
9295 CD 9998 jsr __mul16
9298 A7 04 aiS #4
929A 4E 4D43 mov *__rlo,*__r3
929D 4E 4C42 mov *__rhi,*__r2
92A0 B6 41 ldA *__r1
92A2 87 pshA
92A3 B6 40 ldA *__r0
92A5 87 pshA
92A6 B6 41 ldA *__r1
92A8 87 pshA
92A9 B6 40 ldA *__r0
92AB 87 pshA
92AC CD 9998 jsr __mul16
92AF A7 04 aiS #4
92B1 4E 4D41 mov *__rlo,*__r1
92B4 4E 4C40 mov *__rhi,*__r0
92B7 B6 41 ldA *__r1
92B9 BB 43 add *__r3
92BB B7 41 stA *__r1
92BD B6 40 ldA *__r0
92BF B9 42 adc *__r2
92C1 B7 40 stA *__r0
92C3 3F 42 clr *__r2
92C5 E6 0A ldA 10,X
92C7 B7 43 stA *__r3
92C9 3F 44 clr *__r4
92CB E6 0A ldA 10,X
92CD 87 pshA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -