#include typedef unsigned char uint8_t; // Max 2/10: 0x99. Max signed 2/10: 0x79. uint8_t ib2d( uint8_t x ) { uint8_t mask = 0; if( (char)x < 0 ) { x *= -1; mask = 0x80; } return ((x/10)<<4)|(x%10)|mask; } uint8_t id2b( uint8_t x ) { // Convert 2/10 signed num to bin considering sign. return (((x>>4)&0x07)*10+(x&0x0f))*( x&0x80 ? -1 : 1); } // Input: P0. // Output: P1. main( ) { uint8_t num = id2b(P0); printf("%x %x\n", num, (uint8_t)-19); P1 = ib2d(num); // For testing. P2 = num; while(1); }