domingo, 4 de diciembre de 2011

LCD Gráfico



La práctica consiste en mostrar en el LCD gráfico una tensión analógica de 5v de pico, con algún dibujo. En mi caso una simulación de osciloscopio con un dibujo animado, al llegar a 5v agita los brazos.


Características:

Para controlar el LCD gráfico nos ayudamos de las librerías del CCsC (HDM64GS12.c y GRAPHICS.C). Contiene funciones para colorear un pixel, dibujar circulos, rectas y cuadrados, e introducir texto.


Diseño del esquemático:

- Utilizaremos el microcontrolador PIC18F4550, con un reloj de 20Mz y un pulsador con circuito R-C a modo de reset:


- Un LCD gráfico 128x64 con el controlador KS0108. Le colocaremos una resistencia variable para modificar el contraste, y un condesandor de desacoplo:


- La entrada analógica de 5 voltios la obtenemos con una resistencia variable de 5K:



Código:

////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Daniel de Cos                                       Noviembre/2011    //
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:    conversor_LCDgrafico                  VERSIÓN:    1.0
//   DISPOSITIVO: PIC 18F4550                           COMPILADOR:    CCS vs4.023
//   Entorno IDE: MPLAB ID v8.56                        SIMULADOR:    Proteus 7.7 sp2
//   TARJETA DE APLICACIÓN:  SISTEMA_2011               DEBUGGER:   ICD3
////////////////////////////////////////////////////////////////////////////////////
//                                                                                //
////////////////////////////////////////////////////////////////////////////////////
//           Mostrar una tensión entre 0 y 5 voltios en el LCD gráfico            //
////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

#include <C:\H\18F4550.h>
#device adc=10
//#FUSES INTHS    //reloj interno     
#FUSES HS     //reloj de alta velocidad
#FUSES MCLR    //Master clear pin enable
#use delay(clock=20000000)  //20MHz
//use delay(internal= 1Mhz)  //velocidad del oscilador interno
#include <HDM64GS12.c>
#include <GRAPHICS.C>
#include <math.h>

////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

char analo[10];             //Array donde se introduce la conversión AD
char text1[]="Daniel de Cos Perez";
char text2[]="Voltios=";
char text3[]="5";
char text4[]="0";

////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

  

////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void main()
{
            const long int escala= 1023;        //el fondo de escala depende de los bits del conversor
            const float v_max= 5.0;             //Tensión máxima introducida
            float voltaje;
            long int valor;       //si utilizamos el conversor de 10 bits, la variable tendra que ser de 16 bits
           
            //confiduracion de CAD:
            setup_adc(ADC_CLOCK_DIV_32);        //seleccionamos el reloj de conversión
            setup_adc_ports(AN0);         //configurar el conversor
            set_adc_channel(0);              //selecciona el canal
  
            //Texto:
            glcd_init(on);
            glcd_text57(0, 0, text1, 1, on);
            glcd_text57(0, 57, text2, 1, on);
           
            //Grafica:
            glcd_text57(0, 10, text3, 1, on);
            glcd_text57(0, 47, text4, 1, on);
            glcd_line(6, 17, 6, 50, on);
            glcd_line(6, 50, 80, 50, on);
           
            //Monigote:
            glcd_circle(107, 21, 5, no, on);         //cabeza
            glcd_pixel(105, 20, on);                    //ojos
            glcd_pixel(109, 20, on);
            glcd_pixel(107, 22, on);                     //nariz
            glcd_line(106, 24, 108, 24, on);          //boca
            glcd_pixel(105, 23, on);
            glcd_pixel(109, 23, on);
            glcd_line(107, 26, 107, 45, on);        //cuerpo
            glcd_line(107, 45, 100, 55, on);         //patas
            glcd_line(107, 45, 114, 55, on);
           
            //mano abajo
            //glcd_line(107, 31, 100, 38, on);
            //glcd_line(107, 31, 114, 38, on);
           
            //mano arriba
            //glcd_line(107, 31, 100, 24, on);
            //glcd_line(107, 31, 114, 24, on);
           
            //Vamos cambiando la línea de la gráfica y el valor de la conversión con cada cambio:
            //sprintf(char,"%f", float);         //variable tipo char, %f, variable tipo float
            for(;;){
            valor= read_adc();               //leemos la entrada analógica
            voltaje= (valor* v_max)/ escala;
                        if(voltaje!= 5.0){
                                   //mano abajo
                                   glcd_line(107, 31, 100, 38, on);
                                   glcd_line(107, 31, 114, 38, on);
                        }         
            if(voltaje== 0.0){
                        sprintf(analo,"%1.3f", voltaje);          //variable tipo char; muestra; variable tipo float
                        glcd_text57(50, 57, analo, 1, on);  //mostrar tension
                        glcd_line(7, 49, 80, 49, on);       //linea gráfica
                        delay_us(1000);                                                        
                        glcd_text57(50, 57, analo, 1, off); //borrar tensión
                        glcd_line(7, 49, 80, 49, off);              //borrar línea de la gráfica
                        }
            if((voltaje<= 0.5) & (voltaje> 0.0)){
                        sprintf(analo,"%1.3f", voltaje);
                        glcd_text57(50, 57, analo, 1, on);
                        glcd_line(7, 47, 80, 47, on);
                        delay_us(1000);
                        glcd_text57(50, 57, analo, 1, off);
                        glcd_line(7, 47, 80, 47, off);
                        }
            if((voltaje<= 1.0) & (voltaje> 0.5)){
                        sprintf(analo,"%1.3f", voltaje);
                        glcd_text57(50, 57, analo, 1, on);
                        glcd_line(7, 44, 80, 44, on);
                        delay_us(1000);
                        glcd_text57(50, 57, analo, 1, off);
                        glcd_line(7, 44, 80, 44, off);
                        }
            if((voltaje<= 1.5) & (voltaje> 1.0)){
                        sprintf(analo,"%1.3f", voltaje);
                        glcd_text57(50, 57, analo, 1, on);
                        glcd_line(7, 41, 80, 41, on);
                        delay_us(1000);
                        glcd_text57(50, 57, analo, 1, off);
                        glcd_line(7, 41, 80, 41, off);
                        }         
            if((voltaje<= 2.0) & (voltaje> 1.5)){
                        sprintf(analo,"%1.3f", voltaje);
                        glcd_text57(50, 57, analo, 1, on);
                        glcd_line(7, 38, 80, 38, on);
                        delay_us(1000);
                        glcd_text57(50, 57, analo, 1, off);
                        glcd_line(7, 38, 80, 38, off);
                        }
            if((voltaje<= 2.5) & (voltaje> 2.0)){
                        sprintf(analo,"%1.3f", voltaje);
                        glcd_text57(50, 57, analo, 1, on);
                        glcd_line(7, 35, 80, 35, on);
                        delay_us(1000);
                        glcd_text57(50, 57, analo, 1, off);
                        glcd_line(7, 35, 80, 35, off);
                        }
            if((voltaje<= 3.0) & (voltaje> 2.5)){
                        sprintf(analo,"%1.3f", voltaje);
                        glcd_text57(50, 57, analo, 1, on);
                        glcd_line(7, 32, 80, 32, on);
                        delay_us(1000);
                        glcd_text57(50, 57, analo, 1, off);
                        glcd_line(7, 32, 80, 32, off);
                        }
            if((voltaje<= 3.5) & (voltaje> 3.0)){
                        sprintf(analo,"%1.3f", voltaje);
                        glcd_text57(50, 57, analo, 1, on);
                        glcd_line(7, 29, 80, 29, on);
                        delay_us(1000);
                        glcd_text57(50, 57, analo, 1, off);
                        glcd_line(7, 29, 80, 29, off);
                        }
            if((voltaje<= 4.0) & (voltaje> 3.5)){
                        sprintf(analo,"%1.3f", voltaje);
                        glcd_text57(50, 57, analo, 1, on);
                        glcd_line(7, 26, 80, 26, on);
                        delay_us(1000);
                        glcd_text57(50, 57, analo, 1, off);
                        glcd_line(7, 26, 80, 26, off);
                        }
            if((voltaje<= 4.5) & (voltaje> 4.0)){
                        sprintf(analo,"%1.3f", voltaje);
                        glcd_text57(50, 57, analo, 1, on);
                        glcd_line(7, 23, 80, 23, on);
                        delay_us(1000);
                        glcd_text57(50, 57, analo, 1, off);
                        glcd_line(7, 23, 80, 23, off);
                        }
            if((voltaje<= 4.9) & (voltaje> 4.5)){
                        sprintf(analo,"%1.3f", voltaje);
                        glcd_text57(50, 57, analo, 1, on);
                        glcd_line(7, 20, 80, 20, on);
                        delay_us(1000);
                        glcd_text57(50, 57, analo, 1, off);
                        glcd_line(7, 20, 80, 20, off);
                        }
           
                //Al llegar a 4.9v agita las manos arriba y abajo   
                        if(voltaje> 4.9){
                        sprintf(analo,"%1.3f", voltaje);
                        glcd_text57(50, 57, analo, 1, on);
                        glcd_line(7, 18, 80, 18, on);
                                                                       
                        //mano abajo
                                   glcd_line(107, 31, 100, 38, on);
                                   glcd_line(107, 31, 114, 38, on);
                                                                      
                        delay_us(1000);
                       
                                   glcd_line(107, 31, 100, 38, off);
                                   glcd_line(107, 31, 114, 38, off);                  
                                  
                                   //mano arriba
                                   glcd_line(107, 31, 100, 24, on);
                                   glcd_line(107, 31, 115, 24, on);
                                  
                                   delay_us(1000);
                                    
                                   glcd_line(107, 31, 100, 24, off);
                                   glcd_line(107, 31, 115, 24, off);
                                  
                        glcd_text57(50, 57, analo, 1, off);
                        glcd_line(7, 18, 80, 18, off);
                        }
            }                     
}


Simulación:



Comprobación programa:

No hay comentarios:

Publicar un comentario