📄 lcd.lis
字号:
.module lcd.c
.area text
0000 .dbfile lcd.c
0000 .dbfunc e Lcdinit _Lcdinit fV
0000 _Lcdinit::
0000 .dbline -1
0000 .dbline 33
0000 ; /*-----------------------------------------------------*
0000 ; *文件描述:本文件包含了液晶显示相关子程序,分别为: *
0000 ; *(1)Lcdinit:液晶初始化子程序 *
0000 ; *(2)LcdShCh:在液晶显示屏上显示字符数据 *
0000 ; *(3)LcdShGrRe:在Lcd的指定行上显示或取消矩型边框 *
0000 ; *(4)LcdShGrCil:在Lcd上显示或取消空心圆型 *
0000 ; *-----------------------------------------------------*/
0000 ;
0000 ; //包含头文件
0000 ; #include "gp32c.h"
0000 ; #include "lcd.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 34
0000 ; LCD_CtrlPortDDR=0x07; //控制口低三位设置为输出
0000 A607 lda #7
0002 B706 sta 0x6
0004 .dbline 35
0004 ; LCD_DataPortDDR=0xff; //数据口设置为输出
0004 A6FF lda #-1
0006 B705 sta 0x5
0008 .dbline 37
0008 ; //[Lcd初始化]
0008 ; delay40ms; //延时>40ms
0008 452710 ldhx #10000
000B 89 pshx
000C 8B pshh
000D CD044D jsr _DelayTimes
0010 A702 ais #2
0012 .dbline 38
0012 ; Wtite_Command(0b00110000); //8位数据,基本指令
0012 A630 lda #48
0014 87 psha
0015 CD0417 jsr _Wtite_Command
0018 A701 ais #1
001A .dbline 39
001A ; Wtite_Command(0b00001100); //开显示
001A A60C lda #12
001C 87 psha
001D CD0417 jsr _Wtite_Command
0020 A701 ais #1
0022 .dbline 40
0022 ; Wtite_Command(0b00000001); //清屏
0022 A601 lda #1
0024 87 psha
0025 CD0417 jsr _Wtite_Command
0028 A701 ais #1
002A .dbline 41
002A ; delay1600us; //延时>1.6ms
002A 450FA0 ldhx #4000
002D 89 pshx
002E 8B pshh
002F CD044D jsr _DelayTimes
0032 A702 ais #2
0034 .dbline 42
0034 ; Wtite_Command(0b00000110); //进入模式设定
0034 A606 lda #6
0036 87 psha
0037 CD0417 jsr _Wtite_Command
003A A701 ais #1
003C .dbline 43
003C ; LcdShGrClr(); //清Lcd图形显示屏
003C CD0334 jsr _LcdShGrClr
003F 95 tsx
0040 .dbline -2
0040 L1:
0040 .dbline 0 ; func end
0040 81 rts
0041 .dbend
0041 .dbfunc e LcdShCh _LcdShCh fV
0041 ; i -> 0,X
0041 ; LcdSBuff -> 3,X
0041 _LcdShCh::
0041 .dbline -1
0041 A7FF ais #-1
0043 95 tsx
0044 .dbline 53
0044 ; }
0044 ;
0044 ; //==================[Lcd显示字符操作]========================
0044 ; /*LcdShCh:在液晶显示屏上显示字符数据-------------------*
0044 ; *功 能:在液晶显示屏上显示以LcdSBuff为首地址的64个数据 *
0044 ; *参 数:待显示的64个数据的首地址 *
0044 ; *返 回:无 *
0044 ; *-----------------------------------------------------*/
0044 ; void LcdShCh(unsigned char *LcdSBuff)
0044 ; {
0044 .dbline 56
0044 ; unsigned char i; //data数组计数器(0-63)
0044 ; //[Lcd显示64个数据]
0044 ; Wtite_Command(0x80); //DDRAM地址设置
0044 A680 lda #-128
0046 87 psha
0047 CD0417 jsr _Wtite_Command
004A A701 ais #1
004C 95 tsx
004D .dbline 57
004D ; for(i=0;i<64;i++) //显示data中的64个数据
004D 7F clr ,X
004E 2065 bra L6
0050 L3:
0050 .dbline 58
0050 ; {
0050 .dbline 60
0050 ; //[Lcd按行显示16个数据]
0050 ; if((i<=15)||(i>=48)) //第一行和第四行不变
0050 F6 lda ,X
0051 A10F cmp #15
0053 2304 bls L9
0055 A130 cmp #48
0057 2519 blo L7
0059 L9:
0059 .dbline 61
0059 ; Wtite_Data(LcdSBuff[i]);
0059 3F00 clr *__r0
005B F6 lda ,X
005C EB04 add 4,X
005E B700 sta *__r1
0060 B600 lda *__r0
0062 E903 adc 3,X
0064 B700 sta *__r0
0066 5500 ldhx *__r0
0068 F6 lda ,x
0069 87 psha
006A CD0432 jsr _Wtite_Data
006D A701 ais #1
006F 95 tsx
0070 2042 bra L8
0072 L7:
0072 .dbline 62
0072 ; else if(i<=31) //显示的第二行为缓冲的第三行
0072 F6 lda ,X
0073 A11F cmp #31
0075 221A bhi L10
0077 .dbline 63
0077 ; Wtite_Data(LcdSBuff[i+16]);
0077 3F00 clr *__r0
0079 EB04 add 4,X
007B B700 sta *__r1
007D B600 lda *__r0
007F E903 adc 3,X
0081 B700 sta *__r0
0083 5500 ldhx *__r0
0085 AF10 aix #16
0087 F6 lda ,x
0088 87 psha
0089 CD0432 jsr _Wtite_Data
008C A701 ais #1
008E 95 tsx
008F 2023 bra L11
0091 L10:
0091 .dbline 65
0091 ; else //显示的第三行为缓冲的第二行
0091 ; Wtite_Data(LcdSBuff[i-16]);
0091 3F00 clr *__r0
0093 F6 lda ,X
0094 A010 sub #16
0096 B700 sta *__r1
0098 B600 lda *__r0
009A A200 sbc #0
009C B700 sta *__r0
009E B600 lda *__r1
00A0 EB04 add 4,X
00A2 B700 sta *__r1
00A4 B600 lda *__r0
00A6 E903 adc 3,X
00A8 B700 sta *__r0
00AA 5500 ldhx *__r0
00AC F6 lda ,x
00AD 87 psha
00AE CD0432 jsr _Wtite_Data
00B1 A701 ais #1
00B3 95 tsx
00B4 L11:
00B4 L8:
00B4 .dbline 66
00B4 L4:
00B4 .dbline 57
00B4 7C inc ,X
00B5 L6:
00B5 .dbline 57
00B5 F6 lda ,X
00B6 A140 cmp #64
00B8 2596 blo L3
00BA .dbline -2
00BA L2:
00BA A701 ais #1
00BC .dbline 0 ; func end
00BC 81 rts
00BD .dbsym l i 0 c
00BD .dbsym l LcdSBuff 3 pc
00BD .dbend
00BD .dbfunc e LcdShGrCil _LcdShGrCil fV
00BD ; y -> 0,X
00BD ; mistake -> 1,X
00BD ; x -> 5,X
00BD ; GrE -> 12,X
00BD ; GrCilMV -> 11,X
00BD ; CR -> 10,X
00BD ; Cx -> 9,X
00BD ; Cy -> 8,X
00BD _LcdShGrCil::
00BD .dbline -1
00BD A7FA ais #-6
00BF 95 tsx
00C0 .dbline 81
00C0 ; }
00C0 ; }
00C0 ;
00C0 ; //=====[Lcd画图操作:包括画圆,画矩形框,图形清屏,画点等]=====
00C0 ; /*LcdShGrCil:在Lcd上显示或取消空心圆型-----------------*
00C0 ; *功 能:在Lcd上的指定位置显示或取消空心圆型 *
00C0 ; *参 数:Cx为圆心横坐标,Cy为圆心纵坐标 *
00C0 ; * CR为圆的半径,GrE确定图形是否有效 *
00C0 ; * GrCilMV为显示圆型时的正误差值 *
00C0 ; * 例如:半径为10,误差为4;半径为30,误差为30 *
00C0 ; *返 回:无 *
00C0 ; *-----------------------------------------------------*/
00C0 ; void LcdShGrCil(unsigned char Cy,unsigned char Cx,
00C0 ; unsigned char CR,unsigned char
00C0 ; GrCilMV,unsigned char GrE)
00C0 ; {
00C0 .dbline 84
00C0 ; unsigned char x,y; //坐标的循环控制变量
00C0 ; long int mistake; //显示时的误差值
00C0 ; Wtite_Command(0b00110110); //扩展指令,绘图开
00C0 A636 lda #54
00C2 87 psha
00C3 CD0417 jsr _Wtite_Command
00C6 A701 ais #1
00C8 95 tsx
00C9 .dbline 85
00C9 ; for(y=Cy-CR;y<=Cy+CR;y++)
00C9 E608 lda 8,X
00CB E00A sub 10,X
00CD F7 sta ,X
00CE CC024E jmp L16
00D1 L13:
00D1 .dbline 86
00D1 ; for(x=Cx-CR;x<=Cx+CR;x++)
00D1 E609 lda 9,X
00D3 E00A sub 10,X
00D5 E705 sta 5,X
00D7 CC023E jmp L20
00DA L17:
00DA .dbline 87
00DA ; {
00DA .dbline 88
00DA ; mistake=(x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)-CR*CR;
00DA 3F00 clr *__r0
00DC E609 lda 9,X
00DE B700 sta *__r1
00E0 3F00 clr *__r2
00E2 E605 lda 5,X
00E4 B000 sub *__r1
00E6 B700 sta *__r1
00E8 B600 lda *__r2
00EA B200 sbc *__r0
00EC B700 sta *__r0
00EE 3F00 clr *__r2
00F0 E608 lda 8,X
00F2 B700 sta *__r3
00F4 3F00 clr *__r4
00F6 F6 lda ,X
00F7 B000 sub *__r3
00F9 B700 sta *__r3
00FB B600 lda *__r4
00FD B200 sbc *__r2
00FF B700 sta *__r2
0101 B600 lda *__r3
0103 87 psha
0104 B600 lda *__r2
0106 87 psha
0107 B600 lda *__r3
0109 87 psha
010A B600 lda *__r2
010C 87 psha
010D CD0000 jsr __mul16
0110 A704 ais #4
0112 4E0000 mov *__rlo,*__r3
0115 4E0000 mov *__rhi,*__r2
0118 B600 lda *__r1
011A 87 psha
011B B600 lda *__r0
011D 87 psha
011E B600 lda *__r1
0120 87 psha
0121 B600 lda *__r0
0123 87 psha
0124 CD0000 jsr __mul16
0127 A704 ais #4
0129 4E0000 mov *__rlo,*__r1
012C 4E0000 mov *__rhi,*__r0
012F B600 lda *__r1
0131 BB00 add *__r3
0133 B700 sta *__r1
0135 B600 lda *__r0
0137 B900 adc *__r2
0139 B700 sta *__r0
013B 3F00 clr *__r2
013D E60A lda 10,X
013F B700 sta *__r3
0141 3F00 clr *__r4
0143 E60A lda 10,X
0145 87 psha
0146 B600 lda *__r4
0148 87 psha
0149 B600 lda *__r3
014B 87 psha
014C B600 lda *__r2
014E 87 psha
014F CD0000 jsr __mul16
0152 A704 ais #4
0154 4E0000 mov *__rlo,*__r3
0157 4E0000 mov *__rhi,*__r2
015A B600 lda *__r1
015C B000 sub *__r3
015E B700 sta *__r1
0160 B600 lda *__r0
0162 B200 sbc *__r2
0164 B700 sta *__r0
0166 4F clra
0167 E702 sta 2,X
0169 E701 sta 1,X
016B B600 lda *__r1
016D E704 sta 4,X
016F B600 lda *__r0
0171 E703 sta 3,X
0173 2A04 bpl X0
0175 6302 com 2,X
0177 6301 com 1,X
0179 X0:
0179 .dbline 90
0179 ; //误差在范围之内时,显示该点
0179 ; if((mistake<=GrCilMV)&&(mistake>=-GrCilMV))
0179 3F00 clr *__r2
017B 3F00 clr *__r1
017D 3F00 clr *__r0
017F E60B lda 11,X
0181 B700 sta *__r3
0183 E604 lda 4,X
0185 87 psha
0186 E603 lda 3,X
0188 87 psha
0189 E602 lda 2,X
018B 87 psha
018C E601 lda 1,X
018E 87 psha
018F B600 lda *__r3
0191 87 psha
0192 B600 lda *__r2
0194 87 psha
0195 B600 lda *__r1
0197 87 psha
0198 B600 lda *__r0
019A 87 psha
019B CD0000 jsr __cmp32
019E A708 ais #8
01A0 9303 ble X2
01A2 CC023C jmp L21
01A5 X2:
01A5 3F00 clr *__r0
01A7 E60B lda 11,X
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -