D
delifadzli
Guest
Hallo iedereen,
eerst en vooral, ik ben vrij nieuw voor de C-taal ..
Hier is een voorbeeld broncode .... van 7 segment display via de 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 cijfers [3]; / / Bevat de cijfers voor 3 toontSevenSegment void (n uint8_t, uint8_t DP)
(
/ *
Deze functie schrijft een cijfers gegeven door n om het scherm
de komma wordt weergegeven als dp = 1
Opmerking:
n moet minder dan 9
* /
if (n <10)
(
schakelaar
(
case 0:
SEVEN_SEGMENT_PORT = 0b00000011;
te breken;
Geval 1:
SEVEN_SEGMENT_PORT = 0b10011111;
te breken;
Case 2:
SEVEN_SEGMENT_PORT = 0b00100101;
te breken;
case 3:
SEVEN_SEGMENT_PORT = 0b00001101;
te breken;
case 4:
SEVEN_SEGMENT_PORT = 0b10011001;
te breken;
case 5:
SEVEN_SEGMENT_PORT = 0b01001001;
te breken;
case 6:
SEVEN_SEGMENT_PORT = 0b01000001;
te breken;
Bij 7:
SEVEN_SEGMENT_PORT = 0b00011111;
te breken;
geval 8:
SEVEN_SEGMENT_PORT = 0b00000001;
te breken;
Case 9:
SEVEN_SEGMENT_PORT = 0b00001001;
te breken;
)
if (DP)
(
/ / Als decimale punt moet worden weergegeven
/ / Te maken 0de beetje laag
SEVEN_SEGMENT_PORT & = 0b11111110;
)
)
anders
(
/ / Dit symbool op het display vertelt dat n groter was dan 9
/ / Display kan dus niet mee omgaan
SEVEN_SEGMENT_PORT = 0b11111101;
)
)
Wacht void ()
(
uint8_t i;
for (i = 0; i <10; i )
(
_delay_loop_2 (0);
)
)
void Print (uint16_t NUM)
(
uint8_t i = 0;
uint8_t j;
if (NUM> 999) terug te keren;while (NUM)
(
cijfers = num% 10;
i ;
num = num/10;
)
for (i = j, j <3; j ) cijfers [j] = 0;
)
InitADC void ()
(
ADMUX = (1 <<REFS0); / / Voor Aref = AVcc;
ADCSRA = (1 <<Aden) | (7 <<ADPS0);
)
uint16_t ReadADC (uint8_t ch)
(
/ / Selecteer ADC kanaal CH moet worden 0-7
ch = ch &0b00000111;
ADMUX | = l;
/ / Start een conversie
ADCSRA | = (1 <<ADSC);
/ / Wacht tot conversie te voltooien
while (! (ADCSRA & (1 <<ADIF)));
/ / Clear ADIF door het schrijven van een te
ADCSRA | = (1 <<ADIF);
return (ADC);
)
void main ()
(
uint16_t adc_value;
uint8_t t;
/ / Prescaler = FCPU/1024
TCCR0 | = (1 <<CS02);
/ / Enable Overloop Interrupt Enable
TIMSK | = (1 <<TOIE0);
/ / Initialiseren Counter
TCNT0 = 0;
/ / Port C [2,1,0] als buiten gezet
DDRB | = 0b00000111;
PORTB = 0b00000110;
/ / Port D
SEVEN_SEGMENT_DDR = 0xFF;
/ / Zet alle segmenten
SEVEN_SEGMENT_PORT = 0xFF;
/ / Enable Global Interrupts
sei ();
/ / ADC inschakelen
InitADC ();
/ / Oneindige lus
while (1)
(
/ / Lees ADC
adc_value = ReadADC (0);
/ / Converteer naar mate Centrigrade
t = adc_value / 2;
/ / Print weer te geven
Print (t);
/ / Wacht enige tijd
Wait ();
)
)
ISR (TIMER0_OVF_vect)
(
statische uint8_t i = 0;
if (i == 2)
(
i = 0;
)
anders
(
i ;
)
PORTB = ~ (1 <<i);
SevenSegment (cijfers , 0);
)kan iemand me helpen bij de aanpassing van deze code
-Sinds ik PIC wilt gebruiken 16f877A .... naar LM35 display met 7 segmenten ....
Ik probeer het draaien door aanpassing van mezelf ... ... zonder enige kennis lijkt te zijn van fouten .. huhu
Gelieve .... help ...
Ik gebruik PICKit2 v2.61 te compileren ....
eerst en vooral, ik ben vrij nieuw voor de C-taal ..
Hier is een voorbeeld broncode .... van 7 segment display via de 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 cijfers [3]; / / Bevat de cijfers voor 3 toontSevenSegment void (n uint8_t, uint8_t DP)
(
/ *
Deze functie schrijft een cijfers gegeven door n om het scherm
de komma wordt weergegeven als dp = 1
Opmerking:
n moet minder dan 9
* /
if (n <10)
(
schakelaar
(
case 0:
SEVEN_SEGMENT_PORT = 0b00000011;
te breken;
Geval 1:
SEVEN_SEGMENT_PORT = 0b10011111;
te breken;
Case 2:
SEVEN_SEGMENT_PORT = 0b00100101;
te breken;
case 3:
SEVEN_SEGMENT_PORT = 0b00001101;
te breken;
case 4:
SEVEN_SEGMENT_PORT = 0b10011001;
te breken;
case 5:
SEVEN_SEGMENT_PORT = 0b01001001;
te breken;
case 6:
SEVEN_SEGMENT_PORT = 0b01000001;
te breken;
Bij 7:
SEVEN_SEGMENT_PORT = 0b00011111;
te breken;
geval 8:
SEVEN_SEGMENT_PORT = 0b00000001;
te breken;
Case 9:
SEVEN_SEGMENT_PORT = 0b00001001;
te breken;
)
if (DP)
(
/ / Als decimale punt moet worden weergegeven
/ / Te maken 0de beetje laag
SEVEN_SEGMENT_PORT & = 0b11111110;
)
)
anders
(
/ / Dit symbool op het display vertelt dat n groter was dan 9
/ / Display kan dus niet mee omgaan
SEVEN_SEGMENT_PORT = 0b11111101;
)
)
Wacht void ()
(
uint8_t i;
for (i = 0; i <10; i )
(
_delay_loop_2 (0);
)
)
void Print (uint16_t NUM)
(
uint8_t i = 0;
uint8_t j;
if (NUM> 999) terug te keren;while (NUM)
(
cijfers = num% 10;
i ;
num = num/10;
)
for (i = j, j <3; j ) cijfers [j] = 0;
)
InitADC void ()
(
ADMUX = (1 <<REFS0); / / Voor Aref = AVcc;
ADCSRA = (1 <<Aden) | (7 <<ADPS0);
)
uint16_t ReadADC (uint8_t ch)
(
/ / Selecteer ADC kanaal CH moet worden 0-7
ch = ch &0b00000111;
ADMUX | = l;
/ / Start een conversie
ADCSRA | = (1 <<ADSC);
/ / Wacht tot conversie te voltooien
while (! (ADCSRA & (1 <<ADIF)));
/ / Clear ADIF door het schrijven van een te
ADCSRA | = (1 <<ADIF);
return (ADC);
)
void main ()
(
uint16_t adc_value;
uint8_t t;
/ / Prescaler = FCPU/1024
TCCR0 | = (1 <<CS02);
/ / Enable Overloop Interrupt Enable
TIMSK | = (1 <<TOIE0);
/ / Initialiseren Counter
TCNT0 = 0;
/ / Port C [2,1,0] als buiten gezet
DDRB | = 0b00000111;
PORTB = 0b00000110;
/ / Port D
SEVEN_SEGMENT_DDR = 0xFF;
/ / Zet alle segmenten
SEVEN_SEGMENT_PORT = 0xFF;
/ / Enable Global Interrupts
sei ();
/ / ADC inschakelen
InitADC ();
/ / Oneindige lus
while (1)
(
/ / Lees ADC
adc_value = ReadADC (0);
/ / Converteer naar mate Centrigrade
t = adc_value / 2;
/ / Print weer te geven
Print (t);
/ / Wacht enige tijd
Wait ();
)
)
ISR (TIMER0_OVF_vect)
(
statische uint8_t i = 0;
if (i == 2)
(
i = 0;
)
anders
(
i ;
)
PORTB = ~ (1 <<i);
SevenSegment (cijfers , 0);
)kan iemand me helpen bij de aanpassing van deze code
-Sinds ik PIC wilt gebruiken 16f877A .... naar LM35 display met 7 segmenten ....
Ik probeer het draaien door aanpassing van mezelf ... ... zonder enige kennis lijkt te zijn van fouten .. huhu
Gelieve .... help ...
Ik gebruik PICKit2 v2.61 te compileren ....