Table of Contents

 

7-segment LED display

Necessary knowledge: [HW] User Interface Module, [LIB] 7-segment LED Display,
[LIB] Delay [PRT] Light-emitting Diode

Theory

7-segment

7-segmented LED number-indicator is a display which consists of 7 LEDs positioned in the shape of number 8. By lighting or switching off the corresponding LEDs (segments), it is possible to display numbers from 0 to nine as well as some letters.

Electrically all anodes of the LEDs are connected to one anode pin ca. LEDs are lit by switching their cathodes (a, b, c…). Exists also reversed connections, where the indicators have a common cathode cc. Generally several number-indicators are used for displaying multi digit numbers - for this purpose the indicators are equipped with coma (point) segment dp. All in all one indicator has 8 segments, but they are still called 7-segmented according to the number of number-segments.

Positioning of the LED indicator's segments and electrical scheme
The build-up of the LED driver's shift-index with corresponding segments of the indicator.

LED number-indicators are easy to use, they can be controlled directly from the pins of the microcontroller, but there are also special drivers, which able to control number-indicators using fewer pins of the microcontroller. There are different colors of LED number indicators, which can be very bright and very large. For displaying the entire Latin alphabet exist indicators with extra segments. There are different drivers, but common drivers using a serial interface, which is similar to the SPI, where both clock signal and data signal are used. Different from SPI the chip-select is not used there, and is replaced with latch function. The above mentioned three lines are connected to the controller pins.

Practice

There is one 7-segment LED number-indicator on the Digital i/o module. It is controlled through a driver with serial interface. For displaying the numbers on the HomeLabs Digital i/o module indicator, the following functionality is written to the library of the HomeLab.

// Marking card
// The bits are marking the segments. Lower ranking is A, higher ranking is DP
const unsigned char __attribute__ ((weak)) segment_char_map[11] = 
{
	0b00111111,
	0b00000110,
	0b01011011,
	0b01001111,
	0b01100110,
	0b01101101,
	0b01111100,
	0b00000111,
	0b01111111,
	0b01100111,
	0b01111001   // E like Error
};
 
// Start-up of the 7-segment indicator
void segment_display_init(void)
{
	// Set latch, data out and clock pins as output
	pin_setup_output(segment_display_latch);
	pin_setup_output(segment_display_data_out);
	pin_setup_output(segment_display_clock);
}
 
// Displaying number on the 7-segment indicator
void segment_display_write(unsigned char digit)
{
	unsigned char map;
	signed char i;
 
	// Check-up of the number
	if (digit > 9)
	{
		digit = 10;
	}
 
	// Number as the card of the segments
	map = segment_char_map[digit];
 
	// Latch-signal off
	pin_clear(segment_display_latch);
 
	// Sending he bits. Higher ranking goes first
	for (i = 7; i >= 0; i--)
	{
		// Setting the pin according to the value of the bit of the card
		pin_set_to(segment_display_data_out, bit_is_set(map, i));
 
		// The clock-signal as high for a moment
		pin_set(segment_display_clock);
		_delay_us(1);
 
		// The clock-signal as low
		pin_clear(segment_display_clock);
		_delay_us(1);
	}
 
	// Latch-signal on
	pin_set(segment_display_latch);
}

For displaying numbers and the letter “E”, is created a “weak” constant array segment_char_map, where lighting of all 8 segments is marked with bit 1 and switch off is market with bit 0. The bits form lower to higher (from right to left in binary form) are marking segments A, B, C, D, E, F, G ja DP. The control interface of the driver is realized through software SPI, i.e. by using a software for controlling the data communication pins in the program. All three pins are set as output with segment_display_init function. segment_display_write is for displaying the function, which finds the segment-card of the mark from the array and transmits bit by bit all values of the segments to the driver. The frequency of the clock signal with the software delays is now approximately 500 kHz. When a user defines a variable segment_char_map its own code, it is possible to create other characters on the screen (eg, text, etc.)

The following is a more concrete example of a program for using the number-indicator. Previously described function of the library is described in the program. The program counts numbers from 0 to 9 with approximate interval of 1 second and then displays letter E, because two-digit numbers is not possible to show on the one digit indicator.

// The example program of the 7-segment LED indicator of the HomeLab's
#include <homelab/module/segment_display.h>
#include <homelab/delay.h>
 
// Main program
int main(void)
{
	int counter = 0;
 
	// Set-up of the 7-segment indicator
	segment_display_init();
 
	// Endless loop
	while (true)
	{
		// Displaying the values of the counter
		segment_display_write(counter % 10);
 
		// Counting up to 10
		counter++;
		if (counter>19) counter=0;
 
		// Delay for 1 second
		sw_delay_ms(1000);
	}
}