⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdshow.lis

📁 基于HC908GP32的计算器完整程序
💻 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 + -