        TITLE   "Zsolti PIC pr¢b l¢ja v5"     ; Az elso AN csatorna erteket irja ki az LCD-re decimalisan

        LIST    P=PIC16F877, F=INHX8M, R=DEC
;
        INCLUDE  <P16F877.INC>  ;a proc regisztern‚v ‚s bitn‚v konstansok
                                ; hozz f�z‚se


        ORG     2000h
        DW      'Z','S','O','L'
        ORG     2007h
        DW      _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _WRT_ENABLE_OFF & _CP_OFF & _BODEN_ON
;
;
;Ports:

DIRRA   EQU     00111111b       ;adatir ny (b r ezek anal¢g bemenetek lesznek...)

LCDDAT  EQU     PORTB           ;LCD adat port
KBDDAT  EQU     PORTB
#DEFINE LCDBUSY PORTB,7         ;LCD foglalt
KBDMSK  EQU     00011111b       ;maszk ‚rt‚k
DIRRBI  EQU     11111111b       ;adatir ny (mind bemenet, ha LCD/KBD olvas s)
DIRRBO  EQU     00000000b       ;adatir ny (mind kimenet, ha LCD ir s)

;
LEDDAT  EQU     PORTD
KSELDAT EQU     PORTD
LEDMSK  EQU     00011111b       ;LED-ek maszkja

#DEFINE LCDRS   PORTD,5         ;LCD regiszter kiv laszt s
                                ; 0: parancsreg. , 1: adatreg.
#DEFINE LCDRW   PORTD,6         ;LCD adatir ny (0: ir s, 1: olvas s)
#DEFINE LCDEN   PORTD,7         ;LCD enged‚lyez‚s
DEFARD  EQU     00011111b       ;alap‚rt‚k
DIRRD   EQU     00000000b       ;adatir ny (mind kimenet)

;


DEFARC  EQU     11000000b       ;alap‚rt‚k
DIRRC   EQU     10000111b       ;adatir ny

;
DEFARE  EQU     11000000b       ;alap‚rt‚k
DIRRE   EQU     00000000b       ;adatir ny
;                    ³³ÀÄÄÄÄÄÄÄÄ N/U
;                    ³ÀÄÄÄÄÄÄÄÄÄ N/U
;                    ÀÄÄÄÄÄÄÄÄÄÄ N/U
;
;Timings:
LED_DEL EQU     100             ;*10ms LED  llapotv lt s delay
LCD_PWD EQU     50              ;*10ms LCD power_up delay
;
;Chars:
ESC     EQU     27              ;fESC-et 1-be teszi
CR      EQU     13              ;kocsivissza
LF      EQU     10              ;soremel‚s
ETX     EQU     26              ;string lez r¢ (ez jobb lesz mint a CR...)
;
;
;Macros:
BANK0   MACRO
        BCF     STATUS,RP0
        BCF     STATUS,RP1
        ENDM
BANK1   MACRO
        BSF     STATUS,RP0
        BCF     STATUS,RP1
        ENDM
BANK2   MACRO
        BCF     STATUS,RP0
        BSF     STATUS,RP1
        ENDM
BANK3   MACRO
        BSF     STATUS,RP0
        BSF     STATUS,RP1
        ENDM

PAGE0   MACRO
        BCF     PCLATH,3        ;0h..7FFh
        ENDM
PAGE1   MACRO
        BSF     PCLATH,3        ;800h..FFFh
        ENDM
;
;
;Variables:
        CBLOCK  20h
          ;Registers:
          R0,R1,R2,R3           ;n‚h ny  ltal nos c‚l£ reg.
          FLAGS                 ;ebbe bit v ltoz¢kat tesz�nk
        ENDC
;
;Flag-ek:
#DEFINE fESC    FLAGS,0         ;LDC k”v. kar. parancsreg-be
#DEFINE fLCD    FLAGS,1         ;PRCH fLCD=1: LCD-re, 0: soros vonalra megy
#DEFINE fZERO   FLAGS,2         ;PRDEC haszn lja
;
;
;Code:
        ORG     0               ;Resetkor itt indul
        GOTO    START
;
INISTR
        DT      ESC,38h         ;2 line, 5*7dot
        DT      ESC,38h         ;2 line, 5*7dot
        DT      ESC,12          ;dispaly ON, cursor on, blink on
        DT      ESC,06h         ;cursor increment, display freeze
        DT      ESC,01h         ;CLS
        DT      ETX
;

;


;
;
        ORG     100h
START					;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
        CALL    PORT_INI
        CLRF    FLAGS
        MOVLW   LCD_PWD
        CALL    DEL10           ;200ms-et v runk LCD-re
        CALL    LCD_INI

MAIN                    ;F”hurok
        MOVLW   135
        CALL    LCDCMD          ;LCD kurzor valahova
        MOVLW   0		;0  analog csat.
        CALL    GETAIN          ;AIN0 (poti)
        MOVWF   R3		;W-T AZ  R3 BA
        CALL    PRDEC
        GOTO    MAIN            ;ezt ism‚telj�k napestig...
;

;Szubrutinok:
PORT_INI                ;El”bb a portok adatir ny t ‚s alap‚rt‚k‚t
                        ;  llitjuk be...
        MOVLW   DEFARC
        MOVWF   PORTC
        MOVLW   DEFARD
        MOVWF   PORTD
        MOVLW   DEFARE
        MOVWF   PORTE
        BANK1                   ;a 128..255 k”z”tti regiszterek irjuk...
        MOVLW   00000010b       ;RA analog in, RE digit I/O ADRES left justified
        MOVWF   ADCON1          ; ADRES left justified (csak 8 bitesnek haszn ljuk)
        MOVLW   DIRRA
        MOVWF   TRISA
        MOVLW   DIRRBI
        MOVWF   TRISB
        MOVLW   DIRRC
        MOVWF   TRISC
        MOVLW   DIRRD
        MOVWF   TRISD
        MOVLW   DIRRE
        MOVWF   TRISE           ;Adatir nyok...
        MOVLW   00000000b       ;Pull-up on, prescaler timer mode
        MOVWF   OPTION_REG
        CLRWDT
        BANK0
        RETURN
;

;
LCD_INI                 ;LCD �zemm¢d be llit sok
        MOVLW   INISTR

PRSTR                   ;W->str cim (0..FFh)
        MOVWF   R0
        CLRF    PCLATH
PRSTR_L
        CALL    JMPR0           ;k”v. karakter
        BTFSC   fESC            ;nem ESC volt?
        GOTO    PRSTR_1         ;az ESC ut ni karaktert nem n‚zz�k ETX-re
        XORLW   ETX             ;str v‚ge?
        SKPNZ                   ;nem ETX?
        RETURN
        XORLW   ETX             ;W vissza
PRSTR_1
        CALL    PRCH            ;kiirjuk
        INCF    R0,F            ;str mutat¢ +1
        GOTO    PRSTR_L
JMPR0                   ;GOTO [R0]
        MOVF    R0,W
        MOVWF   PCL
;
PRDIG                   ;W->scale; R1<->num; W<-'0'..'9'; fZERO<-1 if W<>0
        SUBLW   0
        CLRF    R0
        DECF    R0,F
PRD_L                           ;megsz moljuk hogy h nyszor lehet
                                ;levonni a scale-t (W) a sz mb¢l (R1)
        INCF    R0,F
        ADDWF   R1,F
        BC      PRD_L
        SUBLW   0
        ADDWF   R1,F
        MOVF    R0,W
        IORLW   0
        SKPZ
        BCF     fZERO
        ADDLW   '0'
        BTFSC   fZERO
        MOVLW   ' '             ;‚rt‚ktelen 0
        GOTO    PRCH
;
PRDEC                   ;W->data, decim lis kiir¢, ‚rt‚ktelen 0 kiolt ssal
        MOVWF   R1
        BSF     fZERO
        MOVLW   100
        CALL    PRDIG           ;100-as helyi‚rt‚k
        MOVLW   10
        CALL    PRDIG           ;10-es helyi‚rt‚k
        MOVF    R1,W
        ADDLW   '0'
        GOTO    PRCH            ;1-es helyi‚rt‚k
;

PRCH                    ;W->char LCD-re
        BTFSC   fESC            ;nem ESC volt?
        GOTO    LCDCMD          ;ha ESC volt, ez a parancsreg-be megy
        XORLW   ESC
        BTFSS   STATUS,Z
        GOTO    PRCH_1          ;nem ESC?
        BSF     fESC
        RETURN
PRCH_1
        XORLW   ESC             ;vissza llitjuk az eredeti W-t
        BTFSC   fESC            ;nem volt ESC el”tte -> adatreg-be irjuk
        GOTO    LCDCMD
LCDCHR                  ;W->LCD data
        BSF     LCDRS        ;data reg.
        GOTO    LCDWR
LCDCMD                  ;W->LCD cmd ; Cy<-error
        BCF     fESC
        BCF     LCDRS        ;cmd reg.
LCDWR                   ;W->data
        BCF     LCDRW
        BCF     LCDEN           ;LCD. EN:=L
        MOVWF   LCDDAT          ;PORTB kimeneti t rba beirjuk
        BANK1
        MOVLW   DIRRBO
        MOVWF   LCDDAT          ;adatir ny mind ki
        BANK0
        BSF     LCDEN           ;LCDEN=H
        GOTO    $+1             ;ez 2us DELAY...
        BCF     LCDEN
        BANK1
        MOVLW   DIRRBI
        MOVWF   LCDDAT          ;adatir ny mind be
        BANK0
        BCF     LCDRS
        BSF     LCDRW           ;read status reg.
        BSF     LCDEN           ;LCD. EN:=H
LCDW_L                          ;8 clk
        BTFSC   LCDBUSY         ;LCD k‚sz?
        GOTO    LCDW_L          ;v runk...
LCDW_E
        BCF     LCDEN           ;LCD. EN:=L
        RETURN
;
GETAIN                  ;W->chan.(0..7); W<-value(0..255)
        MOVWF   R0
        RLF     R0,F
        RLF     R0,F
        RLF     R0,W            ;3-al balra kell shiftelni
        ANDLW   00111000b       ;a b3..b5 bitpozici¢kon v rja a csatorn t
        IORLW   10000001b       ;Fosc/32 clk, ch0, ADON
        MOVWF   ADCON0
        CLRF    R0
        DECFSZ  R0,F
        GOTO    $-1             ;sample/hold (800us)
        BSF     ADCON0,GO_DONE  ;indul a konverzi¢
GETA_L
        BTFSC   ADCON0,GO_DONE  ;v runk mig k‚sz nem lesz
        GOTO    GETA_L
        GOTO    $+1
        GOTO    $+1
        GOTO    $+1
        GOTO    $+1
        MOVF    ADRESH,W         ;W:=eredm‚ny
        RETURN
;
DELAY                   ;LED_DEL*10ms-et v r
        MOVLW   LED_DEL
DEL10                   ;W*10ms-et v r
        MOVWF   R2
DEL1_L
        MOVLW   HIGH 3333       ;mivel a DEL_L 3 ciklus, egy ciklus 1us
        MOVWF   R1              ; a 10ms 3333 ciklus lesz...
        MOVLW   LOW 3333        ;az als¢ byte-ja az R0-ba
        MOVWF   R0
DEL_L
        DECFSZ  R0              ;R0=R0-1
        GOTO    DEL_L           ;ha R0<>0
        DECFSZ  R1              ;R1=R1-1
        GOTO    DEL_L           ;ha R1<>0
        CLRWDT                  ;watch-dog-ot 10ms-enk‚nt frissitj�k
        DECFSZ  R2              ;R2=R2-1
        GOTO    DEL1_L          ;ha R2<>0
        RETURN                  ;vissza a hiv¢hoz...
;
;
        ORG     800h            ;PAGE1
        NOP
;
        END
