📄 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 37
0000 ; /*控制口高四位设置为输出*/
0000 ; // LCD_CtrlPort|=1<<LCD_BL;//BL=1,关掉背光
0000 ; LCD_CtrlPortDDR|=(1<<LCD_RS);//RS的方向为输出
0000 1206 bset #1,0x6
0002 .dbline 38
0002 ; LCD_CtrlPortDDR|=(1<<LCD_RW);//RW的方向为输出
0002 1406 bset #2,0x6
0004 .dbline 39
0004 ; LCD_CtrlPortDDR|=(1<<LCD_E); // E的方向为输出
0004 1606 bset #3,0x6
0006 .dbline 40
0006 ; LCD_CtrlPortDDR|=(1<<LCD_BL);//BL的方向为输出
0006 1806 bset #4,0x6
0008 .dbline 42
0008 ; //数据口设置为输出
0008 ; LCD_DataPortDDR=0xff;
0008 A6FF lda #-1
000A B705 sta 0x5
000C .dbline 44
000C ; //[Lcd初始化]
000C ; delay40ms; //延时>40ms
000C 452710 ldhx #10000
000F 89 pshx
0010 8B pshh
0011 CD0451 jsr _DelayTimes
0014 A702 ais #2
0016 .dbline 45
0016 ; Wtite_Command(0b00110000); //8位数据,基本指令
0016 A630 lda #48
0018 87 psha
0019 CD041B jsr _Wtite_Command
001C A701 ais #1
001E .dbline 46
001E ; Wtite_Command(0b00001100); //开显示
001E A60C lda #12
0020 87 psha
0021 CD041B jsr _Wtite_Command
0024 A701 ais #1
0026 .dbline 47
0026 ; Wtite_Command(0b00000001); //清屏
0026 A601 lda #1
0028 87 psha
0029 CD041B jsr _Wtite_Command
002C A701 ais #1
002E .dbline 48
002E ; delay1600us; //延时>1.6ms
002E 450FA0 ldhx #4000
0031 89 pshx
0032 8B pshh
0033 CD0451 jsr _DelayTimes
0036 A702 ais #2
0038 .dbline 49
0038 ; Wtite_Command(0b00000110); //进入模式设定
0038 A606 lda #6
003A 87 psha
003B CD041B jsr _Wtite_Command
003E A701 ais #1
0040 .dbline 50
0040 ; LcdShGrClr(); //清Lcd图形显示屏
0040 CD0338 jsr _LcdShGrClr
0043 95 tsx
0044 .dbline -2
0044 L1:
0044 .dbline 0 ; func end
0044 81 rts
0045 .dbend
0045 .dbfunc e LcdShCh _LcdShCh fV
0045 ; i -> 0,X
0045 ; LcdSBuff -> 3,X
0045 _LcdShCh::
0045 .dbline -1
0045 A7FF ais #-1
0047 95 tsx
0048 .dbline 61
0048 ; // LCD_CtrlPort&=~(1<<LCD_BL);//BL=0,打开背光
0048 ; }
0048 ;
0048 ; /*=======================[Lcd显示字符操作]================================*/
0048 ; /*LcdShCh:在液晶显示屏上显示字符数据---------------------------------------*
0048 ; *功 能:在液晶显示屏上显示以LcdSBuff为首地址的64个数据 *
0048 ; *参 数:待显示的64个数据的首地址 *
0048 ; *返 回:无 *
0048 ; *-------------------------------------------------------------------------*/
0048 ; void LcdShCh(INT8U *LcdSBuff)
0048 ; {
0048 .dbline 64
0048 ; unsigned char i; //data数组计数器(0-63)
0048 ; //[Lcd显示64个数据]
0048 ; Wtite_Command(0x80); //DDRAM地址设置
0048 A680 lda #-128
004A 87 psha
004B CD041B jsr _Wtite_Command
004E A701 ais #1
0050 95 tsx
0051 .dbline 65
0051 ; for(i=0;i<64;i++) //显示data中的64个数据
0051 7F clr ,X
0052 2065 bra L6
0054 L3:
0054 .dbline 66
0054 ; {
0054 .dbline 68
0054 ; //[Lcd按行显示16个数据]
0054 ; if((i<=15)||(i>=48)) //第一行和第四行不变
0054 F6 lda ,X
0055 A10F cmp #15
0057 2304 bls L9
0059 A130 cmp #48
005B 2519 blo L7
005D L9:
005D .dbline 69
005D ; Wtite_Data(LcdSBuff[i]);
005D 3F00 clr *__r0
005F F6 lda ,X
0060 EB04 add 4,X
0062 B700 sta *__r1
0064 B600 lda *__r0
0066 E903 adc 3,X
0068 B700 sta *__r0
006A 5500 ldhx *__r0
006C F6 lda ,x
006D 87 psha
006E CD0436 jsr _Wtite_Data
0071 A701 ais #1
0073 95 tsx
0074 2042 bra L8
0076 L7:
0076 .dbline 70
0076 ; else if(i<=31) //显示的第二行为缓冲的第三行
0076 F6 lda ,X
0077 A11F cmp #31
0079 221A bhi L10
007B .dbline 71
007B ; Wtite_Data(LcdSBuff[i+16]);
007B 3F00 clr *__r0
007D EB04 add 4,X
007F B700 sta *__r1
0081 B600 lda *__r0
0083 E903 adc 3,X
0085 B700 sta *__r0
0087 5500 ldhx *__r0
0089 AF10 aix #16
008B F6 lda ,x
008C 87 psha
008D CD0436 jsr _Wtite_Data
0090 A701 ais #1
0092 95 tsx
0093 2023 bra L11
0095 L10:
0095 .dbline 73
0095 ; else //显示的第三行为缓冲的第二行
0095 ; Wtite_Data(LcdSBuff[i-16]);
0095 3F00 clr *__r0
0097 F6 lda ,X
0098 A010 sub #16
009A B700 sta *__r1
009C B600 lda *__r0
009E A200 sbc #0
00A0 B700 sta *__r0
00A2 B600 lda *__r1
00A4 EB04 add 4,X
00A6 B700 sta *__r1
00A8 B600 lda *__r0
00AA E903 adc 3,X
00AC B700 sta *__r0
00AE 5500 ldhx *__r0
00B0 F6 lda ,x
00B1 87 psha
00B2 CD0436 jsr _Wtite_Data
00B5 A701 ais #1
00B7 95 tsx
00B8 L11:
00B8 L8:
00B8 .dbline 74
00B8 L4:
00B8 .dbline 65
00B8 7C inc ,X
00B9 L6:
00B9 .dbline 65
00B9 F6 lda ,X
00BA A140 cmp #64
00BC 2596 blo L3
00BE .dbline -2
00BE L2:
00BE A701 ais #1
00C0 .dbline 0 ; func end
00C0 81 rts
00C1 .dbsym l i 0 c
00C1 .dbsym l LcdSBuff 3 pc
00C1 .dbend
00C1 .dbfunc e LcdShGrCil _LcdShGrCil fV
00C1 ; y -> 0,X
00C1 ; mistake -> 1,X
00C1 ; x -> 5,X
00C1 ; GrE -> 12,X
00C1 ; GrCilMV -> 11,X
00C1 ; CR -> 10,X
00C1 ; Cx -> 9,X
00C1 ; Cy -> 8,X
00C1 _LcdShGrCil::
00C1 .dbline -1
00C1 A7FA ais #-6
00C3 95 tsx
00C4 .dbline 87
00C4 ; }
00C4 ; }
00C4 ;
00C4 ; /*===[Lcd画图操作:包括画圆,画矩形框,图形清屏,画点等]===================*/
00C4 ; /*LcdShGrCil:在Lcd上显示或取消空心圆型-------------------------------------*
00C4 ; *功 能:在Lcd上的指定位置显示或取消空心圆型 *
00C4 ; *参 数:Cx为圆心横坐标,Cy为圆心纵坐标 *
00C4 ; * CR为圆的半径,GrE确定图形是否有效 *
00C4 ; * GrCilMV为显示圆型时的正误差值 *
00C4 ; * 例如:半径为10,误差为4;半径为30,误差为30 *
00C4 ; *返 回:无 *
00C4 ; *-------------------------------------------------------------------------*/
00C4 ; void LcdShGrCil(INT8U Cy,INT8U Cx,INT8U CR,INT8U GrCilMV,INT8U GrE)
00C4 ; {
00C4 .dbline 90
00C4 ; INT8U x,y; //坐标的循环控制变量
00C4 ; INT32S mistake; //显示时的误差值
00C4 ; Wtite_Command(0b00110110); //扩展指令,绘图开
00C4 A636 lda #54
00C6 87 psha
00C7 CD041B jsr _Wtite_Command
00CA A701 ais #1
00CC 95 tsx
00CD .dbline 91
00CD ; for(y=Cy-CR;y<=Cy+CR;y++)
00CD E608 lda 8,X
00CF E00A sub 10,X
00D1 F7 sta ,X
00D2 CC0252 jmp L16
00D5 L13:
00D5 .dbline 92
00D5 ; for(x=Cx-CR;x<=Cx+CR;x++)
00D5 E609 lda 9,X
00D7 E00A sub 10,X
00D9 E705 sta 5,X
00DB CC0242 jmp L20
00DE L17:
00DE .dbline 93
00DE ; {
00DE .dbline 94
00DE ; mistake=(x-Cx)*(x-Cx)+(y-Cy)*(y-Cy)-CR*CR;
00DE 3F00 clr *__r0
00E0 E609 lda 9,X
00E2 B700 sta *__r1
00E4 3F00 clr *__r2
00E6 E605 lda 5,X
00E8 B000 sub *__r1
00EA B700 sta *__r1
00EC B600 lda *__r2
00EE B200 sbc *__r0
00F0 B700 sta *__r0
00F2 3F00 clr *__r2
00F4 E608 lda 8,X
00F6 B700 sta *__r3
00F8 3F00 clr *__r4
00FA F6 lda ,X
00FB B000 sub *__r3
00FD B700 sta *__r3
00FF B600 lda *__r4
0101 B200 sbc *__r2
0103 B700 sta *__r2
0105 B600 lda *__r3
0107 87 psha
0108 B600 lda *__r2
010A 87 psha
010B B600 lda *__r3
010D 87 psha
010E B600 lda *__r2
0110 87 psha
0111 CD0000 jsr __mul16
0114 A704 ais #4
0116 4E0000 mov *__rlo,*__r3
0119 4E0000 mov *__rhi,*__r2
011C B600 lda *__r1
011E 87 psha
011F B600 lda *__r0
0121 87 psha
0122 B600 lda *__r1
0124 87 psha
0125 B600 lda *__r0
0127 87 psha
0128 CD0000 jsr __mul16
012B A704 ais #4
012D 4E0000 mov *__rlo,*__r1
0130 4E0000 mov *__rhi,*__r0
0133 B600 lda *__r1
0135 BB00 add *__r3
0137 B700 sta *__r1
0139 B600 lda *__r0
013B B900 adc *__r2
013D B700 sta *__r0
013F 3F00 clr *__r2
0141 E60A lda 10,X
0143 B700 sta *__r3
0145 3F00 clr *__r4
0147 E60A lda 10,X
0149 87 psha
014A B600 lda *__r4
014C 87 psha
014D B600 lda *__r3
014F 87 psha
0150 B600 lda *__r2
0152 87 psha
0153 CD0000 jsr __mul16
0156 A704 ais #4
0158 4E0000 mov *__rlo,*__r3
015B 4E0000 mov *__rhi,*__r2
015E B600 lda *__r1
0160 B000 sub *__r3
0162 B700 sta *__r1
0164 B600 lda *__r0
0166 B200 sbc *__r2
0168 B700 sta *__r0
016A 4F clra
016B E702 sta 2,X
016D E701 sta 1,X
016F B600 lda *__r1
0171 E704 sta 4,X
0173 B600 lda *__r0
0175 E703 sta 3,X
0177 2A04 bpl X0
0179 6302 com 2,X
017B 6301 com 1,X
017D X0:
017D .dbline 96
017D ; //误差在范围之内时,显示该点
017D ; if((mistake<=GrCilMV)&&(mistake>=-GrCilMV))
017D 3F00 clr *__r2
017F 3F00 clr *__r1
0181 3F00 clr *__r0
0183 E60B lda 11,X
0185 B700 sta *__r3
0187 E604 lda 4,X
0189 87 psha
018A E603 lda 3,X
018C 87 psha
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -