Advertisement
RuiViana

Big Numbers

Aug 3rd, 2015
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.03 KB | None | 0 0
  1. /*
  2. Nome do Projeto: Big_Numbers
  3. Nome do Aquivo: Timer.c
  4. Dependências: htc.h
  5. lcd_GCRAM.c Biblioteca para o lcd 16x2
  6. MCU: PIC16F1847
  7. Board: N/A
  8. Compilador Hi_Tech
  9. IDE: MPLAB
  10. Hardware: PIC16F1847
  11. Escrito por: CESAR L GIACHINI
  12. Modificado por: Rui Viana
  13. Data: 03/08/2015
  14. Uso: Didático
  15. Desenhos N/A
  16. Copyright @ N/A
  17.  
  18. Este programa é software livre;
  19. e é distribuído na esperança que possa ser útil, mas SEM QUALQUER GARANTIA;
  20. mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM.
  21.  
  22. REVISIONS: (latest entry first)
  23. 2015-30-07 - Big_Numbers - First release
  24. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  25. Descrição:
  26.  
  27. Este código le valores anaógicos decimais nas portas A0 e A1, transforma-os para
  28. inteiros e mostra no LCDS usando o desenho de números grandes.
  29. Este código foi inicialment escrito para o compilador CCS, e para o PIC16F877A,
  30. foi reescrito para o compilador Hi-Tech e para o PIC16F1847.
  31. */
  32. //*******************************************************************
  33. #include <htc.h> // Biblioteca geral do Hi-tech
  34.  
  35. #ifndef _XTAL_FREQ // 4Mhz
  36. #define _XTAL_FREQ 4000000
  37. #endif
  38.  
  39. //****************** Configuração do 16F1847 ***************************************
  40. __CONFIG ( FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_OFF & CLKOUTEN_ON & IESO_OFF & FCMEN_OFF );
  41. __CONFIG ( WRT_OFF & PLLEN_OFF & STVREN_OFF & BORV_LO & LVP_OFF );
  42. //*********************************************************
  43. #include "lcd_GCRAM.c" // biblioteca q comanda o lcd 16x2
  44. #define botao RA2 // entrada
  45. #define botao1 RA3 // entrada
  46.  
  47. float adc; // canal analogico a0
  48. float tensao; // valor convertido do a0
  49. long tensao1; // retira a virgula do float do a0
  50. float def; // canal analogico a1
  51. float amperes; // valor convertido do a0
  52. long amperes1; // retira a virgula do float do a0
  53. char v1 = 0; // digito milhar volts
  54. char v2 = 0; // digito centena volts
  55. char v3 =0; // digito dezena volts
  56. char v4 =0; // digito unidade volts
  57. char a1 = 0; // digito milhar amperes
  58. char a2 = 0; // digito centena amperes
  59. char a3 =0; // digito dezena amperes
  60. char a4 =0; // digito unidade amperes
  61. char modo = 0; // Variavel switch define display de tela
  62. //-----------------------------------------------------
  63. unsigned int num[11][6] = // Matriz com definição dos Bigs caracteres
  64. {{5, 2, 5, 5, 3, 5}, // Big number 0 o numero representa a coluna da matriz Lcd_custom_chars
  65. {2, 5, 1, 3, 5, 3}, // Big number 1
  66. {2, 4, 5, 5, 3, 3}, // Big number 2
  67. {2, 4, 5, 3, 3, 5}, // Big number 3
  68. {5, 3, 5, 1, 1, 5}, // Big number 4
  69. {5, 4, 2, 3, 3, 5}, // Big number 5
  70. {5, 4, 2, 5, 3, 5}, // Big number 6
  71. {2, 2, 5, 1, 1, 5}, // Big number 7
  72. {5, 4, 5, 5, 3, 5}, // Big number 8
  73. {5, 4, 5, 3, 3, 5}, // Big number 9
  74. {1, 1, 1, 6, 7, 1} }; // Big number .
  75. //----------------------------------------------------
  76. char lcd_custom_chars[8][8] = // Matriz com formato dos caracteres especiais
  77. {{0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x00}, // Cada caracter especial esta definido nas colunas
  78. {0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x1F, 0x00, 0x00},
  79. {0x1F, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x03, 0x18},
  80. {0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x07, 0x1C},
  81. {0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x07, 0x1C},
  82. {0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x07, 0x1C},
  83. {0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x07, 0x1C},
  84. {0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x03, 0x18}};
  85. //----------------------------------------------------------------
  86. void lcd_load_custom_chars(void) // Função carrega caracters especiais na GCRAM
  87. {
  88. lcd_write(0x40,0x00); // Função comando de escrita
  89. char SizeTab = sizeof(lcd_custom_chars)/8; // Determina tamanho da tabela a carregar e divide por 8
  90. for(char j= 0; j <= SizeTab; j++) // Faça qtde vezes igual ao tamanho da tabela a carregar e divida por 8
  91. {
  92. for (char i=0; i<8; i++) // Carregue 8 bytes por caracter i = coluna j = linhas
  93. {lcd_putch(lcd_custom_chars[i][j]);} // Escreva valor de lcd_custom_chars[][] na CGRAM. Novo caracter.
  94. } // Fim do for
  95. } // Fim da função carrega caracters especiais na GCRAM
  96. //--------------------------------------------------------------
  97. void escreve_numero( unsigned int *numero, char posic) // Função para escrever o Big numero no LCD
  98. {
  99. char j; // Define a linha onde colocar o caracter no LCD 0 ou 1
  100. char k; // Define a posicão onde colocar o caracter no LCD 1, 2 ou 3
  101. char aux= 0; // Variavel para indexar a matriz
  102. for (k=1; k<=2; k++) // Anda pela coluna até qd completar o digito especial 2 matriz
  103. {
  104. lcd_goto(posic); // Envia a posição dentro da primeira linha onde coclocar o caracter
  105. for (j=0; j<=2; j++) // Anda pela linha até qd completar o digito especial 3 matriz
  106. {
  107. lcd_putch(numero[aux]); // Envia o caracter para o LCD
  108. aux++; // Incfrementa o idexador de caracter
  109. }
  110. posic+=0x40; // Envia a posição dentro da primeira linha onde coclocar o caracter
  111. }
  112. }
  113. //--------------------------------------------------------------
  114. void main(void) // Função principal
  115. {
  116. OSCCON = 0x68; // Clock Interno 4MHz
  117. ANSELA = 0x03; // PORT A0 e A1 como analogicas
  118. ANSELB = 0; // Desabilita analogicas do PORT B
  119. TRISA = 0x0F ; // Define PORT A0 até A3 como entrada, o restante como saída
  120. TRISB = 0; // Limpa Port B
  121. lcd_init(); // Inicializa LCD
  122. lcd_load_custom_chars(); // Carrega tabela de caracteres especiasi na GCRAM
  123. __delay_ms(50); // Tempo 50ms
  124. // setup_adc_ports(AN0_AN1_AN3); // Setup portas analogicas (CCS)
  125. // setup_adc(ADC_CLOCK_INTERNAL); // Setup portas analogicas (CCS)
  126. lcd_goto(0); // Select primeira linha posição 0
  127. lcd_puts("FONTE REGULAVEL"); // Msg no display
  128. lcd_goto(0x40); // Select segunda linha posição 0
  129. lcd_puts("CESAR L GIACHINI"); // Msg no display
  130. __delay_ms(1500); // Tempo de 1,5 seg
  131. lcd_clear(); // Limpa LCD
  132. //--------------------------------------------------------------------------
  133. while (1) // Faça sempre
  134. {
  135. // **********************************LEITURAS ANALOGICAS E CONVERSAO*********************************************
  136. // setup_adc_ports(AN0_AN1_AN3); // Setup portas analogicas (CCS)
  137. // set_adc_channel (0); // Setup portas analogicas (CCS)
  138. __delay_us (30); // Tempo para caregar capacitor interno
  139. // adc = read_adc(); // Le valor adc 0 - 1023
  140. adc = 12.34; // Para Debug
  141. tensao = (adc * 0.0195503421309873)*10000; // Calcula e define aé 4 casas na parte inteira
  142. tensao1 = (long)tensao; // Converte de float para inteiro
  143. v1 = ((tensao1/1000)%10); // Calcula valor digito milhar
  144. v2 = ((tensao1/100)%10); // Calcula valor digito centena
  145. v3 = ((tensao1/10)%10); // Calcula valor digito dezena
  146. v4 = ((tensao1)%10); // Calcula valor digito unidade
  147. // setup_adc_ports(AN0_AN1_VSS_VREF); // Setup portas analogicas (CCS)
  148. // set_adc_channel (1); // Le valor adc 0 - 1023
  149. __delay_us(30);; // Tempo para caregar capacitor interno
  150. // def = read_adc(); // Le valor adc 0 - 1023
  151. def = 1.35; // Para Debug
  152. amperes = (def * 0.0048875855327468)*10000; // Calcula e define aé 4 casas na parte inteira
  153. amperes1 = (long)amperes; // Converte de float para inteiro
  154. a1 = ((amperes1/1000)%10); // Calcula valor digito milhar
  155. a2 = ((amperes1/100)%10); // Calcula valor digito centena
  156. a3 = ((amperes1/10)%10); // Calcula valor digito dezena
  157. a4 = ((amperes1)%10); // Calcula valor digito unidade
  158. // **************************LEITURA DE BOTAO PRINCIPAL**************************************
  159. if ((botao)) // Testa botao
  160. { // Se apertado
  161. if ( ++ modo > 3) // Incrementa e verifica se mod maior que 3
  162. { // Se for
  163. modo = 0; // Zera modo
  164. } // Fim do if Incrementa e verifica se mod maior que 3
  165. do{} // Espera botao soltar
  166. while((botao)); // Evita deboucing
  167. } // Fim do if Testa botao
  168. // *******************************MODO DE TELA **********************************************
  169. switch(modo) // Seleciona modo de display
  170. {
  171. case 1 : { // Modo = 1 display voltagem
  172. lcd_clear(); // Limpa LCD
  173. if (v1) // Se primeiro digito for zero, salta proxima instrução
  174. escreve_numero(&num[v1],0); // imprime apartir da posicao 1 da linha
  175. escreve_numero(&num[v2],4); // imprime apartir da posicao 5 da linha
  176. escreve_numero(&num[0x0A], 7); // imprime apartir da posicao 8 da linha
  177. escreve_numero(&num[v3],9); // imprime apartir da posicao 10 da linha
  178. escreve_numero(&num[v4],13); // imprime apartir da posicao 14 da linha
  179. break; // Sai do switch
  180. } // Fim case 1
  181. case 2 : { // Modo = 2 display amperagem
  182. lcd_clear(); // Limpa LCD
  183. if(a1) // Se primeiro digito for zero, salta proxima instrução
  184. escreve_numero(&num[a1], 0); // imprime apartir da posicao 5 da linha
  185. escreve_numero(&num[a2], 4); // imprime apartir da posicao 8 da linha
  186. escreve_numero(&num[0x0A], 7); // imprime apartir da posicao 8 da linha
  187. escreve_numero(&num[a3], 9); // imprime apartir da posicao 10 da linha
  188. escreve_numero(&num[a4], 13); // imprime apartir da posicao 14 da linha
  189. break; // Sai do switch
  190. } // Fim case 2
  191. case 3 : { // Modo = 3 display
  192. lcd_clear(); // Limpa LCD
  193. lcd_goto(0); // Select primeira linha posição 0
  194. lcd_puts("HORA"); // Msg no display
  195. lcd_goto(0x40); // Select segunda linha posição 0
  196. lcd_puts("INCLUIR HR"); // Msg no display
  197. __delay_ms(150); // Tempo 150ms
  198. break; // Sai do switch;
  199. } // Fim case 3
  200. case 4 : { // Modo = 4 display
  201. lcd_clear(); // Limpa LCD
  202. __delay_ms(50); // Tempo 50ms
  203. modo = 0; // Manda rotina ir para default
  204. break; // Sai do switch
  205. } // Fim case 4
  206. default :{ // Default display
  207. lcd_clear(); // Limpa LCD
  208. lcd_goto(0); // Select primeira linha posição 0
  209. lcd_puts("TENSAO:"); // Msg no display
  210. lcd_goto(0x40); // Select segunda linha posição 0
  211. lcd_puts("AMPERES:"); // Msg no display
  212. lcd_puts("A"); // Msg no display
  213. __delay_ms(150); // Tempo 150ms
  214. } // Fim default
  215. } // Fim switch
  216. } // Fim while
  217. } // Fim main
  218.  
  219. //----------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement