Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

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

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top