void hc595_display(uint8_t data[]) { hc595_write_byte(0x01); hc595_write_byte(seg_table_n[data[7]]); hc595_latch(); //HC595_DELAY hc595_write_byte(0x02); hc595_write_byte(seg_table_n[data[6]]); hc595_latch(); //HC595_DELAY hc595_write_byte(0x04); hc595_write_byte(seg_table_n[data[5]]); hc595_latch(); //HC595_DELAY hc595_write_byte(0x08); hc595_write_byte(seg_table_n[data[4]]); hc595_latch(); //HC595_DELAY hc595_write_byte(0x10); hc595_write_byte(seg_table_n[data[3]]); hc595_latch(); //HC595_DELAY hc595_write_byte(0x20); hc595_write_byte(seg_table_n[data[2]]); hc595_latch(); //HC595_DELAY hc595_write_byte(0x40); hc595_write_byte(seg_table_n[data[1]]); hc595_latch(); //HC595_DELAY hc595_write_byte(0x80); hc595_write_byte(seg_table_n[data[0]]); hc595_latch(); //HC595_DELAY }
void main(void) { unsigned char i, data; main_init(); hc595_init(); // Blank output hc595_write_byte(0x00); hc595_write_byte(0xff); hc595_latch(); hc595_oe(); __enable_interrupt(); i = 1; while(1) { if (switch0_state) { hh++; if (hh > 23) hh = 0; switch0_state = 0; time_set = 1; } if (switch1_state) { mm++; if (mm > 59) mm = 0; ss = 0; switch1_state = 0; time_set = 1; } // Continuously scan multiplexed display // Assert the current digit's anode hc595_write_byte(~i); // Select correct data for current digit switch(i) { case 1: data = digits[hh / 10]; break; case 2: data = digits[hh % 10]; // Toggle the middle decimal point as a seconds heartbeat if (ss % 2) data |= 0x80; break; case 4: data = digits[mm / 10]; break; case 8: data = digits[mm % 10]; break; } // flash if time not set if ((!time_set) && (ss%2)) { data = 0; } hc595_write_byte(data); hc595_latch(); // move on to the next digit i <<= 1; if (i>8) i = 1; } }