Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _XTAL_FREQ 8000000
- /*Estas variables son para el uso del LCD, su equivalente
- a la pata de salida del PIC*/
- #define RS RD2
- #define EN RD3
- #define D4 RD4
- #define D5 RD5
- #define D6 RD6
- #define D7 RD7
- #include <xc.h>
- #include <stdio.h>
- #pragma config FOSC = INTRC_CLKOUT
- #pragma config WDTE = OFF
- void main(void)
- {
- char s[20];
- unsigned int bits_recibidos;
- float grados, calculo;
- TRISD = 0x00; //Habilitamos el puerto de salida del LCD
- //TRANSMISOR SERIE
- TXSTA=0b00100010;
- //TXSTAbits.TXEN=1; //Bit de transmisión
- //TXSTAbits.BRGH=0; //Velocidad baja
- RCSTA=0b10010000;
- //RCSTAbits.SPEN=1; //Puerto serie habilitado
- //RCSTAbits.CREN=1; //Modo asincrono
- Lcd_Init(); //Habilitamos el LCD
- Lcd_Clear();
- SPBRG=207;
- //CONVERTIDOR
- ADCON1=0b10110000;
- //ADCON1bits.VCFG1=1; //Bit de referencia voltaje negativo
- //ADCON1bits.VCFG0=1; //Bit de referencia voltaje positivo
- //ADCON1bits.ADFM=1; //Justificamos a la derecha
- ADCON0=0b11101101;
- //ADCON0bits.ADON=1; //Habilitamos el ADC
- //ADCON0bits.CHS3=1; //Seleccionamos la pata analoga 11
- //ADCON0bits.CHS1=1;
- //ADCON0bits.CHS0=1;
- //ADCON0bits.ADCS0=1; //Seleccionamos el oscilador interno
- //ADCON0bits.ADCS1=1;
- while(1)
- {
- Lcd_Clear();
- __delay_us(50);
- ADCON0bits.GO_DONE = 1; //Iniciamos la conversion
- while(PIR1bits.ADIF!=1); //Bandera de la conversion del ADC
- while(PIR1bits.TXIF!=1); //Bandera de la transmision serie
- // TXREG=((ADRESH<<8)+ADRESL);
- bits_recibidos = ADRESH; //Union de los 10 bits
- bits_recibidos = bits_recibidos << 8;
- bits_recibidos = bits_recibidos + ADRESL;
- calculo = bits_recibidos;
- //Calculo para sacar la temperatura en grados C
- if(calculo>0)
- grados=(calculo*50)/1024;
- else
- grados=2;
- //Escribe en el LCD
- Lcd_Set_Cursor(1,1);
- Lcd_Write_String ("Temperatura");
- sprintf(s,"%.02f",grados);
- Lcd_Set_Cursor(2,1);
- Lcd_Write_String(s);
- TXREG=ADRESH;
- TXREG<<=8;
- TXREG=TXREG + ADRESL;
- PIR1bits.ADIF=0;
- }
- }
- //Funciones del LCD
- void Lcd_Port(char a)
- {
- /*Al ser una configuración de 4bits
- es necesario hacer un tipo de multiplexaje
- para que los datos se desplieguen en los puertos correctos
- del LCD*/
- if(a & 1)
- D4 = 1;
- else
- D4 = 0;
- if(a & 2)
- D5 = 1;
- else
- D5 = 0;
- if(a & 4)
- D6 = 1;
- else
- D6 = 0;
- if(a & 8)
- D7 = 1;
- else
- D7 = 0;
- }
- void Lcd_Cmd(char a)
- {
- // Toma el dato enviado para dar la orden correcta al LCD
- RS = 0; // => RS = 0
- Lcd_Port(a);
- EN = 1; // => E = 1
- __delay_ms(4);
- EN = 0; // => E = 0
- }
- Lcd_Clear()
- {
- // Envia el comando de limpiar al LCD
- Lcd_Cmd(0);
- Lcd_Cmd(1);
- }
- void Lcd_Set_Cursor(char a, char b)
- {
- char temp,z,y;
- if(a == 1)
- {
- // Recibe 2 numeros que son la fila y la columna a posicionar
- // Esos 2 datos se los envia a la funcion de comando
- // Al ser solamente dos filas, se hacen 2 casos y el dato de columnas se envia directamente
- temp = 0x80 + b - 1;
- z = temp>>4;
- y = temp & 0x0F;
- Lcd_Cmd(z);
- Lcd_Cmd(y);
- }
- else if(a == 2)
- {
- temp = 0xC0 + b - 1;
- z = temp>>4;
- y = temp & 0x0F;
- Lcd_Cmd(z);
- Lcd_Cmd(y);
- }
- }
- void Lcd_Init()
- {
- Lcd_Port(0x00);
- __delay_ms(20);
- Lcd_Cmd(0x03);
- __delay_ms(5);
- Lcd_Cmd(0x03);
- __delay_ms(11);
- Lcd_Cmd(0x03);
- /////////////////////////////////////////////////////
- Lcd_Cmd(0x02);
- Lcd_Cmd(0x02);
- Lcd_Cmd(0x08);
- Lcd_Cmd(0x00);
- Lcd_Cmd(0x0C);
- Lcd_Cmd(0x00);
- Lcd_Cmd(0x06);
- }
- void Lcd_Write_Char(char a)
- {
- char temp,y;
- temp = a&0x0F; // Guarda los 4 bits de la derecha de nuestro caracter
- y = a&0xF0; // Guarda los 4 bits de la izquierda de nuestro caracter
- RS = 1; // Envia RS = 1 al LCD
- Lcd_Port(y>>4); // Hace un recorrimiento de 4 bits y envia los datos
- EN = 1; // Envia EN = 1 al LCD
- __delay_us(40);
- EN = 0; // Envia EN = 0 al LCD para volver a enviar datos
- Lcd_Port(temp); // Envia los ultimos bits de nuestro caracter
- EN = 1;
- __delay_us(40);
- EN = 0;
- }
- void Lcd_Write_String(char *a)
- {
- /*La función toma caracter por caracter
- de una cadena definida y la envia a la funcion
- caracter*/
- int i;
- for(i=0;a[i]!='\0';i++)
- Lcd_Write_Char(a[i]);
- }
- void Lcd_Shift_Right()
- {
- /*Envia datos a la funcion comando
- para hacer un recorrimiento a la derecha*/
- Lcd_Cmd(0x01);
- Lcd_Cmd(0x0C);
- }
- void Lcd_Shift_Left()
- {
- /*Envia datos a la funcion comando
- para hacer un recorrimiento a la izquierda*/
- Lcd_Cmd(0x01);
- Lcd_Cmd(0x08);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement