📄 lcdshow.lis
字号:
.module lcdshow.c
.area text
; i -> 0,X
; str -> 3,X
0000 _lcdshow::
0000 A7FF ais #-1
0002 95 tsx
0003 ; /*文件描述:本文件包含了用HD44780显示相关的3个子程序 *
0003 ; * 1. LCDShow:在LCD上显示32个字符 *
0003 ; * 2. LcdInit:初始化Lcd *
0003 ; * 3. Lcd_Command:执行给定的cmd命令 *
0003 ; *-------------《嵌入式应用技术基础教程》--------------*/
0003 ; //[以下为子程序源代码]
0003 ; //[头文件]
0003 ; #include "GP32C.h" //包含头文件
0003 ; #define LcdData PTB //Lcd显示数据传送口
0003 ; #define LcdData_D DDRB //数据口方向寄存器
0003 ; #define LcdCtrl PTC //Lcd控制信号传送口
0003 ; #define LcdCtrl_D DDRC //控制口方向寄存器
0003 ; #define LcdRS 0 //Lcd寄存器选择信号PTC0
0003 ; #define LcdRW 1 //读写信号接PTC1
0003 ; #define LcdE 2 //Lcd使能信号接PTC2
0003 ; //内部调用子程序
0003 ; void Lcd_Command(unsigned char cmd); //命令执行子程序
0003 ; void LcdInit(void); //Lcd初始化子程序
0003 ; void Lcd_show_cursor(char x,char y);
0003 ;
0003 ; /*LcdShow:在HD44780显示屏上显示数据--------------------*
0003 ; *功能描述:在HD44780显示屏上显示str中的32个数据 *
0003 ; *参 数:str:待显示数组 *
0003 ; *返 回:无 *
0003 ; *------------------以上为子程序说明-------------------*/
0003 ; void lcdshow(unsigned char str[])
0003 ; {
0003 ; unsigned char i;
0003 ; LcdInit(); //调用Lcd初始化子程序
0003 CD006D jsr _LcdInit
0006 ; //显示第1行16个字符
0006 ; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
0006 1102 bclr #0,0x2
0008 ; LcdCtrl&=~(1<<LcdRW);
0008 1302 bclr #1,0x2
000A ; Lcd_Command(0b10000000); //后7位为DDRAM地址0x00
000A A680 lda #-128
000C 87 psha
000D CD00BF jsr _Lcd_Command
0010 A701 ais #1
0012 95 tsx
0013 ; LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
0013 1002 bset #0,0x2
0015 ; LcdCtrl&=~(1<<LcdRW);
0015 1302 bclr #1,0x2
0017 ; for (i=0;i<16;i++) //逐个显示
0017 7F clr ,X
0018 2018 bra L5
001A L2:
001A 3F00 clr *__r0
001C F6 lda ,X
001D EB04 add 4,X
001F B700 sta *__r1
0021 B600 lda *__r0
0023 E903 adc 3,X
0025 B700 sta *__r0
0027 5500 ldhx *__r0
0029 F6 lda ,x
002A 87 psha
002B CD00BF jsr _Lcd_Command
002E A701 ais #1
0030 95 tsx
0031 L3:
0031 7C inc ,X
0032 L5:
0032 F6 lda ,X
0033 A110 cmp #16
0035 25E3 blo L2
0037 ; Lcd_Command(str[i]);
0037 ; //显示第2行16个字符
0037 ; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
0037 1102 bclr #0,0x2
0039 ; LcdCtrl&=~(1<<LcdRW);
0039 1302 bclr #1,0x2
003B ; Lcd_Command(0b11000000); //后7位为DDRAM地址0x40
003B A6C0 lda #-64
003D 87 psha
003E CD00BF jsr _Lcd_Command
0041 A701 ais #1
0043 95 tsx
0044 ; LcdCtrl|=1<<LcdRS; //RS、R/W=10,写数据到DDRAM中
0044 1002 bset #0,0x2
0046 ; LcdCtrl&=~(1<<LcdRW);
0046 1302 bclr #1,0x2
0048 ; for (i=16;i<32;i++) //逐个显示
0048 A610 lda #16
004A F7 sta ,X
004B 2018 bra L9
004D L6:
004D 3F00 clr *__r0
004F F6 lda ,X
0050 EB04 add 4,X
0052 B700 sta *__r1
0054 B600 lda *__r0
0056 E903 adc 3,X
0058 B700 sta *__r0
005A 5500 ldhx *__r0
005C F6 lda ,x
005D 87 psha
005E CD00BF jsr _Lcd_Command
0061 A701 ais #1
0063 95 tsx
0064 L7:
0064 7C inc ,X
0065 L9:
0065 F6 lda ,X
0066 A120 cmp #32
0068 25E3 blo L6
006A L1:
006A A701 ais #1
006C .dbline 0 ; func end
006C 81 rts
006D ; i -> 0,X
006D _LcdInit::
006D A7FF ais #-1
006F 95 tsx
0070 ; Lcd_Command(str[i]);
0070 ; }
0070 ; /*LcdInit:初始化Lcd------------------------------------*
0070 ; *功 能:初始化Lcd(HD44780),设置显示方式,清屏,AC自动+1 *
0070 ; *参 数:无 *
0070 ; *返 回:无 *
0070 ; *-----------------------------------------------------*/
0070 ; void LcdInit(void)
0070 ; {
0070 ; unsigned char i;
0070 ; LcdData_D=0b11111111; //数据口为输出
0070 A6FF lda #-1
0072 B705 sta 0x5
0074 ; LcdCtrl_D|=(1<<LcdE); //控制口低三位为输出
0074 1406 bset #2,0x6
0076 ; LcdCtrl_D|=(1<<LcdRS);
0076 1006 bset #0,0x6
0078 ; LcdCtrl_D|=(1<<LcdRW);
0078 1206 bset #1,0x6
007A ; LcdCtrl|=(1<<LcdE); //E=1
007A 1402 bset #2,0x2
007C ; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
007C 1102 bclr #0,0x2
007E ; LcdCtrl&=~(1<<LcdRW);
007E 1302 bclr #1,0x2
0080 ; Lcd_Command(0b00111000); //8位数据接口,2行,5*7点阵
0080 A638 lda #56
0082 87 psha
0083 CD00BF jsr _Lcd_Command
0086 A701 ais #1
0088 ; Lcd_Command(0b00001000); //关显示,关光标显示,不闪烁
0088 A608 lda #8
008A 87 psha
008B CD00BF jsr _Lcd_Command
008E A701 ais #1
0090 ; Lcd_Command(0b00000001); //清屏
0090 A601 lda #1
0092 87 psha
0093 CD00BF jsr _Lcd_Command
0096 A701 ais #1
0098 95 tsx
0099 7F clr ,X
009A 2001 bra L14
009C L11:
009C L12:
009C 7C inc ,X
009D L14:
009D ; for(i=0;i<250;i++); //延时>1.6ms
009D F6 lda ,X
009E A1FA cmp #-6
00A0 25FA blo L11
00A2 7F clr ,X
00A3 2001 bra L18
00A5 L15:
00A5 L16:
00A5 7C inc ,X
00A6 L18:
00A6 ; for(i=0;i<250;i++);
00A6 F6 lda ,X
00A7 A1FA cmp #-6
00A9 25FA blo L15
00AB ; Lcd_Command(0b00010100); //光标右移一个字符位,AC自
00AB A614 lda #20
00AD 87 psha
00AE CD00BF jsr _Lcd_Command
00B1 A701 ais #1
00B3 ; // 动加1
00B3 ; Lcd_Command(0b00001100); //开显示,关光标显示,不闪烁
00B3 A60C lda #12
00B5 87 psha
00B6 CD00BF jsr _Lcd_Command
00B9 A701 ais #1
00BB 95 tsx
00BC L10:
00BC A701 ais #1
00BE .dbline 0 ; func end
00BE 81 rts
00BF ; i -> 0,X
00BF ; cmd -> 3,X
00BF _Lcd_Command::
00BF A7FF ais #-1
00C1 95 tsx
00C2 ; }
00C2 ; /*Lcd_Command:执行给定的cmd命令------------------------*
00C2 ; *功 能:执行给定的cmd命令,且延时 *
00C2 ; *参 数:cmd:待执行的命令 *
00C2 ; *返 回:无 *
00C2 ; *-----------------------------------------------------*/
00C2 ; void Lcd_Command(unsigned char cmd)
00C2 ; {
00C2 7F clr ,X
00C3 2001 bra L23
00C5 L20:
00C5 L21:
00C5 7C inc ,X
00C6 L23:
00C6 ; unsigned char i;
00C6 ; for (i=0;i<20;i++); //等待>40us
00C6 F6 lda ,X
00C7 A114 cmp #20
00C9 25FA blo L20
00CB ; LcdData=cmd; //把指令码送到Lcd数据传送口
00CB E603 lda 3,X
00CD B701 sta 0x1
00CF ; LcdCtrl|=(1<<LcdE); //Lcd开始接收数据
00CF 1402 bset #2,0x2
00D1 ; asm("NOP");
00D1 9D NOP
00D2 ; asm("NOP");
00D2 9D NOP
00D3 ; asm("NOP");
00D3 9D NOP
00D4 ; LcdCtrl&=~(1<<LcdE); //Lcd结束接收数据
00D4 1502 bclr #2,0x2
00D6 7F clr ,X
00D7 2001 bra L27
00D9 L24:
00D9 L25:
00D9 7C inc ,X
00DA L27:
00DA ; for (i=0;i<20;i++); //等待>40us
00DA F6 lda ,X
00DB A114 cmp #20
00DD 25FA blo L24
00DF L19:
00DF A701 ais #1
00E1 .dbline 0 ; func end
00E1 81 rts
00E2 ; y -> 3,X
00E2 ; x -> 2,X
00E2 _Lcd_show_cursor::
00E2 95 tsx
00E3 ; }
00E3 ;
00E3 ;
00E3 ; void Lcd_show_cursor(char x,char y)
00E3 ; {
00E3 ;
00E3 ; if(x==0)
00E3 E602 lda 2,X
00E5 261A bne L29
00E7 ; {
00E7 ; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
00E7 1102 bclr #0,0x2
00E9 ; LcdCtrl&=~(1<<LcdRW);
00E9 1302 bclr #1,0x2
00EB ; Lcd_Command(0b00001111); //show cursor and blink
00EB A60F lda #15
00ED 87 psha
00EE CD00BF jsr _Lcd_Command
00F1 A701 ais #1
00F3 95 tsx
00F4 ; Lcd_Command(y|0x80);
00F4 E603 lda 3,X
00F6 AA80 ora #-128
00F8 87 psha
00F9 CD00BF jsr _Lcd_Command
00FC A701 ais #1
00FE 95 tsx
00FF ; }
00FF 2020 bra L30
0101 L29:
0101 ; else if(x==1)
0101 E602 lda 2,X
0103 A101 cmp #1
0105 261A bne L31
0107 ; {
0107 ; LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
0107 1102 bclr #0,0x2
0109 ; LcdCtrl&=~(1<<LcdRW);
0109 1302 bclr #1,0x2
010B ; Lcd_Command(0b00001111); //show cursor and blink
010B A60F lda #15
010D 87 psha
010E CD00BF jsr _Lcd_Command
0111 A701 ais #1
0113 95 tsx
0114 ; Lcd_Command((0x40+y)|0x80);
0114 E603 lda 3,X
0116 AB40 add #64
0118 AA80 ora #-128
011A 87 psha
011B CD00BF jsr _Lcd_Command
011E A701 ais #1
0120 95 tsx
0121 ; }
0121 L31:
0121 ; else ;
0121 L32:
0121 L30:
0121 L28:
0121 .dbline 0 ; func end
0121 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -