📄 lcd.lis
字号:
.module lcd.c
.area text
0000 .dbfile lcd.c
0000 .dbfunc e Lcdinit _Lcdinit fV
0000 _Lcdinit::
0000 .dbline -1
0000 .dbline 31
0000 ; /*-----------------------------------------------------*
0000 ; *文件描述:本文件包含了液晶显示相关子程序,分别为: *
0000 ; *(1)Lcdinit:液晶初始化子程序 *
0000 ; *(2)LcdShCh:在液晶显示屏上显示字符数据 *
0000 ; *(3)LcdShGrRe:在Lcd的指定行上显示或取消矩型边框 *
0000 ; *(4)LcdShGrCil:在Lcd上显示或取消空心圆型 *
0000 ; *-----------------------------------------------------*/
0000 ; //包含头文件
0000 ; #include "Includes.h"
0000 ; //定义延时子程序
0000 ; #define delay1600us DelayTimes(4000) //延时>1.6ms
0000 ; #define delay72us DelayTimes(30) //延时>72us
0000 ; #define delay40ms DelayTimes(10000) //延时>40ms
0000 ; //内部调用函数声明
0000 ; void DelayTimes(unsigned int); //延时指定时间
0000 ; void Wtite_Command(unsigned char);//将控制命令写入Lcd
0000 ; void Wtite_Data(unsigned char); //将数据写入Lcd
0000 ; void LcdShGrClr(void); //在Lcd上清图形显示屏
0000 ; //在Lcd指定位置上设置线型16个点的显示
0000 ; void LcdShGr16P(unsigned char,unsigned char,int);
0000 ; //在Lcd指定位置上画1个点
0000 ; void LcdShGr1P(unsigned char,unsigned char);
0000 ;
0000 ; //==================[Lcd初始化操作]==========================
0000 ; /*Lcdinit:初始化液晶-----------------------------------*
0000 ; *功 能:初始化液晶,设置显示方式,清屏、C自动+1 *
0000 ; *参 数:无 *
0000 ; *返 回:无 *
0000 ; *-----------------------------------------------------*/
0000 ; void Lcdinit(void)
0000 ; {
0000 .dbline 32
0000 ; LCD_CtrlPortDDR |=0xF0; //控制口高四位设置为输出
0000 B607 lda 0x7
0002 AAF0 ora #-16
0004 B707 sta 0x7
0006 .dbline 33
0006 ; LCD_DataPortDDR=0xff; //数据口设置为输出
0006 A6FF lda #-1
0008 B705 sta 0x5
000A .dbline 35
000A ; //[Lcd初始化]
000A ; delay40ms; //延时>40ms
000A 452710 ldhx #10000
000D 89 pshx
000E 8B pshh
000F CD044F jsr _DelayTimes
0012 A702 ais #2
0014 .dbline 36
0014 ; Wtite_Command(0b00110000); //8位数据,基本指令
0014 A630 lda #48
0016 87 psha
0017 CD0419 jsr _Wtite_Command
001A A701 ais #1
001C .dbline 37
001C ; Wtite_Command(0b00001100); //开显示
001C A60C lda #12
001E 87 psha
001F CD0419 jsr _Wtite_Command
0022 A701 ais #1
0024 .dbline 38
0024 ; Wtite_Command(0b00000001); //清屏
0024 A601 lda #1
0026 87 psha
0027 CD0419 jsr _Wtite_Command
002A A701 ais #1
002C .dbline 39
002C ; delay1600us; //延时>1.6ms
002C 450FA0 ldhx #4000
002F 89 pshx
0030 8B pshh
0031 CD044F jsr _DelayTimes
0034 A702 ais #2
0036 .dbline 40
0036 ; Wtite_Command(0b00000110); //进入模式设定
0036 A606 lda #6
0038 87 psha
0039 CD0419 jsr _Wtite_Command
003C A701 ais #1
003E .dbline 41
003E ; LcdShGrClr(); //清Lcd图形显示屏
003E CD0336 jsr _LcdShGrClr
0041 95 tsx
0042 .dbline -2
0042 L1:
0042 .dbline 0 ; func end
0042 81 rts
0043 .dbend
0043 .dbfunc e LcdShCh _LcdShCh fV
0043 ; i -> 0,X
0043 ; LcdSBuff -> 3,X
0043 _LcdShCh::
0043 .dbline -1
0043 A7FF ais #-1
0045 95 tsx
0046 .dbline 52
0046 ; //LCD_CtrlPort&=~(1<<LCD_BL);//BL=0,打开背光
0046 ; }
0046 ;
0046 ; //==================[Lcd显示字符操作]========================
0046 ; /*LcdShCh:在液晶显示屏上显示字符数据-------------------*
0046 ; *功 能:在液晶显示屏上显示以LcdSBuff为首地址的64个数据 *
0046 ; *参 数:待显示的64个数据的首地址 *
0046 ; *返 回:无 *
0046 ; *-----------------------------------------------------*/
0046 ; void LcdShCh(unsigned char *LcdSBuff)
0046 ; {
0046 .dbline 55
0046 ; unsigned char i; //data数组计数器(0-63)
0046 ; //[Lcd显示64个数据]
0046 ; Wtite_Command(0x80); //DDRAM地址设置
0046 A680 lda #-128
0048 87 psha
0049 CD0419 jsr _Wtite_Command
004C A701 ais #1
004E 95 tsx
004F .dbline 56
004F ; for(i=0;i<64;i++) //显示data中的64个数据
004F 7F clr ,X
0050 2065 bra L6
0052 L3:
0052 .dbline 57
0052 ; {
0052 .dbline 59
0052 ; //[Lcd按行显示16个数据]
0052 ; if((i<=15)||(i>=48)) //第一行和第四行不变
0052 F6 lda ,X
0053 A10F cmp #15
0055 2304 bls L9
0057 A130 cmp #48
0059 2519 blo L7
005B L9:
005B .dbline 60
005B ; Wtite_Data(LcdSBuff[i]);
005B 3F00 clr *__r0
005D F6 lda ,X
005E EB04 add 4,X
0060 B700 sta *__r1
0062 B600 lda *__r0
0064 E903 adc 3,X
0066 B700 sta *__r0
0068 5500 ldhx *__r0
006A F6 lda ,x
006B 87 psha
006C CD0434 jsr _Wtite_Data
006F A701 ais #1
0071 95 tsx
0072 2042 bra L8
0074 L7:
0074 .dbline 61
0074 ; else if(i<=31) //显示的第二行为缓冲的第三行
0074 F6 lda ,X
0075 A11F cmp #31
0077 221A bhi L10
0079 .dbline 62
0079 ; Wtite_Data(LcdSBuff[i+16]);
0079 3F00 clr *__r0
007B EB04 add 4,X
007D B700 sta *__r1
007F B600 lda *__r0
0081 E903 adc 3,X
0083 B700 sta *__r0
0085 5500 ldhx *__r0
0087 AF10 aix #16
0089 F6 lda ,x
008A 87 psha
008B CD0434 jsr _Wtite_Data
008E A701 ais #1
0090 95 tsx
0091 2023 bra L11
0093 L10:
0093 .dbline 64
0093 ; else //显示的第三行为缓冲的第二行
0093 ; Wtite_Data(LcdSBuff[i-16]);
0093 3F00 clr *__r0
0095 F6 lda ,X
0096 A010 sub #16
0098 B700 sta *__r1
009A B600 lda *__r0
009C A200 sbc #0
009E B700 sta *__r0
00A0 B600 lda *__r1
00A2 EB04 add 4,X
00A4 B700 sta *__r1
00A6 B600 lda *__r0
00A8 E903 adc 3,X
00AA B700 sta *__r0
00AC 5500 ldhx *__r0
00AE F6 lda ,x
00AF 87 psha
00B0 CD0434 jsr _Wtite_Data
00B3 A701 ais #1
00B5 95 tsx
00B6 L11:
00B6 L8:
00B6 .dbline 65
00B6 L4:
00B6 .dbline 56
00B6 7C inc ,X
00B7 L6:
00B7 .dbline 56
00B7 F6 lda ,X
00B8 A140 cmp #64
00BA 2596 blo L3
00BC .dbline -2
00BC L2:
00BC A701 ais #1
00BE .dbline 0 ; func end
00BE 81 rts
00BF .dbsym l i 0 c
00BF .dbsym l LcdSBuff 3 pc
00BF .dbend
00BF .dbfunc e LcdShGrCil _LcdShGrCil fV
00BF ; y -> 0,X
00BF ; mistake -> 1,X
00BF ; x -> 5,X
00BF ; GrE -> 12,X
00BF ; GrCilMV -> 11,X
00BF ; CR -> 10,X
00BF ; Cx -> 9,X
00BF ; Cy -> 8,X
00BF _LcdShGrCil::
00BF .dbline -1
00BF A7FA ais #-6
00C1 95 tsx
00C2 .dbline 80
00C2 ; }
00C2 ; }
00C2 ;
00C2 ; //=====[Lcd画图操作:包括画圆,画矩形框,图形清屏,画点等]=====
00C2 ; /*LcdShGrCil:在Lcd上显示或取消空心圆型-----------------*
00C2 ; *功 能:在Lcd上的指定位置显示或取消空心圆型 *
00C2 ; *参 数:Cx为圆心横坐标,Cy为圆心纵坐标 *
00C2 ; * CR为圆的半径,GrE确定图形是否有效 *
00C2 ; * GrCilMV为显示圆型时的正误差值 *
00C2 ; * 例如:半径为10,误差为4;半径为30,误差为30 *
00C2 ; *返 回:无 *
00C2 ; *-----------------------------------------------------*/
00C2 ; void LcdShGrCil(unsigned char Cy,unsigned char Cx,
00C2 ; unsigned char CR,unsigned char
00C2 ; GrCilMV,unsigned char GrE)
00C2 ; {
00C2 .dbline 83
00C2 ; unsigned char x,y; //坐标的循环控制变量
00C2 ; long int mistake; //显示时的误差值
00C2 ; Wtite_Command(0b00110110); //扩展指令,绘图开
00C2 A636 lda #54
00C4 87 psha
00C5 CD0419 jsr _Wtite_Command
00C8 A701 ais #1
00CA 95 tsx
00CB .dbline 84
00CB ; for(y=Cy-CR;y<=Cy+CR;y++)
00CB E608 lda 8,X
00CD E00A sub 10,X
00CF F7 sta ,X
00D0 CC0250 jmp L16
00D3 L13:
00D3 .dbline 85
00D3 ; for(x=Cx-CR;x<=Cx+CR;x++)
00D3 E609 lda 9,X
00D5 E00A sub 10,X
00D7 E705 sta 5,X
00D9 CC0240 jmp L20
00DC L17:
00DC .dbline 86
00DC ; {
00DC .dbline 87
00DC ; mistake=(x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)-CR*CR;
00DC 3F00 clr *__r0
00DE E609 lda 9,X
00E0 B700 sta *__r1
00E2 3F00 clr *__r2
00E4 E605 lda 5,X
00E6 B000 sub *__r1
00E8 B700 sta *__r1
00EA B600 lda *__r2
00EC B200 sbc *__r0
00EE B700 sta *__r0
00F0 3F00 clr *__r2
00F2 E608 lda 8,X
00F4 B700 sta *__r3
00F6 3F00 clr *__r4
00F8 F6 lda ,X
00F9 B000 sub *__r3
00FB B700 sta *__r3
00FD B600 lda *__r4
00FF B200 sbc *__r2
0101 B700 sta *__r2
0103 B600 lda *__r3
0105 87 psha
0106 B600 lda *__r2
0108 87 psha
0109 B600 lda *__r3
010B 87 psha
010C B600 lda *__r2
010E 87 psha
010F CD0000 jsr __mul16
0112 A704 ais #4
0114 4E0000 mov *__rlo,*__r3
0117 4E0000 mov *__rhi,*__r2
011A B600 lda *__r1
011C 87 psha
011D B600 lda *__r0
011F 87 psha
0120 B600 lda *__r1
0122 87 psha
0123 B600 lda *__r0
0125 87 psha
0126 CD0000 jsr __mul16
0129 A704 ais #4
012B 4E0000 mov *__rlo,*__r1
012E 4E0000 mov *__rhi,*__r0
0131 B600 lda *__r1
0133 BB00 add *__r3
0135 B700 sta *__r1
0137 B600 lda *__r0
0139 B900 adc *__r2
013B B700 sta *__r0
013D 3F00 clr *__r2
013F E60A lda 10,X
0141 B700 sta *__r3
0143 3F00 clr *__r4
0145 E60A lda 10,X
0147 87 psha
0148 B600 lda *__r4
014A 87 psha
014B B600 lda *__r3
014D 87 psha
014E B600 lda *__r2
0150 87 psha
0151 CD0000 jsr __mul16
0154 A704 ais #4
0156 4E0000 mov *__rlo,*__r3
0159 4E0000 mov *__rhi,*__r2
015C B600 lda *__r1
015E B000 sub *__r3
0160 B700 sta *__r1
0162 B600 lda *__r0
0164 B200 sbc *__r2
0166 B700 sta *__r0
0168 4F clra
0169 E702 sta 2,X
016B E701 sta 1,X
016D B600 lda *__r1
016F E704 sta 4,X
0171 B600 lda *__r0
0173 E703 sta 3,X
0175 2A04 bpl X0
0177 6302 com 2,X
0179 6301 com 1,X
017B X0:
017B .dbline 89
017B ; //误差在范围之内时,显示该点
017B ; if((mistake<=GrCilMV)&&(mistake>=-GrCilMV))
017B 3F00 clr *__r2
017D 3F00 clr *__r1
017F 3F00 clr *__r0
0181 E60B lda 11,X
0183 B700 sta *__r3
0185 E604 lda 4,X
0187 87 psha
0188 E603 lda 3,X
018A 87 psha
018B E602 lda 2,X
018D 87 psha
018E E601 lda 1,X
0190 87 psha
0191 B600 lda *__r3
0193 87 psha
0194 B600 lda *__r2
0196 87 psha
0197 B600 lda *__r1
0199 87 psha
019A B600 lda *__r0
019C 87 psha
019D CD0000 jsr __cmp32
01A0 A708 ais #8
01A2 9303 ble X2
01A4 CC023E jmp L21
01A7 X2:
01A7 3F00 clr *__r0
01A9 E60B lda 11,X
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -