	list      p=16F877,r=dec            
	#include <p16F877.inc>         
	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _LVP_OFF
        ORG     2000h
        DW      'v','o','l','t'
;-----------------------------------------------------------
   CBLOCK  20h
	R0,R1,R2,R3,R4,R5     ;
	WWL,WWH,TMP,W1L,W1H,DIVL,DIVH,OSZTO
	FLAGS,CHAN
	ENDC
LCD_RS  equ 5               ; 0= parancs, 1= adat reg. választás
LCD_RW  equ 6               ; R/W=0 LCD írás, R/W=1 LCD memória olvasás
LCD_EN  equ 7               ; 0= LCD tiltás, 1= engedélyezés
#DEFINE fZERO   FLAGS,2         ;PRDEC használja

bank0   MACRO					;Feszmero progi, AN0-AN3 csatornat meri
        BCF     STATUS,RP0		;es kiirja az LCD-n 511-ig	
        BCF     STATUS,RP1		;
        ENDM
bank1   MACRO
        BSF     STATUS,RP0
        BCF     STATUS,RP1
        ENDM
;------------------------------------------------------------
	org	0
ini		call	port_ini
		call	LCD_INI
		call	lcdlogo
	MOVLW	100
	CALL	DELAY
	MOVLW	1
	CALL LCDCMD

main     ; ====================================================
	MOVLW	3
	CALL	GETAIN
	MOVLW	128
	CALL	LCDCMD
	bank1
	movf	ADRESL,W
	bank0
	MOVWF	DIVL
	MOVF	ADRESH,W
	MOVWF	DIVH
	CALL	osztas
	movf	DIVL,W
	MOVWF	WWL
	movf	DIVH,W
	MOVWF	WWH	
	CALL	PRDECW
;
	MOVLW	2
	CALL	GETAIN
	MOVLW	128+5
	CALL	LCDCMD
	bank1
	movf	ADRESL,W
	bank0
	MOVWF	DIVL
	MOVF	ADRESH,W
	MOVWF	DIVH
	CALL	osztas
	movf	DIVL,W
	MOVWF	WWL
	movf	DIVH,W
	MOVWF	WWH	
	CALL	PRDECW
;
	MOVLW	1
	CALL	GETAIN
	MOVLW	128+10
	CALL	LCDCMD
	bank1
	movf	ADRESL,W
	bank0
	MOVWF	DIVL
	MOVF	ADRESH,W
	MOVWF	DIVH
	CALL	osztas
	movf	DIVL,W
	MOVWF	WWL
	movf	DIVH,W
	MOVWF	WWH	
	CALL	PRDECW
;
	MOVLW	0
	CALL	GETAIN
	MOVLW	128+15
	CALL	LCDCMD
	bank1
	movf	ADRESL,W
	bank0
	MOVWF	DIVL
	MOVF	ADRESH,W
	MOVWF	DIVH
	CALL	osztas
	movf	DIVL,W
	MOVWF	WWL
	movf	DIVH,W
	MOVWF	WWH	
	CALL	PRDECW

	GOTO	main

;   Rutinok   ====================================================
DELAY                   ;W*10ms-et vár   R0, R1,R2 regisztereket hasznalja

        MOVWF   R2
DEL1_L
        MOVLW   HIGH 8333       ;mivel a DEL_L 3 ciklus, egy ciklus 1us
        MOVWF   R1              ; a 10ms 3333 ciklus lesz...
        MOVLW   LOW 8333        ;az alsó byte-ja az R0-ba
        MOVWF   R0
DEL_L
        DECFSZ  R0,f              ;R0=R0-1
        GOTO    DEL_L           ;ha R0<>0
        DECFSZ  R1,f              ;R1=R1-1
        GOTO    DEL_L           ;ha R1<>0
        DECFSZ  R2,f              ;R2=R2-1
        GOTO    DEL1_L          ;ha R2<>0
        RETURN                  ;vissza a hivóhoz...
;--------------------------------------
led_be
        BSF     PORTD,0
	return
led_ki
        BCF     PORTD,0
        RETURN
;--------------------------------------
port_ini   ;a portok adatiránya és alapértéke
	bank0
        MOVLW   b'00000000'	;Analog
        MOVWF   PORTA
        MOVLW   b'00000000'	;LCD
        MOVWF   PORTB
        MOVLW   b'00000000'	;szabad
        MOVWF   PORTC
        MOVLW   b'00000000'	;DE a kis panelon a LED-ek a poz.on vannak!   5,6,7: LCD
        MOVWF   PORTD
        MOVLW   b'00000000'	;szbad
        MOVWF   PORTE
        MOVLW   b'10000001'	;CL/32 oszcillator, O.csat,AD modul bekapcs
        MOVWF   ADCON0
	bank1                 
        MOVLW   b'10000000'   ;RA analog in, RE digit I/O ADRES R justified,
        MOVWF   ADCON1      ; AD-t csak 10 bitesnek használjuk
        MOVLW   b'00111111'	;az RA0 analog bemenet+gombok
        MOVWF   TRISA
        MOVLW   b'00000000'
        MOVWF   TRISB
        MOVLW   b'10000000'	;RC7 bemenet az RS232 miatt
        MOVWF   TRISC
        MOVLW   b'00000000'
        MOVWF   TRISD
        MOVLW   b'00000000'
        MOVWF   TRISE          
        MOVLW   b'00000000'       ;Pull-up on, prescaler t0-hoz, timer mode
        MOVWF   OPTION_REG
        bank0
        RETURN	
;-------------------------------------------------------------------------
LCD_INI
        movlw   30
        call    DELAY           ; Tapfelallasra var
        movlw   56              ; 38h, 8 bit interface set, 2 soros, 00111000
        call    LCDCMD
        movlw   56
        call    LCDCMD
        movlw   6               ; 06h, Entry mode set: increment,display rogzitett
        call    LCDCMD
        movlw   12              ; Display on, cursor on-off /blink on-off  00001111
        call    LCDCMD
        movlw   20              ; Disp:  leptetes jobbra, kurzor mozog
        call    LCDCMD
        movlw   1               ; 01h, Display clear
        call    LCDCMD
        RETURN
;-------------------------------------------------------------------------
LCDCHR                  ;W->karakter LCD-re, LCD a B-porton, maradek a D-n
        BSF     PORTD,LCD_RS    ;LCD R/S:  adatregiszter
        GOTO    LCDWRITE
LCDCMD		;w-> parancs az LCD-re
        BCF     PORTD,LCD_RS    ;LCD R/S:  parancsregiszter
LCDWRITE
        BCF     PORTD,LCD_RW    ;LCD iras
        BCF     PORTD,LCD_EN    ;LCD. EN:=L
        MOVWF   PORTB           ;PORTB kimeneti tárba beirjuk
        bank1
        MOVLW   0
        MOVWF   TRISB           ;adatirány mind ki
        bank0
        BSF     PORTD,LCD_EN    ;LCDEN=H, enable
        BCF     PORTD,LCD_EN    ;LCD disable
        bank1
        MOVLW   255
        MOVWF   TRISB           ;adatirány mind be
        bank0
        BCF     PORTD,LCD_RS    ;LCD parancs
        BSF     PORTD,LCD_RW    ;LCD read status reg.
        BSF     PORTD,LCD_EN    ;LCD. EN:=H ENABLE
LCDW_L                          ;8 clk
        BTFSC   PORTB,7         ;LCD kész?
        GOTO    LCDW_L          ;várunk...
LCDW_E
        BCF     PORTD,LCD_EN    ;LCD. EN:=L tiltva
        RETURN
;-----------------------------------------------
PRDECW                  ;WWL,WWH<->data, decimális kiiró, értéktelen 0 kioltással
        BSF     fZERO	;fZERO, R1,R2,R3,W1L,W1H
        MOVLW   4
        MOVWF   R1
        MOVF    WWL,W	;ez a bemenet
        MOVWF   W1L
        MOVF    WWH,W	;ez a bemenet
        MOVWF   W1H
PRDW_L
        CLRC                    ;Cy:=0
        RLF     R1,W            ;W:=R1*2
        CALL    PWRTBL          ;LOW (10^R1)
        MOVWF   R2
        SETC                    ;Cy:=1
        RLF     R1,W            ;W:=R1*2+1
        CALL    PWRTBL          ;HIGH (10^R1)
        MOVWF   R3
        MOVLW   -1
        MOVWF   R0              ;ebben számoljuk össze, hányszor lehet
                                ; levonni a 10^R1 értékét a számunkból
PRDW_1
        INCF    R0,F
        MOVF    R2,W
        SUBWF   W1L,F           ;W1L:=W1L-LOW (10^R1)
        MOVF    R3,W
        SKPC                    ;az elözö kivonásnál nem volt áthozatal?
        INCF    R3,W            ;a felsö byte-ból 1-el többet vonunk le
        SUBWF   W1H,F           ;W1H:=W1H-LOW (10^R1)-Borrow
        SKPNC                   ;az elözö kivonásnál volt áthozatal?
        GOTO    PRDW_1          ;ki lehetett vonni, tovább vonogatjuk...
        MOVF    R2,W
        ADDWF   W1L,F           ;vissza hozzáadjuk W1L,W1H-hoz R2,R3-at
        SKPNC                   ;nincs átvitel?
        INCF    W1H,F           ;az átvitelt a felsö byte-hoz
        MOVF    R3,W
        ADDWF   W1H,F           ;felsö byte-ot is
        MOVF    R0,W
        SKPZ
        BCF     fZERO
        ADDLW   '0'
        BTFSC   fZERO           ;értékes 0?
        MOVLW   ' '             ;értéktelen 0
        CALL    PRCH
        DECFSZ  R1,F
        GOTO    PRDW_L
        MOVF    W1L,W           ;az utolsó digit
        ADDLW   '0'
        CALL    PRCH
        RETURN
PRCH
		call	LCDCHR
		RETURN
;----------------------------------------------------------------
PWRTBL                          ;W->0..4*2; W<-10^W/2 LO/HI
        ANDLW   0Fh
        ADDWF   PCL,F
        DT      1,0
        DT      10,0
        DT      100,0
        DT      LOW 1000,HIGH 1000
        DT      LOW 10000,HIGH 10000
;----------------------------------------------------------------
lcdlogo
  		movlw   128+0           ;Elso sor, elso karakter
		call    LCDCMD
		movlw '1'
		call	LCDCHR
		movlw '6'
		call	LCDCHR
		movlw 'F'
		call	LCDCHR
		movlw '8'
		call	LCDCHR
		movlw '7'
		call	LCDCHR
		movlw '7'
		call	LCDCHR
		return
;----------------------------------------------------------------
GETAIN                  ;W->chan.(0..7); W<-value(0..255),  f877-re, reg:R0
        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
 
        RETURN
;--------------------------------------------------------
osztas
		MOVLW	2		;W-be berakjuk az osztot ami 8 bites
DIVWW                   ;WW<-WW/W    WWL,WWH BA TESZI A WWL,WWH/W-T
        MOVWF   TMP
        CLRF    R0
        CLRF    R1              ;remainder
        MOVLW   17
        MOVWF   R2
        CLRC
DIV_L
        RLF     R0,F
        RLF     R1,F            ;remainder=remainder*2+next_bit
        MOVF    TMP,W
        SUBWF   R0,F            ;remainder-=divider
        BC      DIV_O           ;no borrow
        MOVF    R1,F
        BZ      DIV_1
        DECF    R1,F
        SETC
        GOTO    DIV_O
DIV_1
        ADDWF   R0,F
        CLRC
DIV_O
        RLF     DIVL,F  ;ez a bemenet ES A KIMENET
        RLF     DIVH,F
        DECFSZ  R2,F
        GOTO    DIV_L
        RETURN


	end


