Выбрать главу

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