pic16f877a counter circuit

Status
Not open for further replies.

thedarkotaku

Newbie level 1
Joined
Sep 26, 2012
Messages
1
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,299
hey everyone. i'm trying to eventually build a six digit counter for common cathode seven segment leds. I started off with an example that did two just fine. but everytime I try to add any more to it it refuses to work. I copied an example from a post on this site on how to multiplex them. but still no luck. any ideas?


Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
unsigned short mask(unsigned short num);
 unsigned short digit_no,digit1000,digit100, digit10, digit1, digit, i;
 
 void interrupt() {
 if (digit_no==0) {
 PORTA = 0; // Turn off all displays
 PORTB = digit1; // Set mask for displaying ones on PORTD
 PORTA = 1; // Turn on display for ones
 digit_no = 1;
 } else if(digit_no==1){
 PORTA = 0; // Turn off all displays
 PORTB = digit10; // Set mask for displaying tens on PORTD
 PORTA = 2; // Turn on display for tens
 digit_no = 2;
 } else if(digit_no==2){
 PORTA = 0;
 PORTB = digit100;
 PORTA = 3;
 digit_no = 3; // Turn on display for hundreds
 } else if(digit_no==3){
 PORTA = 0;
 PORTB = digit1000;
 PORTA = 4; // Turn on display for thousands
 digit_no = 0;
 }
 
 TMR0 = 0; // Reset counter TMRO
 INTCON = 0x20; // Bit T0IF=0, T0IE=1
 }
 
 void main() {
 OPTION_REG = 0x80; // Set timer TMR0
 TMR0 = 0;
 INTCON = 0xA0; // Disable interrupt PEIE,INTE,RBIE,T0IE
 PORTA = 0; // Turn off all displays
 TRISA = 0; // All port A pins are configured as outputs
 PORTB = 0; // Turn off all display segments
 TRISB = 0; // All port D pins are configured as outputs
 
 do {
 for (i = 0; i<=9999; i++) { // Count from 0 to 9999
 
 digit = i % 10u;
 digit1 = mask(digit); // Prepare mask for displaying ones
 digit = (char)(i / 10u) % 10u;
 digit10 = mask(digit);
 
 digit = (char)(i / 100u) % 10u;
 digit100 = mask(digit);
 
 digit = (char)(i / 1000u) % 10u;
 digit1000 = mask(digit);
 Delay_ms(1000);
 }
 } while (1); // Endless loop
 }
 
 unsigned short mask(unsigned short num) {
 switch (num) {
 case 0 : return 0x3F;
 case 1 : return 0x06;
 case 2 : return 0x5B;
 case 3 : return 0x4F;
 case 4 : return 0x66;
 case 5 : return 0x6D;
 case 6 : return 0x7D;
 case 7 : return 0x07;
 case 8 : return 0x7F;
 case 9 : return 0x6F;
 }
 }

 
Last edited by a moderator:

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…