PIC Microcontroller Radix Math Method

4 Bit Binary to 1 ASCII HEX digit

Converting a Nybble to ASCII

This is a question that comes up all the time when the contents of a byte are to be displayed/output. Does your code need to be fast, or does your code need to be small?

4 Bit Binary to 1 ASCII HEX digit FAST

The most obvious and fastest way of doing this is:

NybbletoASCII:
; Call with binary nybble in W. Returns ASCII value in W.
; From: http://www.myke.com/basic.htm
  andlw H'0F' ; (optional )
  addwf  PCL, f            ;  Add the Contents of the Nybble to PCL/ 
  dt	 "0123456789ABCDEF"  ;  return the ASCII as a Table Offset

4 Bit Binary to 1 ASCII HEX digit SMALL

Several people have independently reduced the core of nybble-to-ASCII conversion to 4 instructions in size, zero RAM. Can you spot that core inside these 6 instruction subroutines?

NybbletoASCII:
; from Sean H. Breheny [shb7 at CORNELL.EDU]
; Sean H. Breheny KA3YXM [at rocket-roar.com]
    andlw H'0F' ; (optional )
    addlw 0-D'10'               ; test: Is W < 10 ?
    skpnc ; btfsc STATUS,C  ; If 0 <= W <= 9, skip ahead
        addlw 'A'-'0'-D'10' ; If A <= W <= F, add ASCII char 'A', and
                             ; subtract enough to make the next
                             ; line have no effect
    addlw '0'+D'10'            ; Add ASCII character '0' as well as
                             ; replace the original 10 that was subtracted
    return

Another:

NybbletoASCII:
; From: Scott Dattalo
    andlw H'0F' ; (optional )
    addlw    6
    skpndc
      addlw   'A'-('9'+1)
    addlw    '0'-6
    return

example

All of the above routines are interchangeable. Some test code that calls those routines with all possible values of W:


test_nybble_to_ascii:
    ; for( i = 0; i < 256; i++){ nybble_to_ascii(i) };
    movlw h'00' ;
    movwf index
nybble_test_for_loop:
    ; nybble_to_ascii(i);
    movf index,W
    call nybble_to_ascii
    nop ; place to put breakpoint to see if it converted correctly
nybble_test_for_test:
    decfsz index,f
    goto nybble_test_for_loop
    ; ... continue
    return    

Comments:

Questions: