This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
en:examples:display:segment_display [2015/11/05 10:41] – heikopikner | en:examples:display:segment_display [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ~~PB~~ | + | < |
====== 7-segment LED display ====== | ====== 7-segment LED display ====== | ||
- | //Necessary knowledge: [HW] [[en: | + | //Necessary knowledge: |
+ | [HW] [[en: | ||
+ | [LIB] [[en: | ||
+ | [PRT] [[en: | ||
===== Theory ===== | ===== Theory ===== | ||
Line 15: | Line 18: | ||
[{{ : | [{{ : | ||
- | LED number-indicators are easy to use, they can be controlled directly from the pins of the microcontroller, | + | LED number-indicators are easy to use, they can be controlled directly from the pins of the microcontroller, |
+ | |||
+ | * Latch-signal | ||
+ | * Clock-signal | ||
+ | * Data-signal | ||
===== Practice ===== | ===== Practice ===== | ||
- | There is one 7-segment LED number-indicator on the Digital i/o module. It is controlled through a driver with serial interface | + | There is one 7-segment LED number-indicator on the Digital i/o module. It is controlled through a driver with serial interface. |
- | + | ||
- | + | ||
- | * Latch-signal (//latch//) - PG2 | + | |
- | * Clock-signal (//clock//) - PC7 | + | |
- | * Data-signal (//data//) - PC6 | + | |
- | + | ||
- | ~~CL~~ | + | |
- | + | ||
- | The data is delivered by bits through the data pin. Every time the clock signal goes high, the contents of the shift-index is shifted to the right and the bit from the data-pin is read to the left most cell. By this 8-bits are loaded to the shift-index. If the latch signal is set high, the value of the shift-index is loaded to the latch-index, | + | |
For displaying the numbers on the HomeLabs Digital i/o module indicator, the following functionality is written to the library of the HomeLab. | For displaying the numbers on the HomeLabs Digital i/o module indicator, the following functionality is written to the library of the HomeLab. | ||
<code c> | <code c> | ||
- | // | + | // Marking card |
- | // Set-up of the pins | + | // The bits are marking the segments. Lower ranking is A, higher ranking is DP |
- | // | + | const unsigned char __attribute__ ((weak)) |
- | static pin segment_display_latch = PIN(G, 2); | + | |
- | static pin segment_display_data_out = PIN(C, 6); | + | |
- | static pin segment_display_clock = PIN(C, 7); | + | |
- | + | ||
- | // | + | |
- | // Marking card. | + | |
- | // The bits are marking the segments. Lower ranking is A, higher ranking is DP. | + | |
- | // | + | |
- | static | + | |
{ | { | ||
0b00111111, | 0b00111111, | ||
Line 60: | Line 48: | ||
}; | }; | ||
- | // | + | // Start-up of the 7-segment indicator |
- | // Start-up of the 7-segment indicator. | + | |
- | // | + | |
void segment_display_init(void) | void segment_display_init(void) | ||
{ | { | ||
Line 71: | Line 57: | ||
} | } | ||
- | // | + | // Displaying number on the 7-segment indicator |
- | // Displaying number on the 7-segment indicator. | + | |
- | // | + | |
void segment_display_write(unsigned char digit) | void segment_display_write(unsigned char digit) | ||
{ | { | ||
Line 85: | Line 69: | ||
} | } | ||
- | // Number as the card of the segments. | + | // Number as the card of the segments |
map = segment_char_map[digit]; | map = segment_char_map[digit]; | ||
Line 91: | Line 75: | ||
pin_clear(segment_display_latch); | pin_clear(segment_display_latch); | ||
- | // Sending he bits. Higher ranking goes first. | + | // Sending he bits. Higher ranking goes first |
for (i = 7; i >= 0; i--) | for (i = 7; i >= 0; i--) | ||
{ | { | ||
- | // Setting the pin according to the value of the bit of the card. | + | // Setting the pin according to the value of the bit of the card |
pin_set_to(segment_display_data_out, | pin_set_to(segment_display_data_out, | ||
- | // The clock-signal as high for a moment. | + | // The clock-signal as high for a moment |
pin_set(segment_display_clock); | pin_set(segment_display_clock); | ||
_delay_us(1); | _delay_us(1); | ||
- | // The clock-signal as low. | + | // The clock-signal as low |
pin_clear(segment_display_clock); | pin_clear(segment_display_clock); | ||
_delay_us(1); | _delay_us(1); | ||
} | } | ||
- | // Latch-signal on. | + | // Latch-signal on |
pin_set(segment_display_latch); | pin_set(segment_display_latch); | ||
} | } | ||
</ | </ | ||
- | For displaying numbers and the letter “E”, is created a constant array // | + | For displaying numbers and the letter “E”, is created a " |
- | The following is a more concrete example of a program for using the number-indicator. | + | The following is a more concrete example of a program for using the number-indicator. |
<code c> | <code c> | ||
- | // | ||
// The example program of the 7-segment LED indicator of the HomeLab' | // The example program of the 7-segment LED indicator of the HomeLab' | ||
- | // input-output module. | ||
- | // | ||
#include < | #include < | ||
#include < | #include < | ||
- | // | + | // Main program |
- | // Main program. | + | |
- | // | + | |
int main(void) | int main(void) | ||
{ | { | ||
int counter = 0; | int counter = 0; | ||
- | // Set-up of the 7-segment indicator. | + | // Set-up of the 7-segment indicator |
segment_display_init(); | segment_display_init(); | ||
- | // Endless loop. | + | // Endless loop |
while (true) | while (true) | ||
{ | { | ||
- | // Displaying the values of the counter. | + | // Displaying the values of the counter |
- | segment_display_write(counter); | + | segment_display_write(counter |
// Counting up to 10 | // Counting up to 10 | ||
counter++; | counter++; | ||
- | if (counter> | + | if (counter> |
- | // Delay for 1 second. | + | // Delay for 1 second |
sw_delay_ms(1000); | sw_delay_ms(1000); | ||
} | } | ||
} | } | ||
</ | </ |