|
|
View previous topic :: View next topic |
Author |
Message |
jov_damo86
Joined: 29 Nov 2007 Posts: 9 Location: Sarrat, Ilocos Norte,Philippines
|
counting on a 7 segment display (please help!) |
Posted: Thu Nov 29, 2007 3:45 am |
|
|
please any code for PIC16f877A to display a simple counting 0-9 and then reset on portB using 7 segment display.
i really appreciate any help for this project!
thank you! |
|
|
Eugeneo
Joined: 30 Aug 2005 Posts: 155 Location: Calgary, AB
|
|
|
jov_damo86
Joined: 29 Nov 2007 Posts: 9 Location: Sarrat, Ilocos Norte,Philippines
|
|
Posted: Thu Nov 29, 2007 4:39 am |
|
|
Thanks a lot but i need for C language using CCS C compiler!
your contribution help me a lot!
God Bless! |
|
|
Eugeneo
Joined: 30 Aug 2005 Posts: 155 Location: Calgary, AB
|
|
Posted: Thu Nov 29, 2007 4:47 am |
|
|
Feel free to use this code.
It uses 6x7 segment LED display
SPI input
Code: |
#include <16F818.H>
#use delay(clock=8000000)
//////// Fuses: LP,XT,HS,EC_IO,INTRC_IO,INTRC,RC_IO,RC,WDT,NOWDT,PUT,NOPUT
//////// Fuses: MCLR,NOMCLR,BROWNOUT,NOBROWNOUT,LVP,NOLVP,CPD,NOCPD,WRT
//////// Fuses: NOWRT,DEBUG,NODEBUG,CCPB2,CCPB3,PROTECT,NOPROTECT
#fuses INTRC_IO,NOPROTECT,NOWDT,PUT,NOLVP,NOMCLR,NOWRT,NODEBUG,BROWNOUT,CCPB3
#byte OSCCON = 0x8F
#bit CCP1IF = 0x0C.2
// Clock mode=1 for Address B
#define Display_type 0 // Normal mode=0 for address A
#if Display_type==0
#define SLAVE_ADDRESS 'A'
#endif
#if Display_type==1
#define SLAVE_ADDRESS 'B'
#endif
#define SEGMENT_MODE 2 // 1=NPN OR 2=PNP
struct HighLow
{
char l;
char h;
};
union hl
{
long L;
struct HighLow hl;
};
// 0-A
// ********
// 5-F* *1-B
// * 6-G *
// ********
// 4-E* *2-C
// * 3-D *
// ********
//
//0123456789_- //
byte CONST LED_MAP[13] =
{0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010
,0b10000010,0b11111000,0b10000000,0b10010000,0b11110111,0b10111111,0b11111111};
#define SEG_A PIN_A0
#define SEG_B PIN_A1
#define SEG_C PIN_A2
#define SEG_D PIN_A3
#define SEG_E PIN_A4
#define SEG_F PIN_A6
#define SEG_G PIN_A7
//#define DIG_1 PIN_B6
//#define DIG_2 PIN_B7
//#define DIG_3 PIN_B0
//#define DIG_4 PIN_B5
//#define DIG_5 PIN_B3
//#define DIG_6 PIN_B5
#define DIG_1 PIN_B5
#define DIG_2 PIN_B3
#define DIG_3 PIN_B6
#define DIG_4 PIN_B0
#define DIG_5 PIN_B7
//#define DIG_6 PIN_B5
#if SEGMENT_MODE==1 //NPN
#define SEG_A_ON output_low(SEG_A)
#define SEG_B_ON output_low(SEG_B)
#define SEG_C_ON output_low(SEG_C)
#define SEG_D_ON output_low(SEG_D)
#define SEG_E_ON output_low(SEG_E)
#define SEG_F_ON output_low(SEG_F)
#define SEG_G_ON output_low(SEG_G)
#define SEG_A_OFF output_high(SEG_A)
#define SEG_B_OFF output_high(SEG_B)
#define SEG_C_OFF output_high(SEG_C)
#define SEG_D_OFF output_high(SEG_D)
#define SEG_E_OFF output_high(SEG_E)
#define SEG_F_OFF output_high(SEG_F)
#define SEG_G_OFF output_high(SEG_G)
#define DIG_1_ON output_high(DIG_1);
#define DIG_2_ON output_high(DIG_2);
#define DIG_3_ON output_high(DIG_3);
#define DIG_4_ON output_high(DIG_4);
#define DIG_5_ON output_high(DIG_5);
#define DIG_6_ON output_high(DIG_6);
#define DIG_1_OFF output_low(DIG_1);
#define DIG_2_OFF output_low(DIG_2);
#define DIG_3_OFF output_low(DIG_3);
#define DIG_4_OFF output_low(DIG_4);
#define DIG_5_OFF output_low(DIG_5);
#define DIG_6_OFF output_low(DIG_6);
#endif
#if SEGMENT_MODE==2 // PNP
#define SEG_A_ON output_high(SEG_A)
#define SEG_B_ON output_high(SEG_B)
#define SEG_C_ON output_high(SEG_C)
#define SEG_D_ON output_high(SEG_D)
#define SEG_E_ON output_high(SEG_E)
#define SEG_F_ON output_high(SEG_F)
#define SEG_G_ON output_high(SEG_G)
#define SEG_A_OFF output_low(SEG_A)
#define SEG_B_OFF output_low(SEG_B)
#define SEG_C_OFF output_low(SEG_C)
#define SEG_D_OFF output_low(SEG_D)
#define SEG_E_OFF output_low(SEG_E)
#define SEG_F_OFF output_low(SEG_F)
#define SEG_G_OFF output_low(SEG_G)
#define DIG_1_ON output_low(DIG_1);
#define DIG_2_ON output_low(DIG_2);
#define DIG_3_ON output_low(DIG_3);
#define DIG_4_ON output_low(DIG_4);
#define DIG_5_ON output_low(DIG_5);
#define DIG_6_ON output_low(DIG_6);
#define DIG_1_OFF output_high(DIG_1);
#define DIG_2_OFF output_high(DIG_2);
#define DIG_3_OFF output_high(DIG_3);
#define DIG_4_OFF output_high(DIG_4);
#define DIG_5_OFF output_high(DIG_5);
#define DIG_6_OFF output_high(DIG_6);
#endif
byte string_data[7];
byte display_data[7];
byte display_data1[7];
byte display_output=0;
int display_index=0;
int rx_index=0;
int display_char;
int display_seg;
int rx_in;
int check_sum;
int temp=0;
short refresh_bit=0;
union HL display_bits;
#INT_SSP
void ssp_interupt ()
{
rx_in=spi_read();
if(rx_index==0)
if (rx_in==SLAVE_ADDRESS)
{
rx_index=1;
return;
}
if(rx_index==1)
{
display_bits.hl.h=rx_in;
rx_index=2;
return;
}
if(rx_index==2)
{
display_bits.hl.l=rx_in;
rx_index=3;
return;
}
if(rx_index==3)
{
check_sum=rx_in;
rx_index=4;
return;
}
rx_index=0;
setup_spi(SPI_SLAVE | SPI_H_TO_L | SPI_CLK_DIV_16 | SPI_SS_DISABLED);
enable_interrupts(INT_SSP);
}
#int_ccp1 // **************** ccp1 second timer interrupt *******************//
void refresh_display ()
{
refresh_bit=0;
display_index+=1;
if (display_index>4)
display_index=0;
DIG_1_OFF;
DIG_2_OFF;
DIG_3_OFF;
DIG_4_OFF;
DIG_5_OFF;
display_output=display_data[display_index];
display_seg=display_data1[display_index];
if (bit_test(display_output,0))
SEG_A_ON;
else
SEG_A_OFF;
if (bit_test(display_output,1))
SEG_B_ON;
else
SEG_B_OFF;
if (bit_test(display_output,2))
SEG_C_ON;
else
SEG_C_OFF;
if (bit_test(display_output,3))
SEG_D_ON;
else
SEG_D_OFF;
if (bit_test(display_output,4))
SEG_E_ON;
else
SEG_E_OFF;
if (bit_test(display_output,5))
SEG_F_ON;
else
SEG_F_OFF;
if (bit_test(display_output,6))
SEG_G_ON;
else
SEG_G_OFF;
if(display_index==0)
DIG_1_ON;
if(display_index==1)
DIG_2_ON;
if(display_index==2)
DIG_3_ON;
if(display_index==3)
DIG_4_ON;
if(display_index==4)
DIG_5_ON;
if(display_seg==0) //dig0, 6
CCP_1=500;
if(display_seg==1) //dig1, 2
CCP_1=150;
if(display_seg==2) //dig2, 5
CCP_1=400;
if(display_seg==3) //dig3, 5
CCP_1=400;
if(display_seg==4) //dig4, 4
CCP_1=350;
if(display_seg==5) //dig5, 5
CCP_1=400;
if(display_seg==6) //dig6, 6
CCP_1=450;
if(display_seg==7) //dig7, 3
CCP_1=200;
if(display_seg==8) //dig8, 7
CCP_1=500;
if(display_seg==9) //dig9, 6
CCP_1=450;
if(display_seg==11) //dig9, 6
CCP_1=200;
set_timer1(0);
ccp1if=0;
}
void main(void)
{
OSCCON=OSC_8MHZ;
setup_wdt(WDT_144MS);
display_data[0]=LED_MAP[11];
display_data[1]=LED_MAP[11];
display_data[2]=LED_MAP[11];
display_data[3]=LED_MAP[11];
display_data[4]=LED_MAP[11];
display_data1[0]=11;
display_data1[1]=11;
display_data1[2]=11;
display_data1[3]=11;
display_data1[4]=11;
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); // timer 1 interval
setup_ccp1(CCP_COMPARE_INT); // Configure CCP1 to set
enable_interrupts(INT_CCP1); // No secondary serial interrupts
set_timer1(0);
CCP_1=5000;
setup_spi(SPI_SLAVE | SPI_H_TO_L | SPI_CLK_DIV_16 | SPI_SS_DISABLED);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL); // No secondary serial interrupts
do
{
restart_wdt();
//if (refresh_bit)
// refresh_display();
if (rx_index==4)
{
if(check_sum==display_bits.hl.l+display_bits.hl.h+128)
#if Display_Type==1
sprintf(string_data,"%05lu",display_bits.L);
#else
sprintf(string_data,"%5lu",display_bits.L);
#endif
temp=0;
rx_index=0;
do
{
display_char=string_data[temp];
if (display_char>47 && display_char<58)
display_char=display_char-48;
if (display_char>10) // not within character specs
display_char=12; // space
#if Display_type==1
if (temp==2) // for a time chip remove this line
display_char=11;
#endif
display_data[temp]=LED_MAP[display_char];
display_data1[temp]=display_char;
temp+=1;
}while (temp<=6);
}
} while (TRUE);
}
|
|
|
|
jov_damo86
Joined: 29 Nov 2007 Posts: 9 Location: Sarrat, Ilocos Norte,Philippines
|
|
Posted: Thu Nov 29, 2007 5:10 am |
|
|
oh yes! thanks you very much!
i'll try to examine it! |
|
|
meereck
Joined: 09 Nov 2006 Posts: 173
|
|
Posted: Thu Nov 29, 2007 2:21 pm |
|
|
I have a 7seg display with a common cathode, which is connected to the PORTB (bits 0-6) of a PIC.
this is the array of 0-9 values where index is the number I want to show.
Code: | const int8 bcd27seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};//BCD to 7seg
void WriteDigit(char c) //c is a value of 0 to 9
{
if(c<10)
{// number
output_b(bcd27seg[c]);
}
}
|
good luck |
|
|
jov_damo86
Joined: 29 Nov 2007 Posts: 9 Location: Sarrat, Ilocos Norte,Philippines
|
|
Posted: Fri Nov 30, 2007 9:16 pm |
|
|
oh! how nice... thanks meereck for that code.. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|