📄 lcd.lis
字号:
.module lcd.c
.area text
0000 .dbfile lcd.c
0000 .dbfunc e Lcdinit _Lcdinit fV
0000 _Lcdinit::
0000 .dbline -1
0000 .dbline 34
0000 ; /*-------------------------------------------------------------------------*
0000 ; *文件描述:本文件包含了液晶显示相关子程序,分别为: *
0000 ; *(1)Lcdinit:液晶初始化子程序 *
0000 ; *(2)LcdShCh:在液晶显示屏上显示字符数据 *
0000 ; *(3)LcdShGrRe:在Lcd的指定行上显示或取消矩型边框 *
0000 ; *(4)LcdShGrCil:在Lcd上显示或取消空心圆型 *
0000 ; *-------------------------------------------------------------------------*/
0000 ;
0000 ; //包含头文件
0000 ; #include "lcd.h" //Lcd头文件
0000 ;
0000 ; //定义延时子程序
0000 ; #define delay1600us DelayTimes(4000) //延时>1.6ms
0000 ; #define delay72us DelayTimes(30) //延时>72us
0000 ; #define delay40ms DelayTimes(10000) //延时>40ms
0000 ;
0000 ; //内部调用函数声明
0000 ; //在Lcd指定位置上设置线型16个点的显示
0000 ; void LcdShGr16P(INT8U,INT8U,INT16S);
0000 ; //在Lcd指定位置上画1个点
0000 ; void LcdShGr1P(INT8U,INT8U);
0000 ; void DelayTimes(INT16U); //延时指定时间
0000 ; void Wtite_Command(INT8U); //将控制命令写入Lcd
0000 ; void Wtite_Data(INT8U); //将数据写入Lcd
0000 ; void LcdShGrClr(void); //在Lcd上清图形显示屏
0000 ;
0000 ; /*===========================[Lcd初始化操作]==============================*/
0000 ; /*Lcdinit:初始化液晶-------------------------------------------------------*
0000 ; *功 能:初始化液晶,设置显示方式,清屏、C自动+1 *
0000 ; *参 数:无 *
0000 ; *返 回:无 *
0000 ; *-------------------------------------------------------------------------*/
0000 ; void Lcdinit(void)
0000 ; {
0000 .dbline 36
0000 ; /*控制口高四位设置为输出*/
0000 ; LCD_CtrlPortDDR|=(1<<LCD_RS);//RS的方向为输出
0000 1206 bset #1,0x6
0002 .dbline 37
0002 ; LCD_CtrlPortDDR|=(1<<LCD_RW);//RW的方向为输出
0002 1406 bset #2,0x6
0004 .dbline 38
0004 ; LCD_CtrlPortDDR|=(1<<LCD_E); // E的方向为输出
0004 1606 bset #3,0x6
0006 .dbline 39
0006 ; LCD_CtrlPortDDR|=(1<<LCD_BL);//BL的方向为输出
0006 1806 bset #4,0x6
0008 .dbline 41
0008 ; //数据口设置为输出
0008 ; LCD_DataPortDDR=0xff;
0008 A6FF lda #-1
000A B705 sta 0x5
000C .dbline 43
000C ; //[Lcd初始化]
000C ; delay40ms; //延时>40ms
000C 452710 ldhx #10000
000F 89 pshx
0010 8B pshh
0011 CD0453 jsr _DelayTimes
0014 A702 ais #2
0016 .dbline 44
0016 ; Wtite_Command(0b00110000); //8位数据,基本指令
0016 A630 lda #48
0018 87 psha
0019 CD041D jsr _Wtite_Command
001C A701 ais #1
001E .dbline 45
001E ; Wtite_Command(0b00001100); //开显示
001E A60C lda #12
0020 87 psha
0021 CD041D jsr _Wtite_Command
0024 A701 ais #1
0026 .dbline 46
0026 ; Wtite_Command(0b00000001); //清屏
0026 A601 lda #1
0028 87 psha
0029 CD041D jsr _Wtite_Command
002C A701 ais #1
002E .dbline 47
002E ; delay1600us; //延时>1.6ms
002E 450FA0 ldhx #4000
0031 89 pshx
0032 8B pshh
0033 CD0453 jsr _DelayTimes
0036 A702 ais #2
0038 .dbline 48
0038 ; Wtite_Command(0b00000110); //进入模式设定
0038 A606 lda #6
003A 87 psha
003B CD041D jsr _Wtite_Command
003E A701 ais #1
0040 .dbline 49
0040 ; LcdShGrClr(); //清Lcd图形显示屏
0040 CD033A jsr _LcdShGrClr
0043 95 tsx
0044 .dbline 50
0044 ; LCD_CtrlPort&=~(1<<LCD_BL);//BL=0,打开背光
0044 1902 bclr #4,0x2
0046 .dbline -2
0046 L1:
0046 .dbline 0 ; func end
0046 81 rts
0047 .dbend
0047 .dbfunc e LcdShCh _LcdShCh fV
0047 ; i -> 0,X
0047 ; LcdSBuff -> 3,X
0047 _LcdShCh::
0047 .dbline -1
0047 A7FF ais #-1
0049 95 tsx
004A .dbline 60
004A ; }
004A ;
004A ; /*=======================[Lcd显示字符操作]================================*/
004A ; /*LcdShCh:在液晶显示屏上显示字符数据---------------------------------------*
004A ; *功 能:在液晶显示屏上显示以LcdSBuff为首地址的64个数据 *
004A ; *参 数:待显示的64个数据的首地址 *
004A ; *返 回:无 *
004A ; *-------------------------------------------------------------------------*/
004A ; void LcdShCh(INT8U *LcdSBuff)
004A ; {
004A .dbline 63
004A ; unsigned char i; //data数组计数器(0-63)
004A ; //[Lcd显示64个数据]
004A ; Wtite_Command(0x80); //DDRAM地址设置
004A A680 lda #-128
004C 87 psha
004D CD041D jsr _Wtite_Command
0050 A701 ais #1
0052 95 tsx
0053 .dbline 64
0053 ; for(i=0;i<64;i++) //显示data中的64个数据
0053 7F clr ,X
0054 2065 bra L6
0056 L3:
0056 .dbline 65
0056 ; {
0056 .dbline 67
0056 ; //[Lcd按行显示16个数据]
0056 ; if((i<=15)||(i>=48)) //第一行和第四行不变
0056 F6 lda ,X
0057 A10F cmp #15
0059 2304 bls L9
005B A130 cmp #48
005D 2519 blo L7
005F L9:
005F .dbline 68
005F ; Wtite_Data(LcdSBuff[i]);
005F 3F00 clr *__r0
0061 F6 lda ,X
0062 EB04 add 4,X
0064 B700 sta *__r1
0066 B600 lda *__r0
0068 E903 adc 3,X
006A B700 sta *__r0
006C 5500 ldhx *__r0
006E F6 lda ,x
006F 87 psha
0070 CD0438 jsr _Wtite_Data
0073 A701 ais #1
0075 95 tsx
0076 2042 bra L8
0078 L7:
0078 .dbline 69
0078 ; else if(i<=31) //显示的第二行为缓冲的第三行
0078 F6 lda ,X
0079 A11F cmp #31
007B 221A bhi L10
007D .dbline 70
007D ; Wtite_Data(LcdSBuff[i+16]);
007D 3F00 clr *__r0
007F EB04 add 4,X
0081 B700 sta *__r1
0083 B600 lda *__r0
0085 E903 adc 3,X
0087 B700 sta *__r0
0089 5500 ldhx *__r0
008B AF10 aix #16
008D F6 lda ,x
008E 87 psha
008F CD0438 jsr _Wtite_Data
0092 A701 ais #1
0094 95 tsx
0095 2023 bra L11
0097 L10:
0097 .dbline 72
0097 ; else //显示的第三行为缓冲的第二行
0097 ; Wtite_Data(LcdSBuff[i-16]);
0097 3F00 clr *__r0
0099 F6 lda ,X
009A A010 sub #16
009C B700 sta *__r1
009E B600 lda *__r0
00A0 A200 sbc #0
00A2 B700 sta *__r0
00A4 B600 lda *__r1
00A6 EB04 add 4,X
00A8 B700 sta *__r1
00AA B600 lda *__r0
00AC E903 adc 3,X
00AE B700 sta *__r0
00B0 5500 ldhx *__r0
00B2 F6 lda ,x
00B3 87 psha
00B4 CD0438 jsr _Wtite_Data
00B7 A701 ais #1
00B9 95 tsx
00BA L11:
00BA L8:
00BA .dbline 73
00BA L4:
00BA .dbline 64
00BA 7C inc ,X
00BB L6:
00BB .dbline 64
00BB F6 lda ,X
00BC A140 cmp #64
00BE 2596 blo L3
00C0 .dbline -2
00C0 L2:
00C0 A701 ais #1
00C2 .dbline 0 ; func end
00C2 81 rts
00C3 .dbsym l i 0 c
00C3 .dbsym l LcdSBuff 3 pc
00C3 .dbend
00C3 .dbfunc e LcdShGrCil _LcdShGrCil fV
00C3 ; y -> 0,X
00C3 ; mistake -> 1,X
00C3 ; x -> 5,X
00C3 ; GrE -> 12,X
00C3 ; GrCilMV -> 11,X
00C3 ; CR -> 10,X
00C3 ; Cx -> 9,X
00C3 ; Cy -> 8,X
00C3 _LcdShGrCil::
00C3 .dbline -1
00C3 A7FA ais #-6
00C5 95 tsx
00C6 .dbline 86
00C6 ; }
00C6 ; }
00C6 ;
00C6 ; /*===[Lcd画图操作:包括画圆,画矩形框,图形清屏,画点等]===================*/
00C6 ; /*LcdShGrCil:在Lcd上显示或取消空心圆型-------------------------------------*
00C6 ; *功 能:在Lcd上的指定位置显示或取消空心圆型 *
00C6 ; *参 数:Cx为圆心横坐标,Cy为圆心纵坐标 *
00C6 ; * CR为圆的半径,GrE确定图形是否有效 *
00C6 ; * GrCilMV为显示圆型时的正误差值 *
00C6 ; * 例如:半径为10,误差为4;半径为30,误差为30 *
00C6 ; *返 回:无 *
00C6 ; *-------------------------------------------------------------------------*/
00C6 ; void LcdShGrCil(INT8U Cy,INT8U Cx,INT8U CR,INT8U GrCilMV,INT8U GrE)
00C6 ; {
00C6 .dbline 89
00C6 ; INT8U x,y; //坐标的循环控制变量
00C6 ; INT32S mistake; //显示时的误差值
00C6 ; Wtite_Command(0b00110110); //扩展指令,绘图开
00C6 A636 lda #54
00C8 87 psha
00C9 CD041D jsr _Wtite_Command
00CC A701 ais #1
00CE 95 tsx
00CF .dbline 90
00CF ; for(y=Cy-CR;y<=Cy+CR;y++)
00CF E608 lda 8,X
00D1 E00A sub 10,X
00D3 F7 sta ,X
00D4 CC0254 jmp L16
00D7 L13:
00D7 .dbline 91
00D7 ; for(x=Cx-CR;x<=Cx+CR;x++)
00D7 E609 lda 9,X
00D9 E00A sub 10,X
00DB E705 sta 5,X
00DD CC0244 jmp L20
00E0 L17:
00E0 .dbline 92
00E0 ; {
00E0 .dbline 93
00E0 ; mistake=(x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)-CR*CR;
00E0 3F00 clr *__r0
00E2 E609 lda 9,X
00E4 B700 sta *__r1
00E6 3F00 clr *__r2
00E8 E605 lda 5,X
00EA B000 sub *__r1
00EC B700 sta *__r1
00EE B600 lda *__r2
00F0 B200 sbc *__r0
00F2 B700 sta *__r0
00F4 3F00 clr *__r2
00F6 E608 lda 8,X
00F8 B700 sta *__r3
00FA 3F00 clr *__r4
00FC F6 lda ,X
00FD B000 sub *__r3
00FF B700 sta *__r3
0101 B600 lda *__r4
0103 B200 sbc *__r2
0105 B700 sta *__r2
0107 B600 lda *__r3
0109 87 psha
010A B600 lda *__r2
010C 87 psha
010D B600 lda *__r3
010F 87 psha
0110 B600 lda *__r2
0112 87 psha
0113 CD0000 jsr __mul16
0116 A704 ais #4
0118 4E0000 mov *__rlo,*__r3
011B 4E0000 mov *__rhi,*__r2
011E B600 lda *__r1
0120 87 psha
0121 B600 lda *__r0
0123 87 psha
0124 B600 lda *__r1
0126 87 psha
0127 B600 lda *__r0
0129 87 psha
012A CD0000 jsr __mul16
012D A704 ais #4
012F 4E0000 mov *__rlo,*__r1
0132 4E0000 mov *__rhi,*__r0
0135 B600 lda *__r1
0137 BB00 add *__r3
0139 B700 sta *__r1
013B B600 lda *__r0
013D B900 adc *__r2
013F B700 sta *__r0
0141 3F00 clr *__r2
0143 E60A lda 10,X
0145 B700 sta *__r3
0147 3F00 clr *__r4
0149 E60A lda 10,X
014B 87 psha
014C B600 lda *__r4
014E 87 psha
014F B600 lda *__r3
0151 87 psha
0152 B600 lda *__r2
0154 87 psha
0155 CD0000 jsr __mul16
0158 A704 ais #4
015A 4E0000 mov *__rlo,*__r3
015D 4E0000 mov *__rhi,*__r2
0160 B600 lda *__r1
0162 B000 sub *__r3
0164 B700 sta *__r1
0166 B600 lda *__r0
0168 B200 sbc *__r2
016A B700 sta *__r0
016C 4F clra
016D E702 sta 2,X
016F E701 sta 1,X
0171 B600 lda *__r1
0173 E704 sta 4,X
0175 B600 lda *__r0
0177 E703 sta 3,X
0179 2A04 bpl X0
017B 6302 com 2,X
017D 6301 com 1,X
017F X0:
017F .dbline 95
017F ; //误差在范围之内时,显示该点
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -