;Stukje code om een 16-bits getal om te zetten naar BCD (binary coded decimal) ;Je kunt een 16-bits binair getal laden in lbin en hbin, om het vervolgens om te zetten naar BCD. Het resultaatvan het ;omzetten staat in de registers digit1 tot en met digit5. ;Hoelang een conversie duurt is afhankelijk van het getal. Ik schat dat een conversie grofweg maximaal zo'n 700 instructies ;kan duren. En er worden maximaal 2 levels van de hardware stack gebruikt, vanaf het hoofdprogramma. ;*****Variabelen instellen***** ;GPR-registers lbin equ 0x0?? ;LSB (least signifisant bits) van 16-bits te converteren getal hbin equ 0x0?? ;MSB van 16-bits te converteren getal tlbin equ 0x0?? ;Tijdelijk register voor lbin thbin equ 0x0?? ;Tijdelijk register voor hbin digit equ 0x0?? ;Tijdelijk register voor resultaat van conversie digit1 equ 0x0?? ;eenheden na conversie digit2 equ 0x0?? ;tientallen na conversie digit3 equ 0x0?? ;honderdtallen na conversie digit4 equ 0x0?? ;duizendtallen na conversie digit5 equ 0x0?? ;tienduizendtallen na conversie lbyte equ 0x0?? ;LSB van 16-bits te laden getal hbyte equ 0x0?? ;MSB van 16-bits te ladengetal ;********Begin programma******* movlw 0x0?? ;LSB van 16-bits binair getal laden movwf lbin movlw 0x0?? ;MSB van 16-bits binair getal laden movwf hbin call get_bcd ;Conversie code oproepen xxx ;Na conversie gaat hij hier verder, met resultaat in registers digit1 t/m digit5 ;*********Subroutines********** ;--------------------- get_bcd: ;Converteert 16-bits getal naar BCD-getal. movlw 0x010 ;0x2710 = d'10000' movwf lbyte movlw 0x027 movwf hbyte call get_digit movf digit,w movwf digit5 movlw 0x0E8 ;0x03E8 = d'1000' movwf lbyte movlw 0x003 movwf hbyte call get_digit movf digit,w movwf digit4 movlw 0x064 ;0x0064 = d'100' movwf lbyte movlw 0x000 movwf hbyte call get_digit movf digit,w movwf digit3 movlw 0x00A ;0x000A = d'10' movwf lbyte movlw 0x000 movwf hbyte call get_digit movf digit,w movwf digit2 movf lbin,w ;Wat overblijft zijn eenheden. Deze hoeven niet meer uitgerekend te worden en kan zo in digit1 worden geladen. movwf digit1 return get_digit: ;Rekent uit hoevaak ingestelde 16-bit getal, van get_bcd, in het 16-bit nack-getal past en plaatst dit in register "digit". clrf digit movf hbin,w movwf thbin movf lbin,w movwf tlbin movf lbyte,w subwf tlbin,f btfsc status,c ;Kijken of tlbin negatief is. Zo ja, thbin - 1 -> thbin goto $+d'5' movlw 0x001 subwf thbin,f btfss status,c return ;Als thbin negatief is, naar volgende digit gaan. Anders verder kijken welke waarde deze digit heeft. movf hbyte,w subwf thbin,f btfss status,c return incf digit,f movf tlbin,w movwf lbin movf thbin,w movwf hbin goto $-d'17' ;---------------------