|
|
View previous topic :: View next topic |
Author |
Message |
matsuo
Joined: 17 Feb 2012 Posts: 11
|
PIC16F628A+74HC595+ULN2003A 7 segment |
Posted: Mon Apr 09, 2012 3:54 am |
|
|
Hello sir.
I need to counter with 3 digit of 7 segment (12V, Anode) . I used 74HC595 + ULN2003 but i don't know how to fix ten, hundreds position
my circuit as below
sbo sbobet
This is my code
Code: | #include <16F628a.h>
#fuses HS,NOLVP,NOWDT,NOPROTECT,PUT
#use delay (clock = 4000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP
#TYPE long=32
#include <74595.c>
void main()
{
BYTE data[10] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0X7D,0x07,0x7F,0x6F};
int i;
set_tris_b(0x00);
while(true)
{
for(i=0; i<10; i++)
{
write_expanded_outputs (&data[i]);
delay_ms(50);
}
}
}
|
Help me, please
Last edited by matsuo on Mon Apr 09, 2012 7:45 am; edited 3 times in total |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Mon Apr 09, 2012 5:26 am |
|
|
First help. Do NOT POST CCS code ! It's in the rules and you'll get a polite warning, first time. If you continue to post CCS code, you'll be banned from posting....it's in the rules...
Second, try using the 'search' option on this forum. You're not the first one wanting to do this project,so answers will be here.
Third, try Googling '74595 PIC C code' or similar...again, you're not the first to do it!
fourth, ...
Code: |
#fuses HS,NOLVP,NOWDT,NOPROTECT
#use delay (clock = 4000000) // Crytal = 20MHz
//#use fast_io(b)
// --------- untested code ---------
//#define LOAD pin_b0 // 16F628 pin 6
//#define CLOCK pin_b1 // 16F628 pin 7
//#define DATA pin_b2 // 16F628 pin 8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
...
|
delete the
Code: |
#fuses HS,NOLVP,NOWDT,NOPROTECT
#use delay (clock = 4000000) // Crytal = 20MHz
//#use fast_io(b)
|
lines of code !
Probably 'leftover' from another attempt, but confusing to us and perhaps the compiler !!
5th. Have you got 0,1,2,....9 working correctly ? It's always good to start small, expand on your working code.Far easier to debug small sectins of code!!
6th. always add 'PUT' to the #FUSES options.The small delay in PowerUpTimer will ensure the PIC gets 'organized' properly on every power up. |
|
|
matsuo
Joined: 17 Feb 2012 Posts: 11
|
|
Posted: Mon Apr 09, 2012 7:31 am |
|
|
Thanks for your advice |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Apr 09, 2012 11:09 am |
|
|
Look at this CCS example file:
Quote: |
c:\program files\picc\examples\ex_zmd.c
|
It writes a number to three 7-segment displays. It uses the 74595.c
driver. So it's similar to your project.
Look at this routine in the ex_zmd.c file:
Code: |
void lcd_putd(int16 num)
|
It displays 'num' as 3 digits on the 7-segment displays. (It really should
be called "led_putd", because the displays use leds). But look at the
first part of the routine. They use division and modulus operators to
break up the number into 3 separate digits, which they put into an array.
Then in later code, they check if the digit is a leading 0, and if so, they will
display a blank, instead of a 0. When they finally have the array setup
with the correct data (blank or the 7-segment digit code), then they call
the write_expanded_outputs() routine.
I think this is the information that you want. Hopefully it will solve your
problem. |
|
|
matsuo
Joined: 17 Feb 2012 Posts: 11
|
|
Posted: Tue Apr 10, 2012 1:47 am |
|
|
Actually. I need to make counter board as my picture
My condition
Target display (top) (setting)
Actual display (mid) (input)
Different display (bottom) (Target-Actual)
exp. target display = 100
Actual display = 10
Different display= -90
but don't know to write code follow my condition
somebody can help me or not?
Thanks
My diagram
My code
Code: | #include <16F628a.h>
#fuses HS,NOLVP,NOWDT,NOPROTECT,PUT
#use delay (clock = 12000000)
#define Latch2 pin_b5
#define Shift2 pin_b6
#define DATA2 pin_b7
#define Latch pin_b4
#define Shift pin_b1
#define DATA pin_b2
#define Latch3 pin_a0
#define Shift3 pin_a1
#define DATA3 pin_a3
int1 i=0;
//------------ Interrup fuction------------//
#INT_EXT
void Isr_ext(void)
{
i =~ i; // change from 0 to 1
}
///--------------------------------------------//
void display_digit(unsigned int16 ds1)
{
unsigned int16 digit[4],i,loop_digit,dis;
/*****************************************************
* Constants
******************************************************/
char num_led[17] = {0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x7C,0x39,0x5E,0x79,
0x50,0x80};
digit[0] = num_led[ds1%10];
digit[1] = num_led[(ds1/10)%10];
digit[2] = num_led[(ds1/100)%10];
digit[3] = num_led[(ds1/1000)%10];
output_low(Shift);
output_high(Latch);
for(loop_digit=0;loop_digit<4;loop_digit++)
{
dis = digit[loop_digit];
for(i=0;i<8;i++)
{
if((dis&0x80)==0)
output_low(Data);
else
output_high(Data);
dis=dis<<1;
output_high(Shift);
output_low(Shift);
}
} // loop digit
output_low(Latch);
output_high(Latch);
}
///--------------------------------------------//
void display2_digit(unsigned int16 ds1)
{
unsigned int16 digit[4],i,loop_digit,dis;
/*****************************************************
* Constants
******************************************************/
char num_led[17] = {0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x7C,0x39,0x5E,0x79,
0x50,0x80};
digit[0] = num_led[ds1%10];
digit[1] = num_led[(ds1/10)%10];
digit[2] = num_led[(ds1/100)%10];
digit[3] = num_led[(ds1/1000)%10];
output_low(Shift2);
output_high(Latch2);
for(loop_digit=0;loop_digit<4;loop_digit++)
{
dis = digit[loop_digit];
for(i=0;i<8;i++)
{
if((dis&0x80)==0)
output_low(Data2);
else
output_high(Data2);
dis=dis<<1;
output_high(Shift2);
output_low(Shift2);
}
} // loop digit
output_low(Latch2);
output_high(Latch2);
}
///--------------------------------------------//
void display3_digit(unsigned int16 ds2)
{
unsigned int16 digit2[4],i2,loop_digit2,dis2;
/*****************************************************
* Constants
******************************************************/
char num_led2[17] = {0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x7C,0x39,0x5E,0x79,
0x50,0x80};
digit2[0] = num_led2[ds2%10];
digit2[1] = num_led2[(ds2/10)%10];
digit2[2] = num_led2[(ds2/100)%10];
digit2[3] = num_led2[(ds2/1000)%10];
output_low(Shift3);
output_high(Latch3);
for(loop_digit2=0;loop_digit2<4;loop_digit2++)
{
dis2 = digit2[loop_digit2];
for(i2=0;i2<8;i2++)
{
if((dis2&0x80)==0)
output_low(Data3);
else
output_high(Data3);
dis2=dis2<<1;
output_high(Shift3);
output_low(Shift3);
}
} // loop digit
output_low(Latch3);
output_high(Latch3);
}
void main()
{
enable_interrupts(GLOBAL); // Open Enable interrupt all
enable_interrupts(INT_EXT); // Open external interrupt
ext_int_edge(H_TO_L); //check Falling Edge
int16 counter = 0;
int16 counter2 = 100;
int16 counter3;
while ( TRUE )
{
if(i==1)
{
counter++;
}
display_digit( counter2);
display2_digit( counter );
counter3=(counter2-counter);
display3_digit( counter3);
}
} |
|
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Tue Apr 10, 2012 2:58 am |
|
|
You've been directed towards loads of helpful code.
PCM programmer has kindly outlined the steps you need to take.
Several things strike me.
(1) You're not showing current limiting resistors for your LEDs.
(2) Your diagram has groups of three displays, Your code has four.
(3) You writing out roughly the same code for each of the three groups.
I suggested in a previous thread of yours that you read the CCS forum guidelines.
Tell us what you can do, and what you can't.
Mike |
|
|
|
|
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
|