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

📄 lcdshow.lis

📁 这是我自己在做实验设计时做的,用摩托罗拉飞思卡尔做的一个多功能电子钟
💻 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 + -