In this project LEDs are connected to PORTC of a PIC18F452 microcontroller
and the microcontroller is operated from a 4MHz resonator. The LEDs are
organized as the faces of a real dice. When a push-button switch connected to
RB0 is pressed a dice pattern is displayed on the LEDs. The display remains in
this state for 3 seconds and after this period the LEDs all turn OFF to
indicate that the system is ready for the button to be pressed again.
In this program a pseudorandom number generator function is
used to generate the dice numbers between 1 and 6.
Author: Dogan Ibrahim
Date: July 2007
File: LED6.C
******************************************************************************************/
#define Switch PORTB.F0
#define Pressed 0
//
// Start of MAIN program
//
void main() {
unsigned char Pattern, J = 1;
unsigned char DICE[] = {0,0x88,0x18,0x98,0x68,0xE8,0x78,
0x81,0x11,0x91,0x61,0xE1,0x71,
0x89,0x19,0x99,0x69,0xE9,0x79,
0x86,0x16,0x96,0x66,0xE6,0x76,
0x8E,0x1E,0x9E,0x6E,0xEE,0x7E,
0x87,0x17,0x97,0x67,0xE7,0x77};
TRISC = 0; // PORTC are outputs
TRISB = 1; // RB0 input
PORTC = 0; // Turn OFF all LEDs
for(;;) // Endless loop
{
if (Switch == Pressed) // Is switch pressed ?
{
Pattern = DICE[J]; // Number to send to PORTC
PORTC = Pattern; // send to PORTC
Delay_ms(3000); // 3 seconds delay
PORTC = 0; // Clear PORTC
}
J++; // Increment J
if (J == 37) J = 1; // If J = 37, reset to 1
}
}
Figure 6.19: Modified program
PROJECT 6.5 — 7-Segment LED Counter
Project Description
This project describes the design of a 7-segment LED-based counter which counts from 0 to 9 continuously with a one-second delay between counts. The project shows how a 7-segment LED can be interfaced and used in a PIC microcontroller project.
7-segment displays are used frequently in electronic circuits to show numeric or alphanumeric values. As shown in Figure 6.20, a 7-segment display consists basically of 7 LEDs connected such that the numbers from 0 to 9 and some letters can be displayed. Segments are identified by the letters from a to g, and Figure 6.21 shows the segment names of a typical 7-segment display.
Figure 6.20: Some 7-segment displays
Figure 6.21: Segment names of a 7-segment display
Figure 6.22 shows how the numbers from 0 to 9 are obtained by turning ON different segments of the display.
Figure 6.22: Displaying numbers 0 to 9
7-segment displays are available in two different configurations: common cathode and common anode. As shown in Figure 6.23, in common cathode configuration, all the cathodes of all segment LEDs are connected together to the ground. The segments are turned ON by applying a logic 1 to the required segment LED via current limiting resistors. In common cathode configuration the 7-segment LED is connected to the microcontroller in current sourcing mode.
Figure 6.23: Common cathode configuration
In common anode configuration, the anode terminals of all the LEDs are connected together as shown in Figure 6.24. This common point is then normally connected to the supply voltage. A segment is turned ON by connecting its cathode terminal to logic 0 via a current limiting resistor. In common anode configuration the 7-segment LED is connected to the microcontroller in current sinking mode.
Figure 6.24: Common anode configuration
In this project, a Kingbright SA52-11 red common anode 7-segment display is used. This is a 13mm (0.52 inch) display with ten pins that includes a segment LED for the decimal point. Table 6.7 shows the pin configuration of this display.
Table 6.7: SA52-11 pin configuration
| Pin | number Segment |
|---|---|
| 1 | e |
| 2 | d |
| 3 | common anode |
| 4 | c |
| 5 | decimal point |
| 6 | b |
| 7 | a |
| 8 | common anode |
| 9 | f |
| 10 | g |
Project Hardware
The circuit diagram of the project is shown in Figure 6.25. A PIC18F452 type microcontroller is used with a 4MHz resonator. Segments a to g of the display are connected to PORTC of the microcontroller through 290-ohm current limiting resistors. Before driving the display, we have to know the relationship between the numbers to be displayed and the corresponding segments to be turned ON, and this is shown in Table 6.8. For example, to display number 3 we have to send the hexadecimal number 0x4F to PORTC, which turns ON segments a,b,c,d, and g. Similarly, to display number 9 we have to send the hexadecimal number 0x6F to PORTC which turns ON segments a,b,c,d,f, and g.
Figure 6.25: Circuit diagram of the project
Table 6.8: Displayed number and data sent to PORTC
| Number | x | g | f | e | d | c | b | a | PORTC Data |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0x3F |
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0x06 |
| 2 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0x5B |
| 3 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0x4F |
| 4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0x66 |
| 5 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 0x6D |
| 6 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0x7D |
| 7 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0x07 |
| 8 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0x7F |
| 9 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0x6F |