;**********************************************************************
;                                                                     *
;    FD-2 FLASH DEMO PRÓBAPANEL PROJEKT                               *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Fájlnév:       LCD1_18.ASM                                       *
;    Dátum:         2002.09.23.                                       *
;    Verziószám:    V1.0                                              *
;    #2                                                               *
;                                                                     *
;    Szerzö:        Kolinger Attila                                   *
;    Cég neve:      ChipCAD kft.                                      *
;    E-mail:        info@chipcad.hu                                   *
;                                                                     *
;**********************************************************************
;                                                                     *
;    LCD kijelzÖ vezérlÖ program                                      *
;    ---------------------------                                      *
;    Kétsoros szöveg kiiratása az LCD kijelzöre, display-t kb. 0,5mp  *
;    idözítéssel léptetve.                                            *
;                                                                     *
;**********************************************************************
;
;
;

        #include BEALLIT.INC                    ; Általános beállítások (proc, fejlesztö, stb.)

;-------------------------------------------------------------------------------
;
;                          LCD UTASÍTÁSOK
;-------------------------------------------------------------------------------
;              LCD kijelzö kivezetései
;   RS   R/W  DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0   Funkció  (végrehajtási idö)
;-------------------------------------------------------------------------------
;    0    0   0   0   0   0   0   0   0   1     Display clear        (1,6ms)
;    0    0   0   0   0   0   0   0   1   x     Display, cursor home (1,6ms)
;    0    0   0   0   0   0   0   1  I/D  S     Entry mode set       (40us)
;    0    0   0   0   0   0   1   D   C   B     Display ON/OFF       (40us)
;    0    0   0   0   0   1  S/C R/L  x   x     Display/Cursor shift (40us)
;    0    0   0   0   1   DL  N   x   x   x     Function set         (40us)
;    0    0   0   1   ------ CG ADDR ------     CG RAM address set   (40us)
;    0    0   1   ------- DD ADDR ---------     DD RAM address set   (40us)
;    1    0   --------- Write data --------     CG/DD RAM data write (40us)
;-------------------------------------------------------------------------------
;    0    1   BF  ----- Address counter ---     Busy flag/Addr cnt read (0)
;    1    1   ---------- Read data --------     CG/DD RAM data read  (40us)
;-------------------------------------------------------------------------------
;
;       I/D=1 inkrementálás, I/D=0 dekrementálás
;       S=1 display léptetés, S=0 display "rögzített"
;       D=1 display on, D=0 display off
;       C=1 kurzor on, C=0 kurzor off
;       B=1 karakter a kurzor helyén villog, B=0 nem villog
;       S/C=1 display léptetés, S/C=0 kurzor mozog
;       R/L=1 léptetés jobbra, R/L=0 léptetés balra
;       DL=1 8 bites, DL=0 4 bites interfész
;       N=1 két soros, N=0 egy soros üzemmód
;       CG ADDR : karakter generátor RAM cím
;       DD ADDR : display adat RAM cím
;
;-------------------------------------------------------------------------------
        CBLOCK
Timer1
Timer2
Timer3
Counter
Pointer
Shift_Cntr
        ENDC
;-------------------------------------------------------------------------------
; PORTE kivezetések
;
    #define RS      0                           ; 0= utasítás, 1= adat reg. választás
    #define RdWr    1                           ; R/W=0 LCD írás, R/W=1 LCD memória olvasás
    #define E       2                           ; 0= LCD tiltás, 1= engedélyezés
;-------------------------------------------------------------------------------
;
        org     KezdVect                        ; reset vektor
        #ifdef ICD
            nop                                 ; MPLAB-ICD miatt
        #endif            
;===============================================================================
; Port beállítás
;
            clrf    LATD
            clrf    LATE
Start
            movlw   14
            movwf   ADCON1                      ; RA0 analóg bemenet !!!
            setf    TRISA                       ; PORTA bemenet
            clrf    TRISD                       ; PORTD kimenet
            clrf    TRISE                       ; PORTE kimenet

            movlw   UPPER Tablazatok            ; Táblázat mutatók beállítása
            movwf   TBLPTRU
            movlw   HIGH Tablazatok
            movwf   TBLPTRH

;-------------------------------------------------------------------------------
; LCD kijelzö inicializálása
;
            bcf         LATE,RS                 ; LCD parancs következik
            movlw   H'38'                       ; 8 bites interfész, 2 sor
            rcall   Write
            rcall   Kesl                        ; Busy flag olvasását "helyettesíti"
            movlw   H'38'
            rcall   Write
            movlw   6                           ; 06h, Entry mode set: increment
            rcall   Write
            movlw   12                          ; 0ch, Display on, blink off
            rcall   Write
            movlw   16                          ; 10h, Display/cursor shift: cursor
            rcall   Write
            movlw   1                           ; 01h, Display clear
            rcall   Write
            rcall   Kesl2                       ; Busy flag olvasását "helyettesíti"
;-------------------------------------------------------------------------------
; Adatküldés LCD-re
;
            movlw   208                         ; LCD cím= második LCD sor +16
            rcall   Write
            bsf     LATE,RS                     ; LCD adat következik
            movlw   16                          ; 16 adat kiiratása
            movwf   Counter
            movlw   LOW LCD_Tabla1
            movwf   TBLPTRL
Start1
            tblrd*+
            movf    TABLAT, W
            rcall   Write
            decfsz  Counter,1
            bra     Start1
;-------------------------------------------------------------------------------
; Display léptetés
;
            bcf     LATE,RS                     ; LCD parancs
            movlw   16
            movwf   Shift_Cntr
Shift_Loop
            movlw   H'18'
            rcall   Write
            rcall   Shift_Delay
            decfsz  Shift_Cntr,1
            bra     Shift_Loop
;-------------------------------------------------------------------------------
; Adatküldés LCD-re
;
            bcf     LATE,RS                     ; LCD parancs
            movlw   192                         ; LCD cím= második LCD sor
            rcall   Write
            bsf     LATE,RS                     ; LCD adat következik
            movlw   16                          ; 16 adat kiiratása
            movwf   Counter
            movlw   LOW LCD_Tabla1
            movwf   TBLPTRL
Start2
            tblrd*+
            movf    TABLAT, W
            rcall   Write
            decfsz  Counter,1
            bra     Start2
;-------------------------------------------------------------------------------
; Display léptetés
;
            bcf     LATE,RS                     ; LCD parancs
            movlw   3
            rcall   Write
            rcall   Kesl2
;-------------------------------------------------------------------------------
; Adatküldés LCD-re
;
            movlw   208                         ; LCD cím= második LCD sor +16
            rcall   Write
            bsf     LATE,RS                     ; LCD adat következik
            movlw   16                          ; 16 adat kiiratása
            movwf   Counter
            movlw   LOW LCD_Tabla2
Start3
            tblrd*+
            movf    TABLAT, W
            rcall   Write
            decfsz  Counter,1
            bra     Start3
;-------------------------------------------------------------------------------
            bcf     LATE,RS                     ; LCD parancs
            movlw   144                         ; LCD cím= elsö LCD sor +16
            rcall   Write
            bsf     LATE,RS                     ; LCD adat következik
            movlw   16                          ; 16 adat kiiratása
            movwf   Counter
            movlw   LOW LCD_Tabla1
            movwf   TBLPTRL
Start4
            tblrd*+
            movf    TABLAT, W
            rcall   Write
            decfsz  Counter,1
            bra     Start4
;-------------------------------------------------------------------------------
; Display léptetés
;
            bcf     LATE,RS                     ; LCD parancs
            movlw   16
            movwf   Shift_Cntr
Shift_Loop1
            movlw   0x18
            rcall   Write
            rcall   Shift_Delay
            decfsz  Shift_Cntr, F
            bra     Shift_Loop1
;-------------------------------------------------------------------------------
Stop
            bra     Stop                        ; resetre vár
;===============================================================================
;
;
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; LCD írás lépései:
; -----------------
;   1/   RS, R/W beállítása
;   2/   E=1
;   3/   adat kiküldés
;   4/   késleltetés (100us)
;   5/   E=0
;
Write
            movwf   LATD
            bsf     LATE,E
            rcall   Kesl100                     ; Busy flag olvasását "helyettesíti"
            bcf     LATE,E
            return
;-------------------------------------------------------------------------------
Kesl100
            movlw   165                         ; 100us késleltetés
            movwf   Timer1
Kesl1
            decfsz  Timer1,1
            bra     Kesl1
            return
;-------------------------------------------------------------------------------
Kesl2
            clrf    Timer1                      ; 2ms késleltetés
            movlw   20
            movwf   Timer2
Kesl21
            rcall   Kesl100
            decfsz  Timer2,1
            bra     Kesl21
            return
;-------------------------------------------------------------------------------
Kesl
            rcall   Kesl2
            rcall   Kesl2
            rcall   Kesl2
            rcall   Kesl2
            rcall   Kesl2
            return                              ; 5x2ms késleltetés
;-------------------------------------------------------------------------------
Shift_Delay
            movlw   10                          ; kb. 0,5mp késleltetés
            movwf   Timer3
Delay
            decfsz  Timer1,1
            bra     Delay
            decfsz  Timer2,1
            bra     Delay
            decfsz  Timer3,1
            bra     Delay
            return
;-------------------------------------------------------------------------------
        org     ($ | 0xFF) + 1
Tablazatok
LCD_Tabla1
        data    "FD-2 demo panel "
;-------------------------------------------------------------------------------
LCD_Tabla2
        data    "info@chipcad.hu "

    end
