📄 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 ; /*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 CD00B3 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 CD00B3 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 CD00B3 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 CD00B3 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 ; j -> 1,X
006D _LcdInit::
006D A7FE ais #-2
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,j;
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 CD00B3 jsr _Lcd_Command
0086 A701 ais #1
0088 95 tsx
0089 7F clr ,X
008A 2001 bra L14
008C L11:
008C L12:
008C 7C inc ,X
008D L14:
008D ; //Lcd_Command(0b00001000); //关显示,关光标显示,不闪烁
008D ; //Lcd_Command(0b00000001); //清屏
008D ; for(i=0;i<250;i++); //延时>1.6ms
008D F6 lda ,X
008E A1FA cmp #-6
0090 25FA blo L11
0092 ; for(i=0;i<250;i++)
0092 7F clr ,X
0093 200D bra L18
0095 L15:
0095 6F01 clr 1,X
0097 2002 bra L22
0099 L19:
0099 L20:
0099 6C01 inc 1,X
009B L22:
009B E601 lda 1,X
009D A114 cmp #20
009F 25F8 blo L19
00A1 L16:
00A1 7C inc ,X
00A2 L18:
00A2 F6 lda ,X
00A3 A1FA cmp #-6
00A5 25EE blo L15
00A7 ; for(j=0;j<20;j++);
00A7 ; Lcd_Command(0b00010100); //光标右移一个字符位,AC自
00A7 A614 lda #20
00A9 87 psha
00AA CD00B3 jsr _Lcd_Command
00AD A701 ais #1
00AF 95 tsx
00B0 L10:
00B0 A702 ais #2
00B2 .dbline 0 ; func end
00B2 81 rts
00B3 ; i -> 0,X
00B3 ; cmd -> 3,X
00B3 _Lcd_Command::
00B3 A7FF ais #-1
00B5 95 tsx
00B6 ; // 动加1
00B6 ; //Lcd_Command(0b00001100); //开显示,关光标显示,不闪烁
00B6 ; }
00B6 ; /*Lcd_Command:执行给定的cmd命令------------------------*
00B6 ; *功 能:执行给定的cmd命令,且延时 *
00B6 ; *参 数:cmd:待执行的命令 *
00B6 ; *返 回:无 *
00B6 ; *-----------------------------------------------------*/
00B6 ; void Lcd_Command(unsigned char cmd)
00B6 ; {
00B6 7F clr ,X
00B7 2001 bra L27
00B9 L24:
00B9 L25:
00B9 7C inc ,X
00BA L27:
00BA ; unsigned char i;
00BA ; for (i=0;i<20;i++); //等待>40us
00BA F6 lda ,X
00BB A114 cmp #20
00BD 25FA blo L24
00BF ; LcdData=cmd; //把指令码送到Lcd数据传送口
00BF E603 lda 3,X
00C1 B701 sta 0x1
00C3 ; LcdCtrl|=(1<<LcdE); //Lcd开始接收数据
00C3 1402 bset #2,0x2
00C5 ; asm("NOP");
00C5 9D NOP
00C6 ; asm("NOP");
00C6 9D NOP
00C7 ; asm("NOP");
00C7 9D NOP
00C8 ; LcdCtrl&=~(1<<LcdE); //Lcd结束接收数据
00C8 1502 bclr #2,0x2
00CA 7F clr ,X
00CB 2001 bra L31
00CD L28:
00CD L29:
00CD 7C inc ,X
00CE L31:
00CE ; for (i=0;i<20;i++); //等待>40us
00CE F6 lda ,X
00CF A114 cmp #20
00D1 25FA blo L28
00D3 L23:
00D3 A701 ais #1
00D5 .dbline 0 ; func end
00D5 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -