D
delifadzli
Guest
Ciao a tutti,
prima di tutto, sono abbastanza nuovo linguaggio C ..
Ecco il codice di esempio .... fonte di display a 7 segmenti con AVR ...
# Include <avr/io.h>
# Include <avr/interrupt.h>
# Include <util/delay_basic.h># Define SEVEN_SEGMENT_PORT PORTD
# Define SEVEN_SEGMENT_DDR DDRR
uint8_t cifre [3] / / Contiene le cifre per 3 schermivoid SevenSegment (n uint8_t, uint8_t dp)
(
/ *
Questa funzione scrive un dato da N cifre per la visualizzazione
la virgola è visualizzato se dp = 1
Nota:
n deve essere inferiore a 9
* /
if (n <10)
(
switch
(
case 0:
SEVEN_SEGMENT_PORT = 0b00000011;
break;
Caso 1:
SEVEN_SEGMENT_PORT = 0b10011111;
break;
Caso 2:
SEVEN_SEGMENT_PORT = 0b00100101;
break;
Caso 3:
SEVEN_SEGMENT_PORT = 0b00001101;
break;
Caso 4:
SEVEN_SEGMENT_PORT = 0b10011001;
break;
caso 5:
SEVEN_SEGMENT_PORT = 0b01001001;
break;
caso 6:
SEVEN_SEGMENT_PORT = 0b01000001;
break;
Caso 7:
SEVEN_SEGMENT_PORT = 0b00011111;
break;
Caso 8:
SEVEN_SEGMENT_PORT = 0b00000001;
break;
Caso 9:
SEVEN_SEGMENT_PORT = 0b00001001;
break;
)
if (dp)
(
/ / Se il punto decimale deve essere visualizzato
/ / Fare 0a po 'basso
SEVEN_SEGMENT_PORT & = 0b11111110;
)
)
altro
(
/ / Questo simbolo sul display dice che n è maggiore di 9
/ / Modo di visualizzazione non può gestire
SEVEN_SEGMENT_PORT = 0b11111101;
)
)
void Wait ()
(
uint8_t i;
for (i = 0; i <10; i )
(
_delay_loop_2 (0);
)
)
void stampa (num uint16_t)
(
uint8_t i = 0;
j uint8_t;
if (num> 999) return;while (num)
(
cifre = num% 10;
i ;
num = num/10;
)
for (j = i, j <3; j ) le cifre [j] = 0;
)
void InitADC ()
(
ADMUX = (1 <<REFS0); / / Per Aref = AVCC;
ADCSRA = (1 <<ADEN) | (7 <<ADPS0);
)
uint16_t ReadADC (ch uint8_t)
(
/ / Seleziona ADC canale CH deve essere 0-7
CH = CH &0b00000111;
ADMUX | = ch;
/ / Singola conversione Start
ADCSRA | = (1 <<ADSC);
/ / Attendere per la conversione di completare
while (! (ADCSRA & (1 <<ADIF)));
/ / Cancella ADIF scrivendo uno ad esso
ADCSRA | = (1 <<ADIF);
ritorno (ADC);
)
void main ()
(
adc_value uint16_t;
t uint8_t;
/ / Prescaler = FCPU/1024
TCCR0 | = (1 <<CS02);
/ / Abilita Overflow Interrupt Enable
TIMSK | = (1 <<TOIE0);
/ / Inizializza Counter
TCNT0 = 0;
/ / Port C [2,1,0] come mettere fuori
DDRB | = 0b00000111;
PORTB = 0b00000110;
/ / Port D
SEVEN_SEGMENT_DDR = 0xFF;
/ / Disattiva tutti i segmenti
SEVEN_SEGMENT_PORT = 0xFF;
/ / Abilita Interrompe Global
sei ();
/ / Abilita ADC
InitADC ();
/ / Loop infinito
while (1)
(
/ / Per saperne di ADC
adc_value = ReadADC (0);
/ / Converti in grado centigradi
t = adc_value / 2;
/ / Stampa per visualizzare
Stampa (t);
/ / Attendere un certo tempo
Wait ();
)
)
ISR (TIMER0_OVF_vect)
(
uint8_t statica i = 0;
if (i == 2)
(
i = 0;
)
altro
(
i ;
)
PORTB = ~ (1 <<i);
SevenSegment (cifre , 0);
)qualcuno mi può aiutare a regolare questo codice
-Perchè voglio usare PIC 16F877A .... per visualizzare LM35 con 7 segmenti ....
Cerco correre da sola ... regolando senza alcuna conoscenza ... sembra essere errore .. huhu
per favore .... aiuto ...
I PICKit2 utilizzando v2.61 per compilare ....
prima di tutto, sono abbastanza nuovo linguaggio C ..
Ecco il codice di esempio .... fonte di display a 7 segmenti con AVR ...
# Include <avr/io.h>
# Include <avr/interrupt.h>
# Include <util/delay_basic.h># Define SEVEN_SEGMENT_PORT PORTD
# Define SEVEN_SEGMENT_DDR DDRR
uint8_t cifre [3] / / Contiene le cifre per 3 schermivoid SevenSegment (n uint8_t, uint8_t dp)
(
/ *
Questa funzione scrive un dato da N cifre per la visualizzazione
la virgola è visualizzato se dp = 1
Nota:
n deve essere inferiore a 9
* /
if (n <10)
(
switch
(
case 0:
SEVEN_SEGMENT_PORT = 0b00000011;
break;
Caso 1:
SEVEN_SEGMENT_PORT = 0b10011111;
break;
Caso 2:
SEVEN_SEGMENT_PORT = 0b00100101;
break;
Caso 3:
SEVEN_SEGMENT_PORT = 0b00001101;
break;
Caso 4:
SEVEN_SEGMENT_PORT = 0b10011001;
break;
caso 5:
SEVEN_SEGMENT_PORT = 0b01001001;
break;
caso 6:
SEVEN_SEGMENT_PORT = 0b01000001;
break;
Caso 7:
SEVEN_SEGMENT_PORT = 0b00011111;
break;
Caso 8:
SEVEN_SEGMENT_PORT = 0b00000001;
break;
Caso 9:
SEVEN_SEGMENT_PORT = 0b00001001;
break;
)
if (dp)
(
/ / Se il punto decimale deve essere visualizzato
/ / Fare 0a po 'basso
SEVEN_SEGMENT_PORT & = 0b11111110;
)
)
altro
(
/ / Questo simbolo sul display dice che n è maggiore di 9
/ / Modo di visualizzazione non può gestire
SEVEN_SEGMENT_PORT = 0b11111101;
)
)
void Wait ()
(
uint8_t i;
for (i = 0; i <10; i )
(
_delay_loop_2 (0);
)
)
void stampa (num uint16_t)
(
uint8_t i = 0;
j uint8_t;
if (num> 999) return;while (num)
(
cifre = num% 10;
i ;
num = num/10;
)
for (j = i, j <3; j ) le cifre [j] = 0;
)
void InitADC ()
(
ADMUX = (1 <<REFS0); / / Per Aref = AVCC;
ADCSRA = (1 <<ADEN) | (7 <<ADPS0);
)
uint16_t ReadADC (ch uint8_t)
(
/ / Seleziona ADC canale CH deve essere 0-7
CH = CH &0b00000111;
ADMUX | = ch;
/ / Singola conversione Start
ADCSRA | = (1 <<ADSC);
/ / Attendere per la conversione di completare
while (! (ADCSRA & (1 <<ADIF)));
/ / Cancella ADIF scrivendo uno ad esso
ADCSRA | = (1 <<ADIF);
ritorno (ADC);
)
void main ()
(
adc_value uint16_t;
t uint8_t;
/ / Prescaler = FCPU/1024
TCCR0 | = (1 <<CS02);
/ / Abilita Overflow Interrupt Enable
TIMSK | = (1 <<TOIE0);
/ / Inizializza Counter
TCNT0 = 0;
/ / Port C [2,1,0] come mettere fuori
DDRB | = 0b00000111;
PORTB = 0b00000110;
/ / Port D
SEVEN_SEGMENT_DDR = 0xFF;
/ / Disattiva tutti i segmenti
SEVEN_SEGMENT_PORT = 0xFF;
/ / Abilita Interrompe Global
sei ();
/ / Abilita ADC
InitADC ();
/ / Loop infinito
while (1)
(
/ / Per saperne di ADC
adc_value = ReadADC (0);
/ / Converti in grado centigradi
t = adc_value / 2;
/ / Stampa per visualizzare
Stampa (t);
/ / Attendere un certo tempo
Wait ();
)
)
ISR (TIMER0_OVF_vect)
(
uint8_t statica i = 0;
if (i == 2)
(
i = 0;
)
altro
(
i ;
)
PORTB = ~ (1 <<i);
SevenSegment (cifre , 0);
)qualcuno mi può aiutare a regolare questo codice
-Perchè voglio usare PIC 16F877A .... per visualizzare LM35 con 7 segmenti ....
Cerco correre da sola ... regolando senza alcuna conoscenza ... sembra essere errore .. huhu
per favore .... aiuto ...
I PICKit2 utilizzando v2.61 per compilare ....