Если вы совместимы с PIC16 RISC ассемблером, то это очень просто, быстро, коротко и эффективно. Здесь у вас есть 16-битное беззнаковое 16-битное деление на 10 рутин, чтобы увидеть, как это сделать.
Чтобы получить первый младший символ числа в WREG, поместите 16-битное число без знака в Reg1 и Reg2 и вызовите рутину. Чтобы получить следующий символ, снова вызовите рутин и так далее, пока Reg1 и Reg2 не станут равны 0.
RegAE res 1
RegA0 res 1
RegA1 res 1
RegA2 res 1
divR16by_c10
;{
;//Input: 16 bit unsigned number as RegA1,2 (RegA2 low byte, RegA1 High byte)
;//Division result: Reg1 and Reg2 and reminder as char in WREG
clrf RegA0
movlw 16 ;//init loop counter
movwf RegAE
lslf RegA2, f
divI16by_c10_
rlf RegA1, f
rlf RegA0, f
movlw 10
subwf RegA0, f
btfsc Carry
bra divI16by_c10_OK
addwfc RegA0, f
bcf Carry
divI16by_c10_OK
rlf RegA2, f
decfsz RegAE, f
bra divI16by_c10_
;//result= W from 0..9
addlw 0x30 ;//convert to char
return
;}
EDIT:
Если вы хотите преобразовать значение со знаком 16 бит, то сначала проверьте 15-й бит, чтобы определить номер знака. Если отрицательный, чем написать - подпишите и отрицайте число в RegA1,2. После этого процедура та же для положительного числа.
Для отрицания числа вы можете использовать следующую asm rutine:
comf RegA2, f
comf RegA1, f
movlw 0
bsf STATUS, 0 ;//set carry flag
addwfc RegA2, f
addwfc RegA1, f