;**********************************************************************
;                                                                     *
;    FD-2 FLASH DEMO PRÓBAPANEL PROJEKT                               *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Fájlnév:       ORAIC_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                                   *
;                                                                     *
;**********************************************************************
;                                                                     *
;    RS5C372A ÓRAMODUL KEZELÖ PROGRAM                                 *
;    --------------------------------                                 *
;                                                                     *
;    1. Az óramodult az alábbiak szerint programozza fel:             *
;       - 32,768 kHz kristály frekvencia kiválasztás (default),       *
;       - órajel megjenenik az INTRB kivezetésen (default),           *
;       - 24 órás üzemmód,                                            *
;       - idö: 12:00:00,                                              *
;       - dátum: (20)01-02-04.                                        *
;                                                                     *
;    2. Kb. 0,5 másodpercenként lekérdezi az idöt, és az LCD          *
;       modulon kijelzi.                                              *
;                                                                     *
;**********************************************************************
;

        #include BEALLIT.INC                    ; Általános beállítások (proc, fejlesztö, stb.)

;
;------------------------------------------------------------------------------
        #define Slave    B'01100100'
;------------------------------------------------------------------------------
        CBLOCK
Timer1                                          ; késleltetés számláló alsó bájt
Timer2                                          ; késleltetés számláló felsö bájt
Sec                                             ; átmeneti regiszterek
Min
Hour
Day_of_week
Day
Month
Year
Timer3
        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
;------------------------------------------------------------------------------
;
;
;------------------------------------------------------------------------------
;********************************* FÖPROGRAM **********************************
;------------------------------------------------------------------------------
;
        org     KezdVect                ; reset vektor
        #ifdef ICD
                nop                     ; MPLAB-ICD miatt
        #endif            
;==============================================================================
; Port beállítás
;
Start
                clrf    LATD
                clrf    LATE
                movlw   14
                movwf   ADCON1          ; RA0 analóg bemenet !!!
                setf    TRISA           ; PORTA bemenet
                setf    TRISC           ; PORTC bemenet
                clrf    TRISD           ; PORTD kimenet
                clrf    TRISE           ; PORTE kimenet
;------------------------------------------------------------------------------
; Az I2C port konfigurálása
;
                clrf    PIE1            ; a periféria megszakítások tiltása
                clrf    INTCON          ;
                movlw   0x80
                movwf   SSPSTAT         ; slew rate vezérlés tiltva
                movlw   0x31            ; SSPADD=49
                movwf   SSPADD
                clrf    LATD
                movlw   B'00101000'     ; SSPEN=1, soros port engedélyezés
                movwf   SSPCON1         ; I2C master, Fosc/(4*(SSPADD+1))
                clrf    PIR1
;------------------------------------------------------------------------------
; LCD kijelzö inicializálása
;
                rcall   Delay
                bcf     LATE,RS         ; LCD parancs következik
                movlw   H'38'           ; 8 bites interfész, 2 sor
                rcall   Write
                rcall   Delay2          ; 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   Delay2          ; Busy flag olvasását "helyettesíti"
;------------------------------------------------------------------------------
; ÓRA MODUL írás
;
Clock_Write
                bsf     SSPCON2,SEN     ; start bit
                rcall   Wait
                movlw   Slave           ; W= slave + R/W (=0)
                movwf   SSPBUF
                rcall   Wait
                movlw   0xF0            ; kezdöcím= 0Fh, átv. formátum reg.= 0
                movwf   SSPBUF
                rcall   Wait
                movlw   0x20            ; CONTROL2 regiszter írás, 24 órás üzemmód
                movwf   SSPBUF
                rcall   Wait
                movlw   0x00            ; SEC regiszter írás
                movwf   SSPBUF
                rcall   Wait
                movlw   0x00            ; MIN regiszter írás
                movwf   SSPBUF
                rcall   Wait
                movlw   0x12            ; HOUR regiszter írás
                movwf   SSPBUF
                rcall   Wait
                movlw   0x00            ; DAY OF WEEK regiszter írás (=vasárnap !)
                movwf   SSPBUF
                rcall   Wait
                movlw   0x04            ; DAY regiszter írás
                movwf   SSPBUF
                rcall   Wait
                movlw   0x02            ; MONTH regiszter írás
                movwf   SSPBUF
                rcall   Wait
                movlw   0x01            ; YEAR regiszter írás (2001)
                movwf   SSPBUF
                rcall   Wait
                bsf     SSPCON2,PEN     ; stop bit
                rcall   Wait
                rcall   Delay           ; várakozás az írás végére (kb. 10ms)
;------------------------------------------------------------------------------
; ÓRA MODUL olvasás
;
Clock_Read
                bsf     SSPCON2,SEN     ; start bit
                rcall   Wait
                movlw   Slave           ; W= slave + R/W (=0)
                movwf   SSPBUF
                rcall   Wait
                movlw   0x00            ; SEC regiszter címe
                movwf   SSPBUF
                rcall   Wait
;------------------------------------------------------------------------------
                bsf     SSPCON2,RSEN    ; ismételt start bit !!!
                rcall   Wait
                movlw   Slave
                addlw   1               ; W= slave + R/W (=1), olvasás !
                movwf   SSPBUF
                rcall   Wait
;------------------------------------------------------------------------------
                bsf     SSPCON2,RCEN    ; vétel engedélyezés
                rcall   Wait
                movf    SSPBUF,0
                movwf   Sec             ; vett adat másolása SEC regiszterbe
                bsf     SSPCON2,ACKEN   ; acknowledge bit generálás
                rcall   Wait
                bsf     SSPCON2,RCEN    ; vétel ismételt engedélyezése
                rcall   Wait
                movf    SSPBUF,0
                movwf   Min             ; vett adat másolása MIN regiszterbe
                bsf     SSPCON2,ACKEN   ; acknowledge bit generálás
                rcall   Wait
                bsf     SSPCON2,RCEN    ; vétel ismételt engedélyezése
                rcall   Wait
                movf    SSPBUF,0
                movwf   Hour            ; vett adat másolása HOUR regiszterbe
                bsf     SSPCON2,ACKEN   ; acknowledge bit generálás
                rcall   Wait
                bsf     SSPCON2,RCEN    ; vétel ismételt engedélyezése
                rcall   Wait
                movf    SSPBUF,0
                movwf   Day_of_week     ; vett adat másolása DAY OF WEEK regiszterbe
                bsf     SSPCON2,ACKEN   ; acknowledge bit generálás
                rcall   Wait
                bsf     SSPCON2,RCEN    ; vétel ismételt engedélyezése
                rcall   Wait
                movf    SSPBUF,0
                movwf   Day             ; vett adat másolása DAY regiszterbe
                bsf     SSPCON2,ACKEN   ; acknowledge bit generálás
                rcall   Wait
                bsf     SSPCON2,RCEN    ; vétel ismételt engedélyezése
                rcall   Wait
                movf    SSPBUF,0
                movwf   Month           ; vett adat másolása MONTH regiszterbe
                bsf     SSPCON2,ACKEN   ; acknowledge bit generálás
                rcall   Wait
                bsf     SSPCON2,RCEN    ; vétel ismételt engedélyezése
                rcall   Wait
                movf    SSPBUF,0
                movwf   Year            ; vett adat másolása YEAR regiszterbe
                bsf     SSPCON2,PEN     ; stop bit
                rcall   Wait
;------------------------------------------------------------------------------
; Dátum és idö kiiratás az LCD kijelzön
;
LCD_Write
                bcf     LATE,RS ; cím
                movlw   129             ; LCD cím= 1 (+128, elsö sor)
                rcall   Write
                bsf     LATE,RS         ; adat
                movlw   '2'
                rcall   Write
                movlw   '0'
                rcall   Write
                swapf   Year,0
                andlw   15
                addlw   48
                rcall   Write           ; év tizesek kiiratása
                movf    Year,0
                andlw   15
                addlw   48
                rcall   Write           ; év egyesek kiiratása
                movlw   '-'
                rcall   Write
                swapf   Month,0
                andlw   15
                addlw   48
                rcall   Write           ; hónap tizesek kiiratása
                movf    Month,0
                andlw   15
                addlw   48
                rcall   Write           ; hónap egyesek kiiratása
                movlw   '-'
                rcall   Write
                swapf   Day,0
                andlw   15
                addlw   48
                rcall   Write           ; nap tizesek kiiratása
                movf    Day,0
                andlw   15
                addlw   48
                rcall   Write           ; nap egyesek kiiratása
                bcf     LATE,RS         ; cím
                movlw   193             ; LCD cím= 1 (+192, második sor)
                rcall   Write
                bsf     LATE,RS         ; adat
                swapf   Hour,0
                andlw   15
                addlw   48
                rcall   Write           ; óra tizesek kiiratása
                movf    Hour,0
                andlw   15
                addlw   48
                rcall   Write           ; óra egyesek kiiratása
                movlw   ':'
                rcall   Write
                swapf   Min,0
                andlw   15
                addlw   48
                rcall   Write           ; perc tizesek kiiratása
                movf    Min,0
                andlw   15
                addlw   48
                rcall   Write           ; perc egyesek kiiratása
                movlw   ':'
                rcall   Write
                swapf   Sec,0
                andlw   15
                addlw   48
                rcall   Write           ; másodperc tizesek kiiratása
                movf    Sec,0
                andlw   15
                addlw   48
                rcall   Write           ; másodperc egyesek kiiratása
                rcall   Delay05

                bra     Clock_Read      ; kb. 0,5 mp múlva újabb olvasás
;==============================================================================
;
;
;
;------------------------------------------------------------------------------
;******************************* SZUBRUTINOK **********************************
;------------------------------------------------------------------------------
;
;------------------------------------------------------------------------------
Wait            btfss   PIR1,SSPIF      ; SSPIF megszakítás flagre vár
                bra     Wait
;------------------------------------------------------------------------------
                bcf     PIR1,SSPIF      ; SSPIF flag törlése
                return
;------------------------------------------------------------------------------
Delay           movlw   70              ; kb. 10ms késleltetés
                movwf   Timer2
Delay1          decfsz  Timer1,1
                bra    Delay1
                decfsz  Timer2,1
                bra    Delay1
                return
;------------------------------------------------------------------------------
; 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   Delay100        ; Busy flag olvasását "helyettesíti"
                bcf     LATE,E
                return
;-------------------------------------------------------------------------------
Delay100        movlw   165             ; 100us késleltetés
                movwf   Timer1
Del11           decfsz  Timer1,1
                goto    Del11
                return
;-------------------------------------------------------------------------------
Delay2          clrf    Timer1          ; 2ms késleltetés
                movlw   20
                movwf   Timer2
Del21           rcall   Delay100
                decfsz  Timer2,1
                bra    Del21
                return
;-------------------------------------------------------------------------------
Delay05         movlw   50              ; kb. 0,5 mp késleltetés
                movwf   Timer3
Del31           rcall   Delay
                decfsz  Timer3,1
                bra    Del31
                return
;-------------------------------------------------------------------------------
        end
