#include "display.h" // 7 segment table prog_uint8_t chartab[] = { _0, _1, _2, _3, _4, _5, _6, _7, _8, _9 }; uint8_t display_buff[3*7]; // decimal output -999 ... 999 // dp == 2: "9.99" // dp == 1: "99.9" void valout( int16_t val, uint8_t channel, uint8_t dp ) { uint8_t ones, tens, hundreds; uint8_t *sspt; uint8_t *pt; if( channel >= sizeof(display_buff) / 3 ) return; ones = 0; if( val < 0 ){ val = -val; ones = MINUS3; // minus sign } if( val > 999 ){ hundreds = CHAR_E; // "Err" tens = CHAR_r; ones += CHAR_r; // "-Err" }else{ sspt = chartab - 1; do{ val -= 100; sspt++; }while( val >= 0 ); hundreds = pgm_read_byte( sspt ); sspt = chartab + 10; do{ val += 10; sspt--; }while( val < 0 ); tens = pgm_read_byte( sspt ); if( dp == 1 ) // insert decimal point tens |= _DP; else if( dp == 2 ) hundreds |= _DP; // insert decimal point if( hundreds == _0 ){ // check leading zero hundreds = SPACE; // blank leading zero if( tens == _0 ){ // check leading zero tens = SPACE; // blank leading zero } if( ones == MINUS3 ){ // move minus sign ones = 0; if( tens == SPACE ) tens = MINUS; else hundreds = MINUS; } } ones |= pgm_read_byte( chartab + val ); } pt = display_buff + 3 * channel; *pt++ = ones; *pt++ = tens; *pt++ = hundreds; } static void spi_out( uint8_t val ) { for( uint8_t i = 8; i; i-- ){ SDO = 0; if( val & 0x80 ) SDO = 1; SSCK = 0; val <<= 1; SSCK = 1; } } void display_update() { uint8_t *pt = display_buff; SSCK_DDR = 1; SDO_DDR = 1; LOAD_DDR = 1; OEN = 1; OEN_DDR = 1; LOAD = 0; for( uint8_t i = sizeof(display_buff); i; i-- ) spi_out( ~*pt++ ); // low active LOAD = 1; OEN = 0; }