Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Nome do Projeto: Big_Numbers
- Nome do Aquivo: Timer.c
- Dependências: htc.h
- lcd_GCRAM.c Biblioteca para o lcd 16x2
- MCU: PIC16F1847
- Board: N/A
- Compilador Hi_Tech
- IDE: MPLAB
- Hardware: PIC16F1847
- Escrito por: CESAR L GIACHINI
- Modificado por: Rui Viana
- Data: 03/08/2015
- Uso: Didático
- Desenhos N/A
- Copyright @ N/A
- Este programa é software livre;
- e é distribuído na esperança que possa ser útil, mas SEM QUALQUER GARANTIA;
- mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM.
- REVISIONS: (latest entry first)
- 2015-30-07 - Big_Numbers - First release
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Descrição:
- Este código le valores anaógicos decimais nas portas A0 e A1, transforma-os para
- inteiros e mostra no LCDS usando o desenho de números grandes.
- Este código foi inicialment escrito para o compilador CCS, e para o PIC16F877A,
- foi reescrito para o compilador Hi-Tech e para o PIC16F1847.
- */
- //*******************************************************************
- #include <htc.h> // Biblioteca geral do Hi-tech
- #ifndef _XTAL_FREQ // 4Mhz
- #define _XTAL_FREQ 4000000
- #endif
- //****************** Configuração do 16F1847 ***************************************
- __CONFIG ( FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_ON & IESO_OFF & FCMEN_OFF );
- __CONFIG ( WRT_OFF & PLLEN_OFF & STVREN_OFF & BORV_LO & LVP_OFF );
- //*********************************************************
- #include "lcd_GCRAM.c" // biblioteca q comanda o lcd 16x2
- #define botao RA2 // entrada
- #define botao1 RA3 // entrada
- float adc; // canal analogico a0
- float tensao; // valor convertido do a0
- long tensao1; // retira a virgula do float do a0
- float def; // canal analogico a1
- float amperes; // valor convertido do a0
- long amperes1; // retira a virgula do float do a0
- char v1 = 0; // digito milhar volts
- char v2 = 0; // digito centena volts
- char v3 =0; // digito dezena volts
- char v4 =0; // digito unidade volts
- char a1 = 0; // digito milhar amperes
- char a2 = 0; // digito centena amperes
- char a3 =0; // digito dezena amperes
- char a4 =0; // digito unidade amperes
- char modo = 0; // Variavel switch define display de tela
- //-----------------------------------------------------
- unsigned int num[11][6] = // Matriz com definição dos Bigs caracteres
- {{5, 2, 5, 5, 3, 5}, // Big number 0 o numero representa a coluna da matriz Lcd_custom_chars
- {2, 5, 1, 3, 5, 3}, // Big number 1
- {2, 4, 5, 5, 3, 3}, // Big number 2
- {2, 4, 5, 3, 3, 5}, // Big number 3
- {5, 3, 5, 1, 1, 5}, // Big number 4
- {5, 4, 2, 3, 3, 5}, // Big number 5
- {5, 4, 2, 5, 3, 5}, // Big number 6
- {2, 2, 5, 1, 1, 5}, // Big number 7
- {5, 4, 5, 5, 3, 5}, // Big number 8
- {5, 4, 5, 3, 3, 5}, // Big number 9
- {1, 1, 1, 6, 7, 1} }; // Big number .
- //----------------------------------------------------
- char lcd_custom_chars[8][8] = // Matriz com formato dos caracteres especiais
- {{0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x00}, // Cada caracter especial esta definido nas colunas
- {0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x00},
- {0x1F, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x03, 0x18},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x07, 0x1C},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x07, 0x1C},
- {0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x07, 0x1C},
- {0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x07, 0x1C},
- {0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x03, 0x18}};
- //----------------------------------------------------------------
- void lcd_load_custom_chars(void) // Função carrega caracters especiais na GCRAM
- {
- lcd_write(0x40,0x00); // Função comando de escrita
- char SizeTab = sizeof(lcd_custom_chars)/8; // Determina tamanho da tabela a carregar e divide por 8
- for(char j= 0; j <= SizeTab; j++) // Faça qtde vezes igual ao tamanho da tabela a carregar e divida por 8
- {
- for (char i=0; i<8; i++) // Carregue 8 bytes por caracter i = coluna j = linhas
- {lcd_putch(lcd_custom_chars[i][j]);} // Escreva valor de lcd_custom_chars[][] na CGRAM. Novo caracter.
- } // Fim do for
- } // Fim da função carrega caracters especiais na GCRAM
- //--------------------------------------------------------------
- void escreve_numero( unsigned int *numero, char posic) // Função para escrever o Big numero no LCD
- {
- char j; // Define a linha onde colocar o caracter no LCD 0 ou 1
- char k; // Define a posicão onde colocar o caracter no LCD 1, 2 ou 3
- char aux= 0; // Variavel para indexar a matriz
- for (k=1; k<=2; k++) // Anda pela coluna até qd completar o digito especial 2 matriz
- {
- lcd_goto(posic); // Envia a posição dentro da primeira linha onde coclocar o caracter
- for (j=0; j<=2; j++) // Anda pela linha até qd completar o digito especial 3 matriz
- {
- lcd_putch(numero[aux]); // Envia o caracter para o LCD
- aux++; // Incfrementa o idexador de caracter
- }
- posic+=0x40; // Envia a posição dentro da primeira linha onde coclocar o caracter
- }
- }
- //--------------------------------------------------------------
- void main(void) // Função principal
- {
- OSCCON = 0x68; // Clock Interno 4MHz
- ANSELA = 0x03; // PORT A0 e A1 como analogicas
- ANSELB = 0; // Desabilita analogicas do PORT B
- TRISA = 0x0F ; // Define PORT A0 até A3 como entrada, o restante como saída
- TRISB = 0; // Limpa Port B
- lcd_init(); // Inicializa LCD
- lcd_load_custom_chars(); // Carrega tabela de caracteres especiasi na GCRAM
- __delay_ms(50); // Tempo 50ms
- // setup_adc_ports(AN0_AN1_AN3); // Setup portas analogicas (CCS)
- // setup_adc(ADC_CLOCK_INTERNAL); // Setup portas analogicas (CCS)
- lcd_goto(0); // Select primeira linha posição 0
- lcd_puts("FONTE REGULAVEL"); // Msg no display
- lcd_goto(0x40); // Select segunda linha posição 0
- lcd_puts("CESAR L GIACHINI"); // Msg no display
- __delay_ms(1500); // Tempo de 1,5 seg
- lcd_clear(); // Limpa LCD
- //--------------------------------------------------------------------------
- while (1) // Faça sempre
- {
- // **********************************LEITURAS ANALOGICAS E CONVERSAO*********************************************
- // setup_adc_ports(AN0_AN1_AN3); // Setup portas analogicas (CCS)
- // set_adc_channel (0); // Setup portas analogicas (CCS)
- __delay_us (30); // Tempo para caregar capacitor interno
- // adc = read_adc(); // Le valor adc 0 - 1023
- adc = 12.34; // Para Debug
- tensao = (adc * 0.0195503421309873)*10000; // Calcula e define aé 4 casas na parte inteira
- tensao1 = (long)tensao; // Converte de float para inteiro
- v1 = ((tensao1/1000)%10); // Calcula valor digito milhar
- v2 = ((tensao1/100)%10); // Calcula valor digito centena
- v3 = ((tensao1/10)%10); // Calcula valor digito dezena
- v4 = ((tensao1)%10); // Calcula valor digito unidade
- // setup_adc_ports(AN0_AN1_VSS_VREF); // Setup portas analogicas (CCS)
- // set_adc_channel (1); // Le valor adc 0 - 1023
- __delay_us(30);; // Tempo para caregar capacitor interno
- // def = read_adc(); // Le valor adc 0 - 1023
- def = 1.35; // Para Debug
- amperes = (def * 0.0048875855327468)*10000; // Calcula e define aé 4 casas na parte inteira
- amperes1 = (long)amperes; // Converte de float para inteiro
- a1 = ((amperes1/1000)%10); // Calcula valor digito milhar
- a2 = ((amperes1/100)%10); // Calcula valor digito centena
- a3 = ((amperes1/10)%10); // Calcula valor digito dezena
- a4 = ((amperes1)%10); // Calcula valor digito unidade
- // **************************LEITURA DE BOTAO PRINCIPAL**************************************
- if ((botao)) // Testa botao
- { // Se apertado
- if ( ++ modo > 3) // Incrementa e verifica se mod maior que 3
- { // Se for
- modo = 0; // Zera modo
- } // Fim do if Incrementa e verifica se mod maior que 3
- do{} // Espera botao soltar
- while((botao)); // Evita deboucing
- } // Fim do if Testa botao
- // *******************************MODO DE TELA **********************************************
- switch(modo) // Seleciona modo de display
- {
- case 1 : { // Modo = 1 display voltagem
- lcd_clear(); // Limpa LCD
- if (v1) // Se primeiro digito for zero, salta proxima instrução
- escreve_numero(&num[v1],0); // imprime apartir da posicao 1 da linha
- escreve_numero(&num[v2],4); // imprime apartir da posicao 5 da linha
- escreve_numero(&num[0x0A], 7); // imprime apartir da posicao 8 da linha
- escreve_numero(&num[v3],9); // imprime apartir da posicao 10 da linha
- escreve_numero(&num[v4],13); // imprime apartir da posicao 14 da linha
- break; // Sai do switch
- } // Fim case 1
- case 2 : { // Modo = 2 display amperagem
- lcd_clear(); // Limpa LCD
- if(a1) // Se primeiro digito for zero, salta proxima instrução
- escreve_numero(&num[a1], 0); // imprime apartir da posicao 5 da linha
- escreve_numero(&num[a2], 4); // imprime apartir da posicao 8 da linha
- escreve_numero(&num[0x0A], 7); // imprime apartir da posicao 8 da linha
- escreve_numero(&num[a3], 9); // imprime apartir da posicao 10 da linha
- escreve_numero(&num[a4], 13); // imprime apartir da posicao 14 da linha
- break; // Sai do switch
- } // Fim case 2
- case 3 : { // Modo = 3 display
- lcd_clear(); // Limpa LCD
- lcd_goto(0); // Select primeira linha posição 0
- lcd_puts("HORA"); // Msg no display
- lcd_goto(0x40); // Select segunda linha posição 0
- lcd_puts("INCLUIR HR"); // Msg no display
- __delay_ms(150); // Tempo 150ms
- break; // Sai do switch;
- } // Fim case 3
- case 4 : { // Modo = 4 display
- lcd_clear(); // Limpa LCD
- __delay_ms(50); // Tempo 50ms
- modo = 0; // Manda rotina ir para default
- break; // Sai do switch
- } // Fim case 4
- default :{ // Default display
- lcd_clear(); // Limpa LCD
- lcd_goto(0); // Select primeira linha posição 0
- lcd_puts("TENSAO:"); // Msg no display
- lcd_goto(0x40); // Select segunda linha posição 0
- lcd_puts("AMPERES:"); // Msg no display
- lcd_puts("A"); // Msg no display
- __delay_ms(150); // Tempo 150ms
- } // Fim default
- } // Fim switch
- } // Fim while
- } // Fim main
- //----------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement