Advertisement
Guest User

Untitled

a guest
Jun 21st, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.75 KB | None | 0 0
  1. #define _XTAL_FREQ 8000000
  2. /*Estas variables son para el uso del LCD, su equivalente
  3. a la pata de salida del PIC*/
  4. #define RS RD2
  5. #define EN RD3
  6. #define D4 RD4
  7. #define D5 RD5
  8. #define D6 RD6
  9. #define D7 RD7
  10.  
  11.  
  12. #include <xc.h>
  13. #include <stdio.h>
  14. #pragma config FOSC = INTRC_CLKOUT
  15. #pragma config WDTE = OFF
  16.  
  17. void main(void)
  18. {
  19.  
  20. char s[20];
  21. unsigned int bits_recibidos;
  22. float grados, calculo;
  23. TRISD = 0x00; //Habilitamos el puerto de salida del LCD
  24. //TRANSMISOR SERIE
  25. TXSTA=0b00100010;
  26. //TXSTAbits.TXEN=1; //Bit de transmisión
  27. //TXSTAbits.BRGH=0; //Velocidad baja
  28. RCSTA=0b10010000;
  29. //RCSTAbits.SPEN=1; //Puerto serie habilitado
  30. //RCSTAbits.CREN=1; //Modo asincrono
  31. Lcd_Init(); //Habilitamos el LCD
  32. Lcd_Clear();
  33. SPBRG=207;
  34.  
  35. //CONVERTIDOR
  36. ADCON1=0b10110000;
  37. //ADCON1bits.VCFG1=1; //Bit de referencia voltaje negativo
  38. //ADCON1bits.VCFG0=1; //Bit de referencia voltaje positivo
  39. //ADCON1bits.ADFM=1; //Justificamos a la derecha
  40.  
  41. ADCON0=0b11101101;
  42. //ADCON0bits.ADON=1; //Habilitamos el ADC
  43. //ADCON0bits.CHS3=1; //Seleccionamos la pata analoga 11
  44. //ADCON0bits.CHS1=1;
  45. //ADCON0bits.CHS0=1;
  46. //ADCON0bits.ADCS0=1; //Seleccionamos el oscilador interno
  47. //ADCON0bits.ADCS1=1;
  48.  
  49.  
  50. while(1)
  51. {
  52. Lcd_Clear();
  53. __delay_us(50);
  54. ADCON0bits.GO_DONE = 1; //Iniciamos la conversion
  55. while(PIR1bits.ADIF!=1); //Bandera de la conversion del ADC
  56. while(PIR1bits.TXIF!=1); //Bandera de la transmision serie
  57. // TXREG=((ADRESH<<8)+ADRESL);
  58. bits_recibidos = ADRESH; //Union de los 10 bits
  59. bits_recibidos = bits_recibidos << 8;
  60. bits_recibidos = bits_recibidos + ADRESL;
  61. calculo = bits_recibidos;
  62. //Calculo para sacar la temperatura en grados C
  63. if(calculo>0)
  64. grados=(calculo*50)/1024;
  65. else
  66. grados=2;
  67.  
  68. //Escribe en el LCD
  69. Lcd_Set_Cursor(1,1);
  70. Lcd_Write_String ("Temperatura");
  71. sprintf(s,"%.02f",grados);
  72. Lcd_Set_Cursor(2,1);
  73. Lcd_Write_String(s);
  74.  
  75.  
  76. TXREG=ADRESH;
  77. TXREG<<=8;
  78. TXREG=TXREG + ADRESL;
  79. PIR1bits.ADIF=0;
  80.  
  81. }
  82. }
  83.  
  84. //Funciones del LCD
  85.  
  86.  
  87. void Lcd_Port(char a)
  88. {
  89. /*Al ser una configuración de 4bits
  90. es necesario hacer un tipo de multiplexaje
  91. para que los datos se desplieguen en los puertos correctos
  92. del LCD*/
  93. if(a & 1)
  94. D4 = 1;
  95. else
  96. D4 = 0;
  97.  
  98. if(a & 2)
  99. D5 = 1;
  100. else
  101. D5 = 0;
  102.  
  103. if(a & 4)
  104. D6 = 1;
  105. else
  106. D6 = 0;
  107.  
  108. if(a & 8)
  109. D7 = 1;
  110. else
  111. D7 = 0;
  112. }
  113. void Lcd_Cmd(char a)
  114. {
  115. // Toma el dato enviado para dar la orden correcta al LCD
  116. RS = 0; // => RS = 0
  117. Lcd_Port(a);
  118. EN = 1; // => E = 1
  119. __delay_ms(4);
  120. EN = 0; // => E = 0
  121. }
  122.  
  123. Lcd_Clear()
  124. {
  125. // Envia el comando de limpiar al LCD
  126. Lcd_Cmd(0);
  127. Lcd_Cmd(1);
  128. }
  129.  
  130. void Lcd_Set_Cursor(char a, char b)
  131. {
  132. char temp,z,y;
  133. if(a == 1)
  134. {
  135. // Recibe 2 numeros que son la fila y la columna a posicionar
  136. // Esos 2 datos se los envia a la funcion de comando
  137. // Al ser solamente dos filas, se hacen 2 casos y el dato de columnas se envia directamente
  138. temp = 0x80 + b - 1;
  139. z = temp>>4;
  140. y = temp & 0x0F;
  141. Lcd_Cmd(z);
  142. Lcd_Cmd(y);
  143. }
  144. else if(a == 2)
  145. {
  146. temp = 0xC0 + b - 1;
  147. z = temp>>4;
  148. y = temp & 0x0F;
  149. Lcd_Cmd(z);
  150. Lcd_Cmd(y);
  151. }
  152. }
  153.  
  154. void Lcd_Init()
  155. {
  156. Lcd_Port(0x00);
  157. __delay_ms(20);
  158. Lcd_Cmd(0x03);
  159. __delay_ms(5);
  160. Lcd_Cmd(0x03);
  161. __delay_ms(11);
  162. Lcd_Cmd(0x03);
  163. /////////////////////////////////////////////////////
  164. Lcd_Cmd(0x02);
  165. Lcd_Cmd(0x02);
  166. Lcd_Cmd(0x08);
  167. Lcd_Cmd(0x00);
  168. Lcd_Cmd(0x0C);
  169. Lcd_Cmd(0x00);
  170. Lcd_Cmd(0x06);
  171. }
  172.  
  173. void Lcd_Write_Char(char a)
  174. {
  175. char temp,y;
  176. temp = a&0x0F; // Guarda los 4 bits de la derecha de nuestro caracter
  177. y = a&0xF0; // Guarda los 4 bits de la izquierda de nuestro caracter
  178. RS = 1; // Envia RS = 1 al LCD
  179. Lcd_Port(y>>4); // Hace un recorrimiento de 4 bits y envia los datos
  180. EN = 1; // Envia EN = 1 al LCD
  181. __delay_us(40);
  182. EN = 0; // Envia EN = 0 al LCD para volver a enviar datos
  183. Lcd_Port(temp); // Envia los ultimos bits de nuestro caracter
  184. EN = 1;
  185. __delay_us(40);
  186. EN = 0;
  187. }
  188.  
  189. void Lcd_Write_String(char *a)
  190. {
  191. /*La función toma caracter por caracter
  192. de una cadena definida y la envia a la funcion
  193. caracter*/
  194. int i;
  195. for(i=0;a[i]!='\0';i++)
  196. Lcd_Write_Char(a[i]);
  197. }
  198.  
  199. void Lcd_Shift_Right()
  200. {
  201. /*Envia datos a la funcion comando
  202. para hacer un recorrimiento a la derecha*/
  203. Lcd_Cmd(0x01);
  204. Lcd_Cmd(0x0C);
  205. }
  206.  
  207. void Lcd_Shift_Left()
  208. {
  209. /*Envia datos a la funcion comando
  210. para hacer un recorrimiento a la izquierda*/
  211. Lcd_Cmd(0x01);
  212. Lcd_Cmd(0x08);
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement