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

📄 lcd.mod

📁 该应用软件可以实现大多数单片机的仿真实验
💻 MOD
字号:
;**********************************************************************
;* Module    : LCD.MOD
;* Programmer: Tony Papadimitriou
;* Purpose   : LCD-related OS-called routines
;* Language  : MC68HC11 (ASM11 v1.83+)
;* Status    : FREEWARE, Copyright (c) 1999 by Tony Papadimitriou
;* Segments  : RAM    : Variables
;*           : ROM    : Code
;*           : SEG9   : OS definitions (this allows adding more functions)
;* History   : 99.10.31 v1.00 Original (copied from 99.10.26 OS11.MOD)
;**********************************************************************

#ifmain
                    #LISTOFF
                    #INCLUDE  811E2.INC
                    #INCLUDE  COMMON.INC
                    #INCLUDE  OSERRORS.INC
                    #LISTON

                    #SEG9
                    ORG       $FF00
#endif

                    #SEG9
#ifndef OSCommands
OSCommands          equ       *
#endif

fLCDInit            equ       *-OSCommands/2      ;Initialize the LCD display
                    dw        ?LCD.Init

fLCDCls             equ       *-OSCommands/2      ;Clear the LCD display
                    dw        ?LCD.Cls

fLCDOn              equ       *-OSCommands/2      ;Enable the LCD display
                    dw        ?DispOn

fDirLeft            equ       *-OSCommands/2      ;Set write direction towards left (eg. numbers)
                    dw        ?DirLeft

fDirRght            equ       *-OSCommands/2      ;Set write direction towards right (normal)
                    dw        ?DirRght

fSetAddr            equ       *-OSCommands/2      ;Set LCD address
                    dw        ?SetDDRAM

fClrEOL             equ       *-OSCommands/2      ;Clear to the end of current LCD line
                    dw        ?ClrEOL

fLCDPutChar         equ       *-OSCommands/2      ;Put a character to the LCD display
                    dw        ?LCD.PutChar

#PAGE ;Operating System routines expanded
**********************************************************************
*                 Operating System routines expanded                 *
**********************************************************************
                    #ROM

#PAGE ;GENERAL-PURPOSE ROUTINES
*********************************************************************
*                     GENERAL-PURPOSE ROUTINES                      *
*********************************************************************

?Delay50            pshx
                    ldx       #50
                    os        fDelayMS
                    pulx
                    rts
#PAGE
                    #RAM
?LCD.Addr           rmb       1
?LCD.Dir            rmb       1

                    #ROM
*********************************************************************
*                         LCD EQUATES                               *
*********************************************************************
?LCD_E              equ       Bit1.               ;for modified EVBU
?LCD_RW             equ       Bit2.               ;for modified EVBU
?LCD_RS             equ       Bit0.               ;for modified EVBU
?LCD_BUSY           equ       Bit7.               ;for modified EVBU

?LCD_CTRL           equ       PORTB               ;for modified EVBU
?LCD_Data           equ       PORTC               ;for modified EVBU
?LCD_DDR            equ       DDRC                ;for modified EVBU

*********************************************************************
*                        LCD COMMANDS                               *
*********************************************************************
?cCLS               equ       %00000001           ;Clear LCD display
?cHOME              equ       %00000010           ;Home the cursor
?cDECNSHF           equ       %00000100           ;Decrement cursor, no display shift
?cDECSHF            equ       %00000101           ;Decrement cursor, display shift
?cINCNSHF           equ       %00000110           ;Increment cursor, no display shift
?cINCSHF            equ       %00000111           ;Increment cursor, display shift
?cND                equ       %00001000           ;Display OFF
?cDNCNB             equ       %00001100           ;Display ON, no cursor, no blink
?cDNCB              equ       %00001101           ;Display ON, no cursor, blink
?cDCNB              equ       %00001110           ;Display ON, cursor on, no blink
?cDCB               equ       %00001111           ;Display ON, cursor on, blink
?cSHIFTL            equ       %00011000           ;Display Shift Left
?cSHIFTR            equ       %00011100           ;Display Shift Right
?cMOVEL             equ       %00010000           ;Cursor Move Left
?cMOVER             equ       %00010100           ;Cursor Move Right

*********************************************************************
*                     LCD-RELATED ROUTINES                          *
*********************************************************************

*****
* CLS - Clear the LCD display
*****
?LCD.Cls            lda       #?cCLS
                    bra       ?WCommLCD

*****
* Home - Home the cursor
*****
?LCD.Home           lda       #?cHOME
                    bra       ?WCommLCD

*****
* Input: RegA holds ASCII character to display
* NOTES: Character is displayed and cursor advanced
*****
?LCD.PutChar        lda       A_,y
                    jsr       ?ASCIILCD           ;convert standard ASCII to LCD codes
                    bra       ?WDataLCD           ;write it out

*****
* INPUT : Nothing
* OUTPUT: Nothing
* NOTES : LCD is initialized
*****
?LCD.Init           lda       #$FF                ;set LCD port for writing
                    sta       ?LCD_DDR
                    bsr       ?Delay50            ;wait for 50ms (45ms only required)
                    lda       #%00111000          ;set 8-bit data, 1/16 duty, 5x7 dots
                    bsr       ?CommandModeLCD
                    bsr       ?WriteLCD
                    bsr       ?Delay50            ;wait for 50ms (4.1ms only required)
;do it once again in case it was originally set at 4-bit bus
                    bsr       ?WriteLCD
                    bsr       ?Delay50            ;wait for 50ms (not needed, just do)
                    bsr       ?WriteLCD
                    jsr       ?WaitBusy
                    bsr       ?WCommLCD
                    bsr       ?LCD.Cls
                    bsr       ?DispOn
                    jsr       ?DirRght
                    bra       ?LoadGR             ;Load the Greek Character set

*****
* Turn the LCD display on, no cursor
*****
?DispOn             lda       #?cDNCNB
          ; falls through to ?WCommLCD

*****
* Write the LCD command (NO REGISTERS ARE DESTROYED) A holds instruction
*****
?WCommLCD           jsr       ?WaitBusy
                    bsr       ?CommandModeLCD
                    bsr       ?WriteLCD
                    jmp       ?WaitBusy           ;get cursor address

*****
* Write LCD Data and toggle Write enable on/off
*****
?WriteLCD           pshx
                    ldx       #REGS
                    bset      [?LCD_CTRL,x,?LCD_E ;enable Write operation
                    sta       ?LCD_Data           ;put command data on bus
                    bclr      [?LCD_CTRL,x,?LCD_E ;disable Write operation
                    pulx
                    rts

*****
* Write the LCD data (NO REGISTERS ARE DESTROYED) A holds data
*****
?WDataLCD           jsr       ?WaitBusy
                    bsr       ?DataModeLCD
                    bsr       ?WriteLCD
                    jmp       ?WaitBusy           ;get cursor address

?DataModeLCD        pshx
                    ldx       #REGS
                    bset      [?LCD_CTRL,x,?LCD_RS ;--- select data
                    bclr      [?LCD_CTRL,x,?LCD_RW ;--- write mode
                    pulx
                    rts

?CommandModeLCD     pshx
                    ldx       #REGS
                    bclr      [?LCD_CTRL,x,?LCD_RS+?LCD_RW ;select command write mode
                    pulx
                    rts

*****
* SetCGRAM - Set CG RAM address (A holds address 0-255)
*****
?SetCGRAM           anda      #%00111111          ;mask off non-address bits
                    ora       #%01000000          ;mix with SET CGRAM command
                    bra       ?WCommLCD

*****
* FixAddr - Fix LCD DDRAM address format to SetDDRAM address format
*           A holds LCD format address on input, SetDDRAM format on output
*****
?FixAddr            cmpa      #$40                ;is it line 2?
                    blo       ?FixAddr.Line1      ;address is in correct format
                    suba      #$40                ;convert to column without line info
                    ora       #$80                ;add line 2 info
?FixAddr.Line1      rts

*****
* LoadGR - Load the Greek character set into unused LCD characters
*****
?LoadGR             clra                          ;beginning address to write
                    bsr       ?SetCGRAM
                    ldx       #?GreekTab          ;start at beginning of data table
?LoadGR1            lda       ,x
                    jsr       ?WaitBusy
                    bsr       ?DataModeLCD
                    anda      #%00011111          ;mask off unused bits just in case
                    bsr       ?WriteLCD
                    inx                           ;point to next sequence or code
                    cpx       #?GreekTabEnd       ;have we loaded all characters?
                    blo       ?LoadGR1
                    clra                          ;get away from CG RAM and into DD RAM
                    bra       ?SetDDRAM.Local
?GreekTab           equ       *                   ;Table of Greek 5x7(8) dot characters
* PI
                    fcb       %11111              ;*****
                    fcb       %01010              ; * *
                    fcb       %01010              ; * *
                    fcb       %01010              ; * *
                    fcb       %01010              ; * *
                    fcb       %01010              ; * *
                    fcb       %01010              ; * *
                    fcb       %00000              ;-----
* OMEGA
                    fcb       %01110              ; ***
                    fcb       %10001              ;*   *
                    fcb       %10001              ;*   *
                    fcb       %10001              ;*   *
                    fcb       %01010              ; * *
                    fcb       %01010              ; * *
                    fcb       %11011              ;** **
                    fcb       %00000              ;-----
* KSI
                    fcb       %11111              ;*****
                    fcb       %00000              ;
                    fcb       %00000              ;
                    fcb       %01110              ; ***
                    fcb       %00000              ;
                    fcb       %00000              ;
                    fcb       %11111              ;*****
                    fcb       %00000              ;-----
* GAMMA
                    fcb       %11111              ;*****
                    fcb       %10000              ;*
                    fcb       %10000              ;*
                    fcb       %10000              ;*
                    fcb       %10000              ;*
                    fcb       %10000              ;*
                    fcb       %10000              ;*
                    fcb       %00000              ;-----
* DELTA
                    fcb       %00100              ;  *
                    fcb       %01010              ; * *
                    fcb       %10001              ;*   *
                    fcb       %10001              ;*   *
                    fcb       %10001              ;*   *
                    fcb       %10001              ;*   *
                    fcb       %11111              ;*****
                    fcb       %00000              ;-----
* LAMDA
                    fcb       %00100              ;  *
                    fcb       %01010              ; * *
                    fcb       %10001              ;*   *
                    fcb       %10001              ;*   *
                    fcb       %10001              ;*   *
                    fcb       %10001              ;*   *
                    fcb       %10001              ;*   *
                    fcb       %00000              ;-----
* PHI
                    fcb       %00100              ;  *
                    fcb       %01110              ; ***
                    fcb       %10101              ;* * *
                    fcb       %10101              ;* * *
                    fcb       %01110              ; ***
                    fcb       %00100              ;  *
                    fcb       %00100              ;  *
                    fcb       %00000              ;-----
* PSI
                    fcb       %10101              ;* * *
                    fcb       %10101              ;* * *
                    fcb       %10101              ;* * *
                    fcb       %01110              ; ***
                    fcb       %00100              ;  *
                    fcb       %00100              ;  *
                    fcb       %00100              ;  *
                    fcb       %00000              ;-----
?GreekTabEnd        equ       *                   ;End of Table of Greek

*****
* INPUT : Param (or A) holds address as follows:
*         Row (either 1 or 2) is in bit 7 as 0 or 1 respectively
*         Column (0 through 39) is in bits 6-0
* OUTPUT: SetDDRAM instruction is executed for the given address
*****
?SetDDRAM           lda       A_,y
?SetDDRAM.Local     tsta                          ;is address given for row 2?
                    bpl       ?SetDRAM2           ;no, skip row 2 adjustment
?SetDRAM1           adda      #$40                ;yes, adjust column address for row 2
?SetDRAM2           ora       #$80                ;mix address with SET DDRAM command
                    jmp       ?WCommLCD

*****
* Convert standard ASCII to LCD, actually only DOS-Greek codes are affected
*****
?ASCIILCD           cmpa      #' '                ;is it below space
                    bhi       ?ASCII.1
                    lda       #' '                ;yes, convert to space
                    rts                           ;and get out
?ASCII.1            cmpa      #'

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -