
; Převod 16bitového čísla do dekadického tvaru
; Power by M.Supík 2011

LIST P=16F628A,R=DEC 
INCLUDE<P16F628A.INC>  

;------------------------------------------------------------------------------
; Definice registrů
;------------------------------------------------------------------------------

CISLO_C1	EQU		21h			; Dolních 8 bitů čísla
CISLO_C2	EQU		22h			; Horních 8 bitů čísla

DIGIT_A		EQU		23h			; Zobrazení čísla na LCD digit 1
DIGIT_B		EQU		24h			; Zobrazení čísla na LCD digit 10
DIGIT_C		EQU		25h			; Zobrazení čísla na LCD digit 100
DIGIT_D		EQU		26h			; Zobrazení čísla na LCD digit 1000
DIGIT_E		EQU		27h			; Zobrazení čísla na LCD digit 10000

;------------------------------------------------------------------------------
; TEST
;------------------------------------------------------------------------------

TEST	
	CLRF		DIGIT_A			; Mazání DIGITů
 	CLRF		DIGIT_B	
 	CLRF		DIGIT_C	
 	CLRF		DIGIT_D	
 	CLRF		DIGIT_E
	MOVLW		255
	MOVWF		CISLO_C1
	MOVLW		255
	MOVWF		CISLO_C2
	CALL		PREVOD_16_DO_DEC
	GOTO		TEST			; Výsledek 255 * 256 + 255 = 65535 (A=5, B=3, C=5, D=5, E=6)

;------------------------------------------------------------------------------
; Převod 16bitoveho čísla do dekadické podoby
;------------------------------------------------------------------------------

PREVOD_16_DO_DEC				; Převod horních 8bitů
	MOVLW		32h				; Od horních 8bitů odečteme 50
 	SUBWF		CISLO_C2,W		; Výsledek necháme v pracovním registru W
 	BTFSS		STATUS,C		; Otestujeme, zda je vásledek kladný
 	GOTO		PREVOD_16_2		; Pokud ne, pokračujeme v odčítání nižším číslem
	MOVWF		CISLO_C2		; Pokud ano, můžeme výsledek odčítání uložit
 	MOVLW		01h				; Do registru DIGIT_E přičteme 1 (50 * 256 = 12800)
 	ADDWF		DIGIT_E,F
	MOVLW		02h				; Do registru DIGIT_D přičteme 2 (50 * 256 = 12800)
 	ADDWF		DIGIT_D,F
	MOVLW		08h				; Do registru DIGIT_C přičteme 8 (50 * 256 = 12800)
 	ADDWF		DIGIT_C,F	
 	GOTO		PREVOD_16_DO_DEC ; Cyklus opakujeme, dokud lze odečítat číslo 50 od registru CISLO_C2
PREVOD_16_2						; Převod horních 8bitů
	MOVLW		03h				; Od horních 8bitů odečteme 3
 	SUBWF		CISLO_C2,W		; Výsledek necháme v pracovním registru W
 	BTFSS		STATUS,C		; Otestujeme, zda je vásledek kladný
 	GOTO		PREVOD_16_3		; Pokud ne, pokračujeme v odčítání nižším číslem
	MOVWF		CISLO_C2		; Pokud ano, můžeme výsledek odčítání uložit
 	MOVLW		07h				; Do registru DIGIT_C přičteme 7 (3 * 256 = 768)
 	ADDWF		DIGIT_C,F
	MOVLW		06h				; Do registru DIGIT_B přičteme 6 (3 * 256 = 768)
 	ADDWF		DIGIT_B,F
	MOVLW		08h				; Do registru DIGIT_A přičteme 8 (3 * 256 = 768)
 	ADDWF		DIGIT_A,F	
 	GOTO		PREVOD_16_2 	; Cyklus opakujeme, dokud lze odečítat číslo 50 od registru CISLO_C2
PREVOD_16_3
	MOVLW		02h				; Od horních 8bitů odečteme 2
 	SUBWF		CISLO_C2,W		; Výsledek necháme v pracovním registru W
 	BTFSS		STATUS,C		; Otestujeme, zda je vásledek kladný
 	GOTO		PREVOD_16_4		; Pokud ne, pokračujeme v odčítání nižším číslem
	MOVWF		CISLO_C2		; Pokud ano, můžeme výsledek odčítání uložit
 	MOVLW		05h				; Do registru DIGIT_C přičteme 5 (2 * 256 = 512)
 	ADDWF		DIGIT_C,F
	MOVLW		01h				; Do registru DIGIT_B přičteme 1 (2 * 256 = 512)
 	ADDWF		DIGIT_B,F
	MOVLW		02h				; Do registru DIGIT_A přičteme 2 (2 * 256 = 512)
 	ADDWF		DIGIT_A,F	
 	GOTO		PREVOD_16_3		 ; Cyklus opakujeme, dokud lze odečítat číslo 50 od registru CISLO_C2
PREVOD_16_4
	MOVLW		01h				; Od horních 8bitů odečteme 1
 	SUBWF		CISLO_C2,W		; Výsledek necháme v pracovním registru W
 	BTFSS		STATUS,C		; Otestujeme, zda je vásledek kladný
 	GOTO		PREVOD_16_5		; Pokud ne, pokračujeme v odčítání nižším číslem
	MOVWF		CISLO_C2		; Pokud ano, můžeme výsledek odčítání uložit
 	MOVLW		02h				; Do registru DIGIT_C přičteme 5 (1 * 256 = 256)
 	ADDWF		DIGIT_C,F
	MOVLW		05h				; Do registru DIGIT_B přičteme 1 (1 * 256 = 256)
 	ADDWF		DIGIT_B,F
	MOVLW		06h				; Do registru DIGIT_A přičteme 2 (1 * 256 = 256)
 	ADDWF		DIGIT_A,F	
 	GOTO		PREVOD_16_4		; Cyklus opakujeme, dokud lze odečítat číslo 50 od registru CISLO_C2
PREVOD_16_5
	MOVLW		32h				; Od dolních 8bitů odečteme 50
 	SUBWF		CISLO_C1,W		; Výsledek necháme v pracovním registru W
 	BTFSS		STATUS,C		; Otestujeme, zda je vásledek kladný
 	GOTO		PREVOD_16_6		; Pokud ne, pokračujeme převodem zbytku do DIGIT_A
	MOVWF		CISLO_C1		; Pokud ano, můžeme výsledek odčítání uložit
 	MOVLW		05h				; Do registru DIGIT_B přičteme 5 (50)
 	ADDWF		DIGIT_B,F
	GOTO		PREVOD_16_5 	; Cyklus opakujeme, dokud lze odečítat číslo 50 od registru CISLO_C1
PREVOD_16_6						; Zbytek v registru CISLO_C1 převedeme do DIGIT_A
	MOVFW		CISLO_C1
	ADDWF		DIGIT_A
	GOTO		DEC_5_KOREKCE_DIGITU	; Po dekadické korekci výstup z podprogramu

;------------------------------------------------------------------------------
; Dekadická korekce
;------------------------------------------------------------------------------

DEC_5_KOREKCE_DIGITU			; Dekadická korekce 5 digitu
DEC_5_KOREKCE_A
	MOVLW		0ah				; Odečteme 10 od nejnižšího digitu
	SUBWF		DIGIT_A,W		; Výsledek uložíme do W
	BTFSS		STATUS,C		; Otestujeme, zda nebyl přenos přes nulu (nula = nebyl)
	GOTO		DEC_5_KOREKCE_B	; Pokud ano, tak pokračujeme úpravou dalšího digitu
	MOVWF		DIGIT_A			; Pokud ne, tak výsledek uložíme
	INCF		DIGIT_B			; Přičteme 1 k o řád vyššímu digitu
	GOTO		DEC_5_KOREKCE_A	; Opakujeme, dokud lze odečítat 10
DEC_5_KOREKCE_B
	MOVLW		0ah
	SUBWF		DIGIT_B,W
	BTFSS		STATUS,C
	GOTO		DEC_5_KOREKCE_C
	MOVWF		DIGIT_B
	INCF		DIGIT_C
	GOTO		DEC_5_KOREKCE_B
DEC_5_KOREKCE_C
	MOVLW		0ah
	SUBWF		DIGIT_C,W
	BTFSS		STATUS,C
	GOTO		DEC_5_KOREKCE_D
	MOVWF		DIGIT_C
	INCF		DIGIT_D
	GOTO		DEC_5_KOREKCE_C
DEC_5_KOREKCE_D
	MOVLW		0ah
	SUBWF		DIGIT_D,W
	BTFSS		STATUS,C
	GOTO		DEC_5_KOREKCE_E
	MOVWF		DIGIT_D
	INCF		DIGIT_E
	GOTO		DEC_5_KOREKCE_D
DEC_5_KOREKCE_E
	MOVLW		0ah
	SUBWF		DIGIT_E,W
	BTFSS		STATUS,C
	RETURN						; Výstup z podprogramu dekadické korekce digitů
	CLRF		DIGIT_A			; Pokud je hodnota větší než 99999, tak vynulujeme digity
	CLRF		DIGIT_B
	CLRF		DIGIT_C
	CLRF		DIGIT_D
	CLRF		DIGIT_E
	RETURN						; Výstup z podprogramu dekadické korekce - po přetečení
	
;------------------------------------------------------------------------------
; KONEC
;------------------------------------------------------------------------------
	
	END