Robert White shares this code:
ASCII 3 digit decimal to 8 bit binary. CONV_ASCII_HEX MOVLW 0X30 SUBWF DIGIT2, F SUBWF DIGIT3, F DIGI1 SUBWF DIGIT1, F BTFSC STATUS, Z GOTO X0 MOVF DIGIT1, W SUBLW 0X02 BTFSC STATUS, Z GOTO X200 MOVF DIGIT1, W SUBLW 0X01 BTFSC STATUS, Z GOTO X100 GOTO X0 X0 CLRF OUT GOTO DIGI2 X100 MOVLW 0X64 MOVWF OUT GOTO DIGI2 X200 MOVLW 0XC8 MOVWF OUT DIGI2 MOVLW 0X09 MOVWF COUNTN MOVF DIGIT2, W LOOPN ADDWF DIGIT2, F DECFSZ COUNTN, F GOTO LOOPN MOVF DIGIT2, W ADDWF OUT, F DIGI3 MOVF DIGIT3, W ADDWF OUT, F RETURN
the three starting digits are in <DIGIT1;DIGIT2;DIGIT3>, and the binary is in OUT. good for use in RS232 terminal applications, which is what I designed it for. Also good for keypad etc.
Comments:
; 2 digit ASCII decimal to 8 bit Binary ; This how I'd have done it as it saves having any loops - 18 clks ; ASCII DIGIT1=(hundreds), DIGIT2=(tens), DIGIT3=(units). The hex value is in OUT. ; The routine does not affect any of the ASCII DIGIT values, or need addition registers. ; CAUTION: The routine does not test that the ASCII values are valid ! ; I have just written this code to show the idea, it hasn't been tested in anyway. CONV_ASCII_HEX movlw 0X0F ; Bit pattern to strip off ASCII offset andwf DIGIT3, W ; convert ASCII value to a number (units) movwf OUT, F ; start the running total (units) rlf DIGIT2, W ; read 2*DIGIT2 doing (tens) andlw 0x1E ; clear ASCII offset + odd bits addwf OUT, F ; add to running total total 2T + U addwf OUT, F ; add to running total total 4T + U addwf OUT, F ; add to running total total 6T + U addwf OUT, F ; add to running total total 8T + U addwf OUT, F ; add to running total total 10T + U movlw '1' ; (Hundred) digit can only usefully be 1 or 2 subwf DIGIT1, W ; test value of DIGIT1 (sets flags) movlw 0x00 ; clear value to add to total btfsc STATUS, C ; test if result negative ie DIGIT1 was <='0' movlw 200 ; DIGIT1 was >'0', total needs inc by 100 or 200 btfsc STATUS, Z ; test if result = '1' movlw 100 ; DIGIT1 was = '1' inc total by 100 addwf OUT, F ; add 0, 100 or 200 to total as req
Questions: