File "Lcd_Ser.ASM"

Full Path: /home/analogde/www/private/Projet/Example/HC12/D128/Lcd_Ser.ASM
File size: 9.16 KB
MIME-type: text/plain
Charset: utf-8

;
;
; =============================================================
;
;     Lcd_Ser.asm:       Serial Lcd Driver 
;                        Axm-0232           
;         Version:       1.0   Released 4/17/2002
;          Author:       Gary Karnes , Axiom Manufacturing
;        Compiler:       Asm12
;        Platform:       Cmd912x or CML12S 
;
; =============================================================
; This program interfaces with the Serial Lcd
; port. The lcd is setup in 4 bit mode
;
;  Run in ram only, one varable LCDBUF
CR          equ         $0d     return
LF          equ         $0a     return
EOT         equ         $04     end of a text table
BELL        equ         $07     Bell
BKSP        equ         $08     Backspace
WR:         equ         $20
RS:         equ         $40     ; lcd RS select
EN:         equ         $80     ; lcd en select
;
;
;
; #include Dp256reg.asm       ; 256 registers
;
; include the following if assembly this alone
; program start ram only
          org     $2000        ; start
; Lcd test
LCD_TST:
          jsr    Init_Spi         ; set up Spi
;
;
;mainloop:
;
         jsr     Lcd_Init         * init Lcd 

;           switch Lcd_cs to high, select data register
         ldx      #LCDBUF          * setup signals for lcd,
         bset     0,X RS           * select Lcd data register
         jsr      LCD_SEND          * send to lcd
         


LCD_LOOP:

;           ldaa    #$30
;           jsr     LCD_WR_8

           jsr     LCDSTR1
           fdb     Axiom           ; display 'Axiom'

           jsr     LCDSTR1
           fdb     Is              ; display 'Is'

           jsr     LCDSTR1
           fdb     The             ; display 'The'

           jsr     LCDSTR1
           fdb     Place

;here:
;         bra    here

  

         rts
;
; Lcd Setup , 4 bit wide
Lcd_Init:
          bclr    LCDBUF,RS+EN       ; select lcd commands Cs=0 En=0
          jsr     LCD_SEND
;


;
; set to 4 bit  
          jsr      DELAY50M         ; delay
          ldaa     #$03             ; send 3
          jsr      LCD_WR_4         
          jsr      DELAY50M         ; delay
          ldaa     #$03
          jsr      LCD_WR_4         ; send 3
          jsr      DELAY50M
          ldaa     #$03
          jsr      LCD_WR_4         ; send 3
          jsr      DELAY50M
          ldaa     #$02
          jsr      LCD_WR_4         ; send 2
          jsr      DELAY50M
;
; write  $2c , in 4 bit mode
LCDINN:
;         ldaa     #$28
          ldaa     #$2c
          jsr      LCD_CMD         ; write command
          jsr      DELAY10M         ; delay
;                  
; write $0f in 4 bit mode
          ldaa     #$06
;         ldaa     #$0f 
          jsr      LCD_CMD          ; send command
          jsr      DELAY10M            * delay
;                  
; write $14 in 4 bit mode
          ldaa      #$0e
          jsr      LCD_CMD          ; send command
          jsr      DELAY10M            * delay
;                 
; write $01 in 4 bit mode
          ldaa     #$01
          jsr      LCD_CMD          ; send command
          jsr      DELAY20M         ; delay
          ldaa     #$80
          jsr      LCD_CMD          ; send command
          jsr      DELAY10M         * delay
;
; Reset Lcd states to rest
          ldaa    #$00             * turn all signals off on lcd
          staa    LCDBUF           * save states
          jsr     LCD_SEND         * send signals
 
          rts
;
;
;
; Lcd Send
LCD_SEND
         ldaa    LCDBUF                 * load data & signals
         jsr     SS_IO                  * send to lcd
         rts
;
;-------------------------------------------------
; Simple Serial Driver (SPI), source code...
; Acc A is send serially, msb first
; return received in Acc A
SS_IO:
       jsr  DELAY10M
	 LDAB	SPI0SR	     ; CLEAR STATUS OF SPI
       STAA	SP0DR		     ; SEND / RECEIVE BYTE
SS_IO_LP:		
       brclr SPI0SR,#$80,SS_IO_LP	; WAIT IF NO FLAG
       ldaa    SP0DR            ; read receive value
 	 rts
;
;
; Simple Serial Driver initialization...
Init_Spi:
	
;             Turn on Spi
       movb  #$52,SPI0CR1	; Setup SPI 
       movb  #$10,SPI0CR2      ; enable /SS
       movb  #$00,SPI0BR       ; set up Spi baud clock rate
;      ldaa  SPI0SR             ; read status
;      movb  #$50,SPI0CR1 	; turn on SPI
       bset  LCDBUF,WR
       BCLR  LCDBUF,EN
       JSR   LCD_SEND
       rts
;

;
OUTSTRG:
        ldaa   0,x                   ; get char
        cmpa   #EOT                  ; if end message then quit 
        beq    OUTSTRGE
;        jsr    OUTSCI0               ; output char 
        inx                          ; next char
        bra    OUTSTRG               ; repeat
OUTSTRGE:
        rts
;
OUTSTRG0:

        rts
;
;-----------------------------------------------
; Lcd Routines
;
; Lcd Out Write a byte
LCD_OUT:
      bset  LCDBUF,$10  ; select lcd data buffer
      jsr   LCD_WR_8    ; write byte
	rts
;
;
; Send a String to the LCD
; Index register is loaded with address of string.
; continue until reading a zero.
LCDSTR:
        pshb             ; save b
        ldab    #$03     ; select lcd buffer
        ldaa    0,x      ; load byte from string
        beq     LSE      ; if zero then end
        pshx             ; save x
       
        jsr     LCD_OUT  ; send character to lcd
        pulx              ; restore x
        inx
        pulb             ; restore b
        bra     LCDSTR
LSE     ldaa    #$20     ; add space
        jsr     LCD_OUT
        pulb             ; restore b
        rts
;

; Send one string to Lcd
; load 16 bit pointer after jsr
; sends space after string
; Lcdstr1S is calling from sub,sub
LCDSTR1S:
         
         puld            ; get d (return address)
         puly    0,sp    ; get the return Pc value
         ldx     0,y     ; string location pointed to by Pc
         iny             ; skip over string pointer
         iny
         pshy
         pshd            ; save d (return address)
         jsr     LCDSTR  ; send string
         rts
;
LCDSTR1:
          jsr     LCDSTR1S  ; send one string + space
          rts
;
;
; Lcd Write 4 bit Data , lower 4 bits of acc A
; Bit assignment
;      0 = Lcd-Db4       4 = 
;      1 = Lcd-Db5       5 = 
;      2 = Lcd-Db6       6 = EN
;      3 = Lcd=Db7       7 = RS
LCD_WR_4:
         pshx
            
         psha                       * save value
         ldaa     LCDBUF           * load Lcd buffer
         anda     #$f0             * get only controls signals
         pulb                      * get data
         andb     #$0f             * only bits 0-3 are data
         aba
         staa     LCDBUF           * save data & lcd signals
         ldx      #LCDBUF
         bclr     0,x EN          ; enable low

         jsr      LCD_SEND         * send the data
         bset     LCDBUF,EN           ; enable high
         jsr      LCD_SEND
         bclr     0,x EN           ; enable low
         jsr      LCD_SEND
         pulx
         rts
;
:
; Lcd Write 8 bit Data , lower 4 bits first in acc A
LCD_WR_8:

         psha                     ; save a 
         lsra                     ; shift upper 4 bits to lower
         lsra
         lsra
         lsra
         jsr      LCD_WR_4        ; write upper 4 bits to lcd
         pula
         jsr      LCD_WR_4         ; write lower 4 bits to lcd
         rts
;
;
; Lcd Command
LCD_CMD:
        bclr   LCDBUF,RS   ; select lcd command buffer
        jsr    LCD_WR_8     ; wait
        
        rts
;

;
; Messages
Axiom:  fcc  'Axiom'
        fcb  0
Is:     fcc  'is'
        fcb  0
The:    fcc  'The'
        fcb  0
Place:  fcc  'Place '
        fcb  0
;
; Delay routines
;
;
; Generate a 50 ms delay
DELAY50M:
          pshx
          ldx  #49998      ; delay 50,000 usecs,
          jsr  DELML01     ; call usec delay
          pulx
          rts
;
;
; Generate a 20 ms delay
DELAY20M:
          bsr  DELAY10M
          bsr  DELAY10M
          rts
;
; Generate a 10 ms delay
DELAY10M:
                           ; jsr=4cyles
          pshx             ; 2 cycles ,save x
          ldx  #9998       ; 2 cycles,delay 9998 usec + 2 for this routine
          jsr  DELML01     ; call usec delay, this delay offset in sub
          pulx             ; 3 cycles restore x
          rts              ; 5 cycles
;
;
; Generate a 1 ms delay
DELAY1MS:
                           ; jsr=4cyles
          pshx             ; 2 cycles ,save x
          ldx  #998       ; 2 cycles,delay 9998 usec + 2 for this routine
          jsr  DELML01     ; call usec delay, this delay offset in sub
          pulx             ; 3 cycles restore x
          rts              ; 5 cycles


;
; 8 cycles = 1 usec e = 8mhz
DELML01:
          nop              ; 1 cycle
          nop              ; 1 cycle
          nop              ; 1 cycle
          nop              ; 1 cycle
          dex              ; 1 cycle 
          bne   DELML01    ; 3 cycles
          rts              ; 5 cycles
;


;
;  ram variables
LCDBUF:   rmb     1


          end