 LIST P=16f676
 #include "p16f676.inc"
 
 __CONFIG _WDT_OFF & _INTRC_OSC_NOCLKOUT & _CP_OFF & _MCLRE_OFF
 
 cblock  0x20
 		count            
        COUNT1           
        COUNTA
       	COUNTB
        tmp1             
       	tmp2
       	temp
       	templcd          
       	templcd2
        counter1
        counter2
  		NumL             ; Bináris bemenetek a decimális konverzióhoz.
        NumH     
        TenK             ; Decimális kimenetek a konverziós rutinból.
        Thou     
        Hund     
        Tens     
        Ones
             
        endc
  
   
  LCD	EQU	PORTC
  RS	EQU	4
  E		EQU	5
   
 ORG 0
 
 	clrf	PORTC
 	BSF		STATUS,RP0
	CLRF	ANSEL
 	MOVLW	00H
 	MOVWF	TRISC
 	
 	movlw	b'000001'
	movwf	TRISA			; set A to all outputs

	movlw	b'00000001'
	movwf	ANSEL			; turn on only analog input 0

	bcf		ADCON1,ADCS2		; set ADCS<2:0> = 001 ->
	bcf		ADCON1,ADCS1		; Sample Time 8*Tosc
	bsf		ADCON1,ADCS0		; from Data Sheet

 	BCF		STATUS,RP0
 	
 	movlw	b'11100011'		; set A/D input channel 0
	andwf	ADCON0, f

	bcf		ADCON0, ADFM		
	bcf		ADCON0, VCFG		; set reference voltage = Vdd
	bsf		ADCON0, ADON		; turn on A/D converter
 	
 	clrf	PORTC 
 	CALL	KESLELTET100
 	CALL	LCD_INIT
 	CLRF	count
 
Message 
	 CLRW                      ; Üzenetek kezelése.
     movf    count,W          ; Számláló értéke a W regiszterbe.
     call    Szoveg1          ; Beolvas egy karaktert az 1. táblázatból.
     xorlw   0x00             ; Zéró a státuszbit értéke?
     btfsc   STATUS,Z
     goto    NextMessage
     call    LCD_Char
     incf    count,f
     goto    Message
     
loop
	clrf	ADRESL
	CLRF	ADRESH	
	bsf		ADCON0, GO		; acquire a sample
wait_for_sample
	btfsc	ADCON0, NOT_DONE
	goto	wait_for_sample  
    CLRW
NextMessage
     call    LCD_Line2        ; A 2. sor 1. oszlopába állítja a kurzort.
     call    Convert          ; Decimálisra konvertál.
     movf    TenK,W           ; Kijelzi a decimális karaktereket.
     call    LCD_CharD        ; LCD_CharD használata ASCII konverzióhoz.
     movf    Thou,W
     call    LCD_CharD
     movf    Hund,W
     call    LCD_CharD     
     movf    Tens,W
     call    LCD_CharD
     movf    Ones,W
     call    LCD_CharD
     movlw   ' '              ; Szóköz kijelzése...
     call    LCD_Char
     movf    NumH,W           ; ...és a számláló hexadecimálisan.
     call    LCD_HEX
     movf    NumL,W
     call    LCD_HEX
     
	 MOVF	ADRESL,W   
     MOVWF	NumL
     
         
Next
     call    KESLELTET255     ; Várakozás, hogy látható legyen.
     goto    loop


 
LCD_INIT
	MOVLW	03H
	CALL	LCD_CMD
	MOVLW	03H
	CALL	LCD_CMD
	MOVLW	03H
	CALL	LCD_CMD
	MOVLW	02H
	CALL	LCD_CMD
	MOVLW	28H
	CALL	LCD_CMD
	MOVLW	08H
	CALL	LCD_CMD
	
	CALL	LCD_CLR

	MOVLW	06H
	CALL	LCD_CMD
	
	MOVLW	0CH			;LCD ON
	CALL	LCD_CMD
return
; GOTO	STOP
; Parancs-üzemmód beállítása.
LCD_CMD
     movwf   templcd
     swapf   templcd,W        ; Elküldi a felső nibble-t.
     andlw   0x0f             ; Törli a felső 4 bitet a W regiszterből.
     movwf   LCD
     bcf     LCD,RS  ; RS vonalat nullára állítja.
     call    ENABLE          ; Magas impulzust küld az Enable lábra.

     movf    templcd,W        ; Elküldi a alsó nibble-t.
     andlw   0x0f             ; Törli a felső 4 bitet a W regiszterből.
     movwf   LCD
     bcf     LCD,RS  ; RS vonalat nullára állítja.
     call    ENABLE          ; Magas impulzust küld az Enable lábra.
     call    KESLELTET5
     retlw   0x00 


 
KESLELTET255
     movlw   0xff             ; A késleltetés 255ms.
     goto    K0
KESLELTET100
     movlw   d'100'           ; A késleltetés 100ms.
     goto    K0
KESLELTET50
     movlw   d'50'            ; A késleltetés 50ms.
     goto    K0
KESLELTET20
     movlw   d'20'            ; A késleltetés 20ms.
     goto    K0
KESLELTET5
     movlw   0x05             ; A késleltetés 5.000 ms (4 MHz órajel).
K0
     movwf   COUNT1
K1
     movlw   0xC7             ; A késleltetés 1ms.
     movwf   COUNTA
     movlw   0x01
     movwf   COUNTB
KESLELTET_0
     decfsz  COUNTA,f
     goto    $+2
     decfsz  COUNTB,f
     goto    KESLELTET_0

     decfsz  COUNT1,f
     goto    K1
     retlw   0x00

ENABLE
     bsf     LCD,E   ; Magasra állítja az LCD Enable bemenetét.
     NOP
     ;CALL    KESLELTET5                   ; Egy óraciklus idejére magasan tartja.
     bcf     LCD,E   ; Törli az E bemenetet (alacsony szint).
     retlw   0x00

LCD_CLR
     movlw   01H             ; Törli a kijelzőt.
     call    LCD_CMD
     retlw   0x00

LCD_CharD
     addlw   0x30
LCD_Char
     movwf   templcd
     swapf   templcd,W        ; Elküldi a felső nibble-t.
     andlw   0x0f             ; Törli a felső 4 bitet a W regiszterből.
     movwf   LCD
     bsf     LCD,RS  ; RS vonalat egyre állítja.
     call    ENABLE          ; Magas impulzust küld az Enable lábra.

     movf    templcd,W        ; Elküldi a alsó nibble-t.
     andlw   0x0f             ; Törli a felső 4 bitet a W regiszterből.
     movwf   LCD
     bsf     LCD,RS  ; RS vonalat egyre állítja.
     call    ENABLE          ; Magas impulzust küld az Enable lábra.
     call    KESLELTET5
     retlw   0x00

; Kurzor pozicionálása.
LCD_Line1
     movlw   0x80             ; Az 1. sor 1. oszlopába helyezi a kurzort.
     call    LCD_CMD
     retlw   0x00

LCD_Line2
     movlw   0xc0             ; A 2. sor 1. oszlopába helyezi a kurzort.
     call    LCD_CMD
     retlw   0x00

LCD_Line1W
     addlw   0x80             ; Az 1. sor W oszlopába helyezi a kurzort
     call    LCD_CMD
     retlw   0x00

LCD_Line2W
     addlw   0xc0             ; A 2. sor W oszlopába helyezi a kurzort.
     call    LCD_CMD
     retlw   0x00

LCD_CurOn
     movlw   0x0d             ; Kijelző ki/be és kurzor parancs.
     call    LCD_CMD
     retlw   0x00

LCD_CurOff
     movlw   0x0c             ; Kijelző ki/be és kurzor parancs.
     call    LCD_CMD
     retlw   0x00

LCD_Clr
     movlw   0x01             ; Törli a kijelzőt.
     call    LCD_CMD
     retlw   0x00

LCD_HEX
     movwf   tmp1
     swapf   tmp1,w
     andlw   0x0f
     call    HEX_Table
     call    LCD_Char
     movf    tmp1,W
     andlw   0x0f
     call    HEX_Table
     call    LCD_Char
     retlw   0x00

; LCD rutinok vége.

HEX_Table
     addwf   PCL,f
     retlw   0x30
     retlw   0x31
     retlw   0x32
     retlw   0x33
     retlw   0x34
     retlw   0x35
     retlw   0x36
     retlw   0x37
     retlw   0x38
     retlw   0x39
     retlw   0x41
     retlw   0x42
     retlw   0x43
     retlw   0x44
     retlw   0x45
     retlw   0x46

Szoveg1
     addwf   PCL,f
     retlw   'P'
     retlw   'A'
     retlw   'R'
     retlw   'A'
     retlw   'A'
     retlw   'R'
     retlw   'T'
     retlw   'E'
     retlw   'K'
     retlw   ' '
     retlw   ' '
     retlw   ' '
     retlw   ' '
     retlw   ' '
     retlw   '.'
     retlw   0x00

Convert
     swapf   NumH,W
     iorlw   B'11110000'
     movwf   Thou
     addwf   Thou,f
     addlw   0XE2
     movwf   Hund
     addlw   0X32
     movwf   Ones

     movf    NumH,w
     andlw   0X0F
     addwf   Hund,f
     addwf   Hund,f
     addwf   Ones,f
     addlw   0XE9
     movwf   Tens
     addwf   Tens,f
     addwf   Tens,f

     swapf   NumL,w
     andlw   0X0F
     addwf   Tens,f
     addwf   Ones,f

     rlf     Tens,f
     rlf     Ones,f
     comf    Ones,f
     rlf     Ones,f

     movf    NumL,w
     andlw   0X0F
     addwf   Ones,f
     rlf     Thou,f

     movlw   0X07
     movwf   TenK
                              ; Ezen a ponton az eredeti szám egyenlő:
                              ; TenK*10000+Thou*1000+Hund*100+Tens*10+Ones
                              ; tekintettel a bináris kettes komplemensre.
                              ; Hogy pontosak legyünk, mindegyikük negatív,
                              ; kivéve a TenK-et. Most a számot
                              ; normalizálni kell, de ezt megtehetjük
                              ; egyszerű byte-aritmetikával.
     movlw   0X0A             ; Ten
Lb1:
     addwf   Ones,f
     decf    Tens,f
     btfss   3,0
     goto    Lb1
Lb2:
     addwf   Tens,f
     decf    Hund,f
     btfss   3,0
     goto    Lb2
Lb3:
     addwf   Hund,f
     decf    Thou,f
     btfss   3,0
     goto    Lb3
Lb4:
     addwf   Thou,f
     decf    TenK,f
     btfss   3,0
     goto    Lb4

     retlw   0x00




 END