Autor Tema: LCD y teclado matricial  (Leído 4577 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado komodo100

  • PIC10
  • *
  • Mensajes: 6
LCD y teclado matricial
« en: 17 de Mayo de 2009, 23:20:06 »
Hola necesito ingresar tres constantes por un teclado matricial y mostrarlas en un lcd 2x16 con un pic 18f452 ¿alguien sabe como hacerlo?

Desconectado komodo100

  • PIC10
  • *
  • Mensajes: 6
Re: LCD y teclado matricial
« Respuesta #1 en: 17 de Mayo de 2009, 23:40:25 »
#include <p18F452.h>
#include <timers.h>
#include <capture.h>
#include <delays.h>
#include <xlcd.h>
#include <adc.h>                   //libreria conversor analogico digital
//#include <stdlib.h>
#pragma config OSC = XT
#pragma config OSCS = OFF
#pragma config PWRT = ON
#pragma config BOR = OFF
#pragma config BORV = 45
#pragma config WDT = OFF
#pragma config WDTPS = 128
#pragma config CCP2MUX = ON
#pragma config STVR = OFF
#pragma config LVP = OFF

void DelayFor18TCY(void);            //funciones de retardo
void DelayPORXLCD (void);            //
void DelayXLCD (void);               //   

void main(void)
{
int band_inter=0,periodo=20,etapa=1,valor=0,fall=0,actualizacion=0,retardo=0,buffkey4=0,intensidad=17,iexterna=0,divisor=0,cont=0,band_boton=0,detecfrec=1;  //intensidad 0 es maximo y 16? es minimo
int tiempomotor=0,iinterna,intensidadref=0,puertaabierta=0,puertacerrada=0;
char pinesmotor=1;
long lcd=0,buffkey=0;                                       //declaramos las variables del programa

OpenCapture1( C1_EVERY_RISE_EDGE & CAPTURE_INT_ON );
OpenTimer3( TIMER_INT_OFF & T3_SOURCE_INT & T3_PS_1_8);               //inicializamos el timer 3
OpenTimer0( TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_2 );      //inicializa el Timer 0 (interrupcion, formato, fuente de reloj, pre-escalador)
OpenADC( ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_2ANA_2REF, ADC_CH0 & ADC_CH1 & ADC_INT_OFF );//  Configuramos el conversor analogico digital



//OpenXLCD( FOUR_BIT & LINES_5X7 );
//CloseXLCD();                                 //inicializa el LCD
 
// configuramos los puertos del pic
PORTD=1;
PORTB=0;
TRISD=0;
TRISB=0;

TRISA=0xFF;
TRISE=0;

//WriteCmdXLCD(0xc1);     para posicionar cursor segundo renglon
//WriteCmdXLCD(0x01);               //borrar lcd


//while(!PIR1bits.CCP1IF); // Wait for event

// ciclo que permite capturar el periodo de la señal recibida del detector de cruce por cero
while(detecfrec){
   if(PIR1bits.CCP1IF){         //Nos permite saber si hay un flanco en la señal recibida
      if(band_inter==0){         //condiciones   
         if (etapa==2){         //condiciones
            periodo=ReadCapture1()/61;   // capturamos el valor del periodo recibido
            detecfrec=0;
            band_inter=1;
         }
         etapa++;
      }
      if(CCP1CONbits.CCP1M0){
         CCP1CONbits.CCP1M0=0;
      }   
      else{
         CCP1CONbits.CCP1M0=1;   
      }
      PIR1bits.CCP1IF=0;
   TMR3H=0;
   TMR3L=0;
   //cont=0;
   //if(intensidad==0)
   //   PORTA=1;
   //else
   //   PORTA=0;
   }
}
OpenXLCD( FOUR_BIT & LINES_5X7 );         //se inicializa la pantalla LCD
while(BusyXLCD())  ;                  //disponibilidad de la pantalla LCD
WriteCmdXLCD(BLINK_OFF & CURSOR_OFF);                  //enviar comando al lcd      
while(BusyXLCD())  ;                              //verificar si el lcd esta ocupado
putrsXLCD("Enter");         //para enviar texto al lcd
WriteCmdXLCD(0xc1);         //Cambiamos de renglon dentro de la pantalla
putrsXLCD("SetPoint");      //Ubicamos set point en el segundo renglon
putrsXLCD("                ");   //Nos permite eliminar numeros no deseados en la pantalla
putsXLCD(ltoa(lcd));         //para enviar variables al lcd

while(1){
   

      

   tiempomotor=tiempomotor+1;
   if((tiempomotor>600 && fall!=2) ||(tiempomotor>200 && fall==2)){
   

      if(iinterna<intensidadref && iexterna>=intensidadref && PORTCbits.RC3==0){

         intensidad=17;
         pinesmotor=pinesmotor<<1;
         if(pinesmotor==16)
            pinesmotor=1;
      }
      else if((iinterna<intensidadref && iexterna<intensidadref && puertacerrada==0) ||
            iinterna>intensidadref      ){
         puertacerrada=PORTCbits.RC7;
         if(puertacerrada==1){

            if(intensidadref>1)
               if(intensidadref==10)
                  intensidad=3;
               else
                  intensidad=(190-17*intensidadref)/10;
                  
            else if(intensidadref==1)
               intensidad=16;
         
         
         }
         else{
            intensidad=17;
            pinesmotor=pinesmotor>>1;
            if(pinesmotor==0)
               pinesmotor=8;
         }
      }
      
            if(fall==2){
            WriteCmdXLCD(0xc1);            
            putrsXLCD("pocicionI:");               
            putsXLCD(itoa(valor));   //!intensidad valor            
            putrsXLCD("                      ");
            actualizacion=0;
            }
                  
      
      PORTE=pinesmotor;
      PORTBbits.RB7=pinesmotor>>3;
      tiempomotor=0;
   }
   if(band_boton==0)
      PORTD=PORTD<<1;
   if(PORTD==16)
      PORTD=1;

   
   if((PORTCbits.RC4==1 || PORTCbits.RC5==1 || PORTCbits.RC6==1 ) && band_boton==0 ){
      band_boton=1;
      if(PORTDbits.RD0==1){
         if(PORTCbits.RC4==1)
               buffkey=7+10*buffkey;//Numero 7
         else if(PORTCbits.RC5==1)
            buffkey=8+10*buffkey;//Numero 8
         else if(PORTCbits.RC6==1)
            buffkey=9+10*buffkey;//Numero 9
      }
      else if(PORTDbits.RD1==1){
         if(PORTCbits.RC4==1)
            buffkey=4+10*buffkey;//Numero 4
         else if(PORTCbits.RC5==1)
            buffkey=5+10*buffkey;//Numero 5
         else if(PORTCbits.RC6==1)
            buffkey=6+10*buffkey;//Numero 6
      }
      else if(PORTDbits.RD2==1){
         if(PORTCbits.RC4==1)
            buffkey=1+10*buffkey;//Numero 1
         else if(PORTCbits.RC5==1)
            buffkey=2+10*buffkey;//Numero 2
         else if(PORTCbits.RC6==1)
            buffkey=3+10*buffkey;//Numero 3
      }
      else if(PORTCbits.RC5==1)
         buffkey=10*buffkey;//Numero 0
      else if(PORTDbits.RD3==1){         //verificamos la pulsacion de la tecla enter
         if(PORTCbits.RC4==1){          //verificamos si se ha presionado alguna tecla
         //!   intensidad=17;      //operacion para obtener la longitud de la onda adecuada
         //!   puertacerrada=0;
         //!   intensidadref=buffkey;      //operacion para obtener la longitud de la onda adecuada
            WriteCmdXLCD(0x80);           //escribimos en el primer renglon      
            putrsXLCD("IngreseKg,Kp y L:");       //ingresamos la palabra intensidad
         //   putsXLCD(ltoa(intensidad));
            putsXLCD(ltoa(buffkey));         //a continuacion concatenamos el valor de intensidad
            putrsXLCD("                   ");      //eliminamos variables no deseadas dentro de la pantalla
            WriteCmdXLCD(0xc1);                  //pasamos al segundo renglon   
            putrsXLCD("pocicion:");               //ingresamos la palabra pocicion
            putsXLCD(itoa(valor));               // a continuacion se concatena la variable que proviene del CAD con su valor
            putrsXLCD("                             ");
            fall=2;
            buffkey=0;                         //reseteamos buffkey
         }
         //   else if(PORTCbits.RC5==1)
         //   buffkey=10*buffkey;//es
         else if(PORTCbits.RC6==1){
            WriteCmdXLCD(0xc1);
            putrsXLCD("Pocicion:");
            putsXLCD(itoa(valor)); // intencidad valor
             putrsXLCD("      ");
         }
      }

      PORTBbits.RB2=1;
   }
   else if((PORTCbits.RC4==0 && PORTCbits.RC5==0 && PORTCbits.RC6==0 ) && band_boton==1 )// si no se presiona tecla alguna
      band_boton=0;
      
   
      
   if(PIR1bits.CCP1IF){

      if(CCP1CONbits.CCP1M0){
         CCP1CONbits.CCP1M0=0;
      }   
      else{
         CCP1CONbits.CCP1M0=1;   
      }
      PIR1bits.CCP1IF=0;
      TMR3H=0;
      TMR3L=0;
      cont=0;

      TRISCbits.TRISC0=0;
      if(intensidad==0)
         PORTCbits.RC0=1;
         //   PORTA=1;
      else
         PORTCbits.RC0=0;
         //   PORTA=0;
   }
if(INTCONbits.TMR0IF){
//   /*!   
   if(intensidad==0)
      ;//   PORTCbits.RC0=0;
      else{
         cont++;
         //if que permite verificar el momento en que se va a mandar un uno al optotriac
         if(intensidad==17)      
            PORTCbits.RC0=0;
         else if(cont==intensidad*periodo/36)
            PORTCbits.RC0=1;

         //este ciclo nos da un pulso con un ancho de banda muy pequeño para proceder de manera correcta con el disparo del triac
         while(retardo!=29){      //nos da el ancho del pulso
            retardo++;
         }
         retardo=0;
         //   PORTA=0;
         PORTCbits.RC0=0;
         //para valores superiores a 15
         if(intensidad<=2)
            PORTCbits.RC0=0;
      
         INTCONbits.TMR0IF=0;
      }//!*/
   }
}

}
// RETARDOS
void DelayFor18TCY( void ){
   int ind;
      for(ind=1;ind<=18;ind++){
         Nop();
      }
}
void DelayPORXLCD (void){
   Delay1KTCYx(480);
   return;
}
void DelayXLCD (void){
   Delay1KTCYx(160);
   return;
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: LCD y teclado matricial
« Respuesta #2 en: 17 de Mayo de 2009, 23:43:42 »
 :shock: Usa el buscador, sobre esos temas hay mucha información.

Teclado Matricial

LCD
No contesto mensajes privados, las consultas en el foro

Desconectado komodo100

  • PIC10
  • *
  • Mensajes: 6
Re: LCD y teclado matricial
« Respuesta #3 en: 17 de Mayo de 2009, 23:47:32 »
bueno ese codigo de arriba es lo que he hecho hasta ahora, la idea es despues  controlar un motor paso a paso, por eso hay algunas valiares de mas, hasta ahora solo camputura el setpoint(o por lo menos eso creo), necesito capturar tres variables mas y mostrarlas en el lcd

esta es la imagen de la simulacion en isis proteus