Timer Utilizando o PIC16F628A
VERSÃO COM DISPLAY DE 7 SEGMENTOSDOWNLOAD:
Firmware: Timer16F628A.hex;
Arquivo de simulação do Proteus: Timer16F628A.DSN;
CóDIGO-FONTE:
- //VARIAVEIS
- int cnt;
- short minutos,segundos;
- char m1,m2,s1,s2;
- bit start,oldstate1,oldstate2;
- char numeros[10] = {63,6,91,79,102,109,125,7,127,111};//7 segmentos CC
- //ROTINA DE INTERRPÇÃO
- void interrupt(){
- TMR0 = 155;
- cnt++;
- INTCON.T0IF=0; //flag de interrpção
- }
- void main() {
- //CONFIGURAÇÃO DOS REGISTROS
- CMCON = 0b11111111;//desliga comparador analogico
- OPTION_REG=0b00000001; //configura timer0
- INTCON.GIE=1; //habilita interrupcap global
- INTCON.T0IE=1; //habilita interrupcao do timer0
- TMR0=155;
- TRISB=0b00000000;
- TRISA=0b00011111;//pino RA4 definido como entrada.
- //DEFINIÇÃO DE VALOR DAS VARIÁVEIS
- segundos=0;
- minutos=0;
- //BIT DE STATUS
- start=0;
- oldstate1=0;
- oldstate2=0;
- while(1){
- if(cnt>=2500){
- cnt=0;
- if(start){
- segundos--;
- if(segundos<0){
- segundos=59;
- minutos--;
- if(minutos<0){
- TRISA.F4=0; //define pino RA4 como saída
- PORTA.F4=1; //tanto faz o valor, o q queremos e //aterrar a base do transistor.
- minutos=0;
- segundos=0;
- start=0;
- }
- }
- }
- }
- //........AJUSTE DOS SEGUNDOS/MINUTOS..............
- if(!PORTA.F1){//.........SEGUNDOS...........
- if(PORTA.F0){
- oldstate1=1;
- }
- if(!PORTA.F0 && oldstate1){
- oldstate1=0;
- segundos++;
- if(segundos==60) segundos=0;
- }
- }else{//.................MINUTOS............
- if(PORTA.F0){
- oldstate1=1;
- }
- if(!PORTA.F0 && oldstate1){
- oldstate1=0;
- minutos++;
- if(minutos==60) minutos=0;
- }
- }
- //..........START/PAUSE............
- if(PORTA.F2){
- oldstate2=1;
- }
- if(!PORTA.F2 && oldstate2){
- oldstate2=0;
- start = ~start;
- }
- //DIGITOS
- m1 = minutos/10;
- m2 = minutos%10;
- s1 = segundos/10;
- s2 = segundos%10;
- //DISPLAY DE 7 SEGMENTOS
- if(PORTA.F1==0){
- PORTA=0b01000000;
- PORTB=numeros[s2];
- delay_ms(1);
- PORTA=0b10000000;
- PORTB=numeros[s1];
- delay_ms(1);
- }else{
- PORTA=0b01000000;
- PORTB=numeros[m2];
- delay_ms(1);
- PORTA=0b10000000;
- PORTB=numeros[m1];
- delay_ms(1);
- }
- }
- }
VERSÃO COM DISPLAY LCD 16X2
- // pinos do LCD
- sbit LCD_RS at RB4_bit;
- sbit LCD_EN at RB5_bit;
- sbit LCD_D4 at RB0_bit;
- sbit LCD_D5 at RB1_bit;
- sbit LCD_D6 at RB2_bit;
- sbit LCD_D7 at RB3_bit;
- sbit LCD_RS_Direction at TRISB4_bit;
- sbit LCD_EN_Direction at TRISB5_bit;
- sbit LCD_D4_Direction at TRISB0_bit;
- sbit LCD_D5_Direction at TRISB1_bit;
- sbit LCD_D6_Direction at TRISB2_bit;
- sbit LCD_D7_Direction at TRISB3_bit;
- //VARIAVEIS
- int cnt;
- short minutos,segundos;
- char digito;
- bit start,oldstate1,oldstate2;
- //ROTINA DE INTERRPÇÃO
- void interrupt(){
- TMR0 = 155;// carrrega TMR0 com o valor 155
- cnt++;
- INTCON.T0IF=0;//limpa a flag de interrupção
- }
- void main() {
- //CONFIGURAÇÃO DOS REGISTROS
- CMCON = 0b11111111;//desliga comparador analogico
- OPTION_REG=0b00000001; //configura timer0
- INTCON.GIE=1; //habilita interrupcap global
- INTCON.T0IE=1; //habilita interrupcao do timer0
- TMR0=155;//carrega TMR0 com o valor 155
- TRISB=0b00000000;//deifine todas os pinos da portA como saidas
- TRISA=0b11111111;//deifine todas os pinos da portb como entradas
- PORTB.F6=0;//define valor baixo para pino RB6
- //DEFINIÇÃO DE VALOR DAS VARIÁVEIS
- segundos=0;
- minutos=0;
- //BITS DE STATUS
- start=0;
- oldstate1=0;
- oldstate2=0;
- Lcd_Init();
- Lcd_Cmd(_LCD_CLEAR);
- Lcd_Cmd(_LCD_CURSOR_OFF);
- delay_ms(100);
- while(1){
- if(cnt>=2500){
- cnt=0;
- if(start){
- segundos--;
- if(segundos<0){
- segundos=59;
- minutos--;
- if(minutos<0){
- PORTB.F6=1;
- minutos=0;
- segundos=0;
- start=0;
- }
- }
- }
- }
- //........AJUSTE DOS SEGUNDOS E MINUTOS........
- if(!PORTA.F2){
- if(PORTA.F0){
- oldstate1=1;
- }
- if(!PORTA.F0 && oldstate1){
- oldstate1=0;
- segundos++;
- if(segundos==60) segundos=0;
- }
- }else{
- if(PORTA.F0){
- oldstate1=1;
- }
- if(!PORTA.F0 && oldstate1){
- oldstate1=0;
- minutos++;
- if(minutos==60) minutos=0;
- }
- }
- //..........START/PAUSE............
- if(PORTA.F1){
- oldstate2=1;
- }
- if(!PORTA.F1 && oldstate2){
- oldstate2=0;
- start = ~start;
- }
- Lcd_Out(1,6,"Timer");//Escreve no LCD
- digito = minutos/10;//recupera o algarismo mais significativo
- Lcd_Chr(2,6,digito+48);//converte o algarismo em caracter e escreve
- digito = minutos%10;//recupera o algarismo menos significativo
- Lcd_Chr_CP(digito+48);//converte o algarismo em caracter e escreve
- Lcd_Out_CP(":");
- digito = segundos/10;//recupera o algarismo mais significativo
- Lcd_Chr_CP(digito+48);//converte o algarismo em caracter e escreve
- digito = segundos%10;//recupera o algarismo menos significativo
- Lcd_Chr_CP(digito+48);//converte o algarismo em caracter e escreve
- delay_ms(10);
- }
- }
Artigo do da página: http://microcontrolandos.blogspot.com.br/2013/06/pic-eeprom-i2c.html
Bom dia amigo. O atalho para download do arquivo .HEX do V1 não funciona. Vc poderia verificar, por favor.
ResponderExcluirObrigado.