Beispiel #1
0
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;
 	}
}
Beispiel #2
0
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
}