Nesse exemplo mostro como criar uma rotina para escrita em display de 7 segmentos baseado em interrupção.

Usar no Proteus 7.10 ou superior.


Fazer o download: [PIC] Trabalhando com Display de 7 Segmentos por Varredura com interrupção 


Segue o código:

[sections] [section title=”Código Fonte”] [codesyntax lang=”c”] /*
DATEK Tecnologia Eletrônica Ltda.

********************************************************************************
PROGRAMA EXEMPLO: Mostrar como utilizar 7 segmentos por interrupção.
OBJETIVO: Aprender como utilizar 7 segmentos por interrupção.
AUTOR: Fabio Mulero.[fabio@datek.com.br] ********************************************************************************
MICROCONTROLADOR: PIC18F4620.

PLACA DE DESENVOLVIMENTO: SIMULAÇÃO NO PROTEUS

SOFTWARE: MikroC PRO for PIC Versão: 6.0

********************************************************************************
*/
// VARIAVEIS GLOBAIS
unsigned int uiContador; // Variavel de armazenamento do contador.
unsigned int uiValor; // Variavel auxiliar para exibição do contador.
// "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
unsigned char ucMask[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
/* Variavel do tipo matriz que armazena os valores correspondentes ao numero
para ser mostrado no display de 7 segmentos */

void interrupt(){
if(TMR3IF_bit==1){ // Incrementa somente quando existir o overflow do timer 3.
// Recarrega o timer3.
TMR3H = 0x7B; // Carrega o valor alto.
TMR3L = 0xDC; // Carrega o valor baixo.

TMR3IF_bit = 0; // Limpa o flag de estouro do timer3 para uma nova contagem de tempo.

uiValor = uiContador; // Coloca o conteudo da variavel do contador na varaivel auxiliar.
#define Delay 200
// Mostra valor da unidade.
PORTD = ucMask[uiValor%10]; // Pega modulo (resto) da divisão por 10 e coloca o valor no PORTD.
LATA3_bit = 1; // Liga o transistor associado ao display 1.
Delay_us(Delay); // Delay para escrita no display.
LATA3_bit = 0; // Desliga o transistor associado ao display 1.
uiValor/=10; // Divide variavel por 10.
// Mostra valor da dezena.
PORTD = ucMask[uiValor%10];
LATA2_bit = 1;
Delay_us(Delay);
LATA2_bit = 0;
uiValor/=10;
// Mostra valor da centena.
PORTD = ucMask[uiValor%10];
LATA1_bit = 1;
Delay_us(Delay);
LATA1_bit = 0;
uiValor/=10;
// Mostra valor do milhar.
PORTD = ucMask[uiValor%10];
LATA0_bit= 1;
Delay_us(Delay);
LATA0_bit = 0;
}
}

void main(){
unsigned char ucStatus_inc; // Variavel de travamento do incremento.
unsigned char ucStatus_dec; // Variavel de travamento do decremento.

ADCON1 = 0x0f; // Configura todos canais como Digital.

TRISB0_bit=1; // Define o pino RB0 do PORTB como entrada.
TRISB1_bit=1; // Define o pino RB1 Do PORTB como entrada.

TRISA0_bit=0; // Define o pino RA0 do PORTA como saida(Seleção Display 1).
TRISA1_bit=0; // Define o pino RA1 do PORTA como saida(Seleção Display 2).
TRISA2_bit=0; // Define o pino RA2 do PORTA como saida(Seleção Display 3).
TRISA3_bit=0; // Define o pino RA3 do PORTA como saida(Seleção Display 4).

TRISD = 0; // Define todos os pinos Do PORTD como saida.

ucStatus_inc=0; // Inicializa a variavel com o valor 0.
ucStatus_dec=0; // Inicializa a variavel com o valor 0.
uiContador=0; // Inicializa a variavel com o valor 0.

// Configuração do Timer3.
// Cristal de 8Mhz, ciclo de máquina: 8MHz / 4 = 2Mhz –> 1/2Mhz = 0,5us.
RD16_bit = 1; // Habilita a leitura e escrita em um ciclo de 16 bits.
T3CKPS1_bit = 0; // Define prescaler 1:1.
T3CKPS0_bit = 0; // Define prescaler 1:1.
TMR3CS_bit = 0; // Clock interno.

TMR3H = 0x7B; // Carrega o valor alto.
TMR3L = 0xDC; // Carrega o valor baixo.
TMR3IE_bit = 1; // Habilita a interrupção do timer3.
TMR3IF_bit = 0; // Apaga flag de estouro do timer3, pois é fundamental para a sinalização do estouro.
TMR3ON_bit = 1; // Liga timer3.

GIE_bit = 1; // Habilita as interrupções não-mascaradas.
PEIE_bit = 1; // Habilita as interrupções dos perifericos.

while(1){ // Aqui definimos uma condição sempre verdadeira como parametro, portanto todo o bloco será repetido indefinidamente.

// Le Tecla E Incrementa Contador.
if((!RB0_bit)&&(!ucStatus_inc)){ // Incrementa somente uma vez quando a tecla for pressionada.
ucStatus_inc=1; // Variavel de travamento do incremento.
uiContador++; // Esse operador aritmetico(++) realiza o mesmo que variavel = variavel + 1.
if(uiContador>9999){
/* Essa comparação é feita pois nosso valor máximo é 9999. */
uiContador=9999;
}
}
if((RB0_bit)&&(ucStatus_inc)){ // Volta a disponibilizar a opção de incremento quando a tecla for solta.
ucStatus_inc=0;
}
// Le tecla e decrementa contador.
if((!RB1_bit)&&(!ucStatus_dec)){ // Decrementa somente uma vez quando a tecla for pressionada.
ucStatus_dec=1; // Variavel de travamento do decremento.
uiContador–; // Esse operador aritmetico(–) realiza o mesmo que variavel = variavel – 1.
if(uiContador>9999){
/* Essa comparação é feita pois ao decrementar variaveis sem sinal o
valor irá para o valor máximo da variavel que no caso é 65535. */
uiContador=0;
}
}
if((RB1_bit)&&(ucStatus_dec)){ // Volta a disponibilizar a opção de incremento quando a tecla for solta.
ucStatus_dec=0;
}
}
}
[/codesyntax] [/section] [section title=”Esquema Elétrico”]

7 segmentos por interrupção
7 segmentos por interrupção
[/section] [/sections]
Obrigado e até o próximo post.

DATEK Tecnologia Eletrônica
[PIC] Trabalhando com Display de 7 Segmentos por Varredura com interrupção
Tags:                         

Deixe uma resposta

%d blogueiros gostam disto: