D
delifadzli
Guest
hei alle,
først og fremst, jeg er ganske ny i C-språk ..
Her er eksempel kildekoden .... av 7 segment display via AVR ...
# Include <avr/io.h>
# Include <avr/interrupt.h>
# Include <util/delay_basic.h># Define SEVEN_SEGMENT_PORT PORTD
# Define SEVEN_SEGMENT_DDR DDRD
uint8_t sifrene [3]; / / Holder tallene for 3 skjermervoid SevenSegment (uint8_t n, uint8_t DP)
(
/ *
Denne funksjonen skriver et tall gitt av n til skjermen
desimaltegnet vises dersom dp = 1
Merk:
n må være mindre enn 9
* /
if (n <10)
(
bryteren
(
tilfelle 0:
SEVEN_SEGMENT_PORT = 0b00000011;
pause;
Eksempel 1:
SEVEN_SEGMENT_PORT = 0b10011111;
pause;
tilfelle 2:
SEVEN_SEGMENT_PORT = 0b00100101;
pause;
sak 3:
SEVEN_SEGMENT_PORT = 0b00001101;
pause;
sak 4:
SEVEN_SEGMENT_PORT = 0b10011001;
pause;
sak 5:
SEVEN_SEGMENT_PORT = 0b01001001;
pause;
sak 6:
SEVEN_SEGMENT_PORT = 0b01000001;
pause;
sak 7:
SEVEN_SEGMENT_PORT = 0b00011111;
pause;
sak 8:
SEVEN_SEGMENT_PORT = 0b00000001;
pause;
sak 9:
SEVEN_SEGMENT_PORT = 0b00001001;
pause;
)
if (DP)
(
/ / Hvis desimaltegn skal vises
/ / Gjør 0th bit Lav
SEVEN_SEGMENT_PORT & = 0b11111110;
)
)
annet
(
/ / Dette symbolet på displayet forteller at n var større enn 9
/ / Så displayet ikke kan håndtere det
SEVEN_SEGMENT_PORT = 0b11111101;
)
)
void Vent ()
(
uint8_t jeg;
for (i = 0; i <10; i )
(
_delay_loop_2 (0);
)
)
void utskrift (uint16_t NUM)
(
uint8_t i = 0;
uint8_t j;
if (num> 999) tilbake;mens (NUM)
(
sifrene = num% 10;
i ;
num = num/10;
)
for (j = i; j <3; j ) tall [j] = 0;
)
void InitADC ()
(
ADMUX = (1 <<REFS0); / / For Aref = AVcc;
ADCSRA = (1 <<ADEN) | (7 <<ADPS0);
)
uint16_t ReadADC (uint8_t ch)
(
/ / Velg ADC kanal lm må være 0-7
lm = ch &0b00000111;
ADMUX | = ch;
/ / Start Enkel konvertering
ADCSRA | = (1 <<ADSC);
/ / Vent til konvertering til fullstendig
samtidig (! (ADCSRA & (1 <<ADIF)));
/ / Clear ADIF ved å skrive ett til det
ADCSRA | = (1 <<ADIF);
avkastning (ADC);
)
void main ()
(
uint16_t adc_value;
uint8_t t;
/ / Prescaler = FCPU/1024
TCCR0 | = (1 <<CS02);
/ / Aktiver Overløp Interrupt Enable
TIMSK | = (1 <<TOIE0);
/ / Initialiser Counter
TCNT0 = 0;
/ / Port C [2,1,0] så ut putte
DDRB | = 0b00000111;
PORTB = 0b00000110;
/ / Port D
SEVEN_SEGMENT_DDR = 0XFF;
/ / Slå av alle segmenter
SEVEN_SEGMENT_PORT = 0XFF;
/ / Aktiver Global Avbryter
sei ();
/ / Aktiver ADC
InitADC ();
/ / Uendelig loop
mens 1 ()
(
/ / Les ADC
adc_value = ReadADC (0);
/ / Konverter til grad Centrigrade
t = adc_value / 2;
/ / Print for å vise
Print (t);
/ / Vent litt tid
Vent ();
)
)
ISR (TIMER0_OVF_vect)
(
statiske uint8_t i = 0;
if (i == 2)
(
i = 0;
)
annet
(
i ;
)
PORTB = ~ (1 <<i);
SevenSegment (siffer , 0);
)kan noen hjelpe meg i å justere denne koden
-Siden jeg vil bruke PIC 16f877A .... å vise LM35 med 7 segment ....
Jeg prøver løpe den av meg selv ... å justere uten kunnskap ... synes å være feil .. huhu
behage .... hjelpe ...
Jeg bruker PICKit2 v2.61 å kompilere ....
først og fremst, jeg er ganske ny i C-språk ..
Her er eksempel kildekoden .... av 7 segment display via AVR ...
# Include <avr/io.h>
# Include <avr/interrupt.h>
# Include <util/delay_basic.h># Define SEVEN_SEGMENT_PORT PORTD
# Define SEVEN_SEGMENT_DDR DDRD
uint8_t sifrene [3]; / / Holder tallene for 3 skjermervoid SevenSegment (uint8_t n, uint8_t DP)
(
/ *
Denne funksjonen skriver et tall gitt av n til skjermen
desimaltegnet vises dersom dp = 1
Merk:
n må være mindre enn 9
* /
if (n <10)
(
bryteren
(
tilfelle 0:
SEVEN_SEGMENT_PORT = 0b00000011;
pause;
Eksempel 1:
SEVEN_SEGMENT_PORT = 0b10011111;
pause;
tilfelle 2:
SEVEN_SEGMENT_PORT = 0b00100101;
pause;
sak 3:
SEVEN_SEGMENT_PORT = 0b00001101;
pause;
sak 4:
SEVEN_SEGMENT_PORT = 0b10011001;
pause;
sak 5:
SEVEN_SEGMENT_PORT = 0b01001001;
pause;
sak 6:
SEVEN_SEGMENT_PORT = 0b01000001;
pause;
sak 7:
SEVEN_SEGMENT_PORT = 0b00011111;
pause;
sak 8:
SEVEN_SEGMENT_PORT = 0b00000001;
pause;
sak 9:
SEVEN_SEGMENT_PORT = 0b00001001;
pause;
)
if (DP)
(
/ / Hvis desimaltegn skal vises
/ / Gjør 0th bit Lav
SEVEN_SEGMENT_PORT & = 0b11111110;
)
)
annet
(
/ / Dette symbolet på displayet forteller at n var større enn 9
/ / Så displayet ikke kan håndtere det
SEVEN_SEGMENT_PORT = 0b11111101;
)
)
void Vent ()
(
uint8_t jeg;
for (i = 0; i <10; i )
(
_delay_loop_2 (0);
)
)
void utskrift (uint16_t NUM)
(
uint8_t i = 0;
uint8_t j;
if (num> 999) tilbake;mens (NUM)
(
sifrene = num% 10;
i ;
num = num/10;
)
for (j = i; j <3; j ) tall [j] = 0;
)
void InitADC ()
(
ADMUX = (1 <<REFS0); / / For Aref = AVcc;
ADCSRA = (1 <<ADEN) | (7 <<ADPS0);
)
uint16_t ReadADC (uint8_t ch)
(
/ / Velg ADC kanal lm må være 0-7
lm = ch &0b00000111;
ADMUX | = ch;
/ / Start Enkel konvertering
ADCSRA | = (1 <<ADSC);
/ / Vent til konvertering til fullstendig
samtidig (! (ADCSRA & (1 <<ADIF)));
/ / Clear ADIF ved å skrive ett til det
ADCSRA | = (1 <<ADIF);
avkastning (ADC);
)
void main ()
(
uint16_t adc_value;
uint8_t t;
/ / Prescaler = FCPU/1024
TCCR0 | = (1 <<CS02);
/ / Aktiver Overløp Interrupt Enable
TIMSK | = (1 <<TOIE0);
/ / Initialiser Counter
TCNT0 = 0;
/ / Port C [2,1,0] så ut putte
DDRB | = 0b00000111;
PORTB = 0b00000110;
/ / Port D
SEVEN_SEGMENT_DDR = 0XFF;
/ / Slå av alle segmenter
SEVEN_SEGMENT_PORT = 0XFF;
/ / Aktiver Global Avbryter
sei ();
/ / Aktiver ADC
InitADC ();
/ / Uendelig loop
mens 1 ()
(
/ / Les ADC
adc_value = ReadADC (0);
/ / Konverter til grad Centrigrade
t = adc_value / 2;
/ / Print for å vise
Print (t);
/ / Vent litt tid
Vent ();
)
)
ISR (TIMER0_OVF_vect)
(
statiske uint8_t i = 0;
if (i == 2)
(
i = 0;
)
annet
(
i ;
)
PORTB = ~ (1 <<i);
SevenSegment (siffer , 0);
)kan noen hjelpe meg i å justere denne koden
-Siden jeg vil bruke PIC 16f877A .... å vise LM35 med 7 segment ....
Jeg prøver løpe den av meg selv ... å justere uten kunnskap ... synes å være feil .. huhu
behage .... hjelpe ...
Jeg bruker PICKit2 v2.61 å kompilere ....