Если это продолжение про HT1621, то может как-то так сделать?
Код
// сдвиги для каждой половины знака
#define SHIFT_HALFSIGN0 0
#define SHIFT_HALFSIGN1 4
// сегменты
#define SEG_A(x) ((x<<3)<<SHIFT_HALFSIGN1)
#define SEG_B(x) ((x<<2)<<SHIFT_HALFSIGN1)
#define SEG_C(x) ((x<<1)<<SHIFT_HALFSIGN1)
#define SEG_D(x) ((x<<0)<<SHIFT_HALFSIGN0)
#define SEG_E(x) ((x<<1)<<SHIFT_HALFSIGN0)
#define SEG_F(x) ((x<<2)<<SHIFT_HALFSIGN0)
#define SEG_G(x) ((x<<3)<<SHIFT_HALFSIGN0)
#define SEG_H(x) ((x<<0)<<SHIFT_HALFSIGN1)
// дешифратор:
const uint8_t bcd[] =
{
SEG_A(1)|SEG_B(1)|SEG_C(1)|SEG_D(1)|SEG_E(1)|SEG_F(1)|SEG_G(0), //0
SEG_A(0)|SEG_B(1)|SEG_C(1)|SEG_D(0)|SEG_E(0)|SEG_F(0)|SEG_G(0), //1
SEG_A(1)|SEG_B(1)|SEG_C(0)|SEG_D(1)|SEG_E(1)|SEG_F(0)|SEG_G(1), //2
SEG_A(1)|SEG_B(1)|SEG_C(1)|SEG_D(1)|SEG_E(0)|SEG_F(0)|SEG_G(1), //3
SEG_A(0)|SEG_B(1)|SEG_C(1)|SEG_D(0)|SEG_E(0)|SEG_F(1)|SEG_G(1), //4
SEG_A(1)|SEG_B(0)|SEG_C(1)|SEG_D(1)|SEG_E(0)|SEG_F(1)|SEG_G(1), //5
SEG_A(1)|SEG_B(0)|SEG_C(1)|SEG_D(1)|SEG_E(1)|SEG_F(1)|SEG_G(1), //6
SEG_A(1)|SEG_B(1)|SEG_C(1)|SEG_D(0)|SEG_E(0)|SEG_F(0)|SEG_G(0), //7
SEG_A(1)|SEG_B(1)|SEG_C(1)|SEG_D(1)|SEG_E(1)|SEG_F(1)|SEG_G(1), //8
SEG_A(1)|SEG_B(1)|SEG_C(1)|SEG_D(1)|SEG_E(0)|SEG_F(1)|SEG_G(1), //9
SEG_A(1)|SEG_B(1)|SEG_C(1)|SEG_D(0)|SEG_E(1)|SEG_F(1)|SEG_G(1), //A
SEG_A(0)|SEG_B(0)|SEG_C(1)|SEG_D(1)|SEG_E(1)|SEG_F(1)|SEG_G(1), //B
SEG_A(1)|SEG_B(0)|SEG_C(0)|SEG_D(1)|SEG_E(1)|SEG_F(1)|SEG_G(0), //C
SEG_A(0)|SEG_B(1)|SEG_C(1)|SEG_D(1)|SEG_E(1)|SEG_F(0)|SEG_G(1), //D
SEG_A(1)|SEG_B(0)|SEG_C(0)|SEG_D(1)|SEG_E(1)|SEG_F(1)|SEG_G(1), //E
SEG_A(1)|SEG_B(0)|SEG_C(0)|SEG_D(0)|SEG_E(1)|SEG_F(1)|SEG_G(1), //F
};
void lcd_put(int pos, int sign)
{
uint8_t s=bcd[sign];
uint8_t addr=pos<<1;
write_nibble( addr, 0x0F & (s >> SHIFT_HALFSIGN0));
write_nibble(++addr, 0x0F & (s >> SHIFT_HALFSIGN1));
}
(код не проверял)