        TITLE   "Zsolti PIC prblja v5"     ; Az elso AN csatorna erteket irja ki az LCD-re decimalisan

        LIST    P=PIC16F877, F=INHX8M, R=DEC
;
        INCLUDE  <P16F877.INC>  ;a proc regiszternv s bitnv konstansok
                                ; hozzfzse


        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       ;adatirny (br ezek analg bemenetek lesznek...)

LCDDAT  EQU     PORTB           ;LCD adat port
KBDDAT  EQU     PORTB
#DEFINE LCDBUSY PORTB,7         ;LCD foglalt
KBDMSK  EQU     00011111b       ;maszk rtk
DIRRBI  EQU     11111111b       ;adatirny (mind bemenet, ha LCD/KBD olvass)
DIRRBO  EQU     00000000b       ;adatirny (mind kimenet, ha LCD irs)

;
LEDDAT  EQU     PORTD
KSELDAT EQU     PORTD
LEDMSK  EQU     00011111b       ;LED-ek maszkja

#DEFINE LCDRS   PORTD,5         ;LCD regiszter kivlaszts
                                ; 0: parancsreg. , 1: adatreg.
#DEFINE LCDRW   PORTD,6         ;LCD adatirny (0: irs, 1: olvass)
#DEFINE LCDEN   PORTD,7         ;LCD engedlyezs
DEFARD  EQU     00011111b       ;alaprtk
DIRRD   EQU     00000000b       ;adatirny (mind kimenet)

;


DEFARC  EQU     11000000b       ;alaprtk
DIRRC   EQU     10000111b       ;adatirny

;
DEFARE  EQU     11000000b       ;alaprtk
DIRRE   EQU     00000000b       ;adatirny
;                     N/U
;                     N/U
;                     N/U
;
;Timings:
LED_DEL EQU     100             ;*10ms LED llapotvlts 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              ;soremels
ETX     EQU     26              ;string lezr (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           ;nhny ltalnos cl reg.
          FLAGS                 ;ebbe bit vltozkat tesznk
        ENDC
;
;Flag-ek:
#DEFINE fESC    FLAGS,0         ;LDC kv. kar. parancsreg-be
#DEFINE fLCD    FLAGS,1         ;PRCH fLCD=1: LCD-re, 0: soros vonalra megy
#DEFINE fZERO   FLAGS,2         ;PRDEC hasznlja
;
;
;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 vrunk LCD-re
        CALL    LCD_INI

MAIN                    ;Fhurok
        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 ismteljk napestig...
;

;Szubrutinok:
PORT_INI                ;Elbb a portok adatirnyt s alaprtkt
                        ; llitjuk be...
        MOVLW   DEFARC
        MOVWF   PORTC
        MOVLW   DEFARD
        MOVWF   PORTD
        MOVLW   DEFARE
        MOVWF   PORTE
        BANK1                   ;a 128..255 kztti regiszterek irjuk...
        MOVLW   00000010b       ;RA analog in, RE digit I/O ADRES left justified
        MOVWF   ADCON1          ; ADRES left justified (csak 8 bitesnek hasznljuk)
        MOVLW   DIRRA
        MOVWF   TRISA
        MOVLW   DIRRBI
        MOVWF   TRISB
        MOVLW   DIRRC
        MOVWF   TRISC
        MOVLW   DIRRD
        MOVWF   TRISD
        MOVLW   DIRRE
        MOVWF   TRISE           ;Adatirnyok...
        MOVLW   00000000b       ;Pull-up on, prescaler timer mode
        MOVWF   OPTION_REG
        CLRWDT
        BANK0
        RETURN
;

;
LCD_INI                 ;LCD zemmd bellitsok
        MOVLW   INISTR

PRSTR                   ;W->str cim (0..FFh)
        MOVWF   R0
        CLRF    PCLATH
PRSTR_L
        CALL    JMPR0           ;kv. karakter
        BTFSC   fESC            ;nem ESC volt?
        GOTO    PRSTR_1         ;az ESC utni karaktert nem nzzk ETX-re
        XORLW   ETX             ;str vge?
        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                           ;megszmoljuk hogy hnyszor lehet
                                ;levonni a scale-t (W) a szmbl (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   ' '             ;rtktelen 0
        GOTO    PRCH
;
PRDEC                   ;W->data, decimlis kiir, rtktelen 0 kioltssal
        MOVWF   R1
        BSF     fZERO
        MOVLW   100
        CALL    PRDIG           ;100-as helyirtk
        MOVLW   10
        CALL    PRDIG           ;10-es helyirtk
        MOVF    R1,W
        ADDLW   '0'
        GOTO    PRCH            ;1-es helyirtk
;

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             ;visszallitjuk az eredeti W-t
        BTFSC   fESC            ;nem volt ESC eltte -> 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 trba beirjuk
        BANK1
        MOVLW   DIRRBO
        MOVWF   LCDDAT          ;adatirny mind ki
        BANK0
        BSF     LCDEN           ;LCDEN=H
        GOTO    $+1             ;ez 2us DELAY...
        BCF     LCDEN
        BANK1
        MOVLW   DIRRBI
        MOVWF   LCDDAT          ;adatirny mind be
        BANK0
        BCF     LCDRS
        BSF     LCDRW           ;read status reg.
        BSF     LCDEN           ;LCD. EN:=H
LCDW_L                          ;8 clk
        BTFSC   LCDBUSY         ;LCD ksz?
        GOTO    LCDW_L          ;vrunk...
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 bitpozicikon vrja a csatornt
        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  ;vrunk mig ksz nem lesz
        GOTO    GETA_L
        GOTO    $+1
        GOTO    $+1
        GOTO    $+1
        GOTO    $+1
        MOVF    ADRESH,W         ;W:=eredmny
        RETURN
;
DELAY                   ;LED_DEL*10ms-et vr
        MOVLW   LED_DEL
DEL10                   ;W*10ms-et vr
        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-enknt frissitjk
        DECFSZ  R2              ;R2=R2-1
        GOTO    DEL1_L          ;ha R2<>0
        RETURN                  ;vissza a hivhoz...
;
;
        ORG     800h            ;PAGE1
        NOP
;
        END
