Como activo las resistencias pull up en mikroc?

Hola a todos! estoy trabajando con un teclado en mikroc, pero tengo un problema y es que no se como activar las resistencias pull up. Antes lo hice en mplab con el registro option_reg, pero en mikroc al parecer hay otra forma de activarlo y no la encuentro.

Una solucion que encontre fue la de poner las resistencias externamente solo a los pines de entrada (puerto B) y utilice como salida el puerto D, pero solo funciona para un tecla porque despues empieza a oscilar el puerto D y no se porque pasa esto.

Agradecería mucho su ayuda. ...
 
Hola..
Que PIC es?
Pero no hay tal cosa como en CCS... no te compliques, al fin y al cabo el resultado es el mismo. Mejor intenta con lo conocido.

OPTION_REG.7 = 0;
OPTION_REG.RPBU = 0;
RBPU = 0;
OPTION_REG = 0b01111111;
OPTION_REG.B7 = 0;
etc...

Por cierto, que trabajo está haciendo para que el PORTD oscile?... sube el código.

Saludos.
 
Hola..
Que PIC es?
Pero no hay tal cosa como en CCS... no te compliques, al fin y al cabo el resultado es el mismo. Mejor intenta con lo conocido.

Código:
OPTION_REG.7 = 0;
OPTION_REG.RPBU = 0;
RBPU = 0;
OPTION_REG = 0b01111111;
OPTION_REG.B7 = 0;
etc...

Por cierto, que trabajo está haciendo para que el PORTD oscile?... sube el código.

Saludos.

Solo estoy probando que funcione el teclado.
Cuando me salga esto ya lo juntaré con un lcd o usaré comunicación serial.
Aquí dejo mi código a ver si me puede ayudar.

Código:
////CODIGO
MCU_init(){
  TRISB = 0x0F;
  PORTD = 0X00;
  TRISD = 0X00;
}


void lectura_teclado(){
        PORTB = 0b11101111;
        if(RB0_bit==0){
                PORTD=7;
                Delay_ms(50);
                PORTD=0;
                /*Lcd_Chr(1,1,'7');
                while(RB0_bit);*/
        }
        else{
                if(RB1_bit==0){
                PORTD=4;
                Delay_ms(50);
                PORTD=0;
                /*Lcd_Chr(1,1,'4');
                while(RB1_bit);*/
                }
                else{
                        if(RB2_bit==0){
                        PORTD=1;
                        Delay_ms(50);
                        PORTD=0;
                        /*Lcd_Chr(1,1,'1');
                        while(RB2_bit);*/
                        }
                        else{
                        if(RB3_bit==0){
                        PORTD=15;
                        Delay_ms(50);
                        PORTD=0;
                        /*Lcd_Out(1,1,"15");
                        while(RB3_bit);*/
                        }
                        }
                }
        }

        PORTB = 0b11011111;
        if(RB0_bit==0){
                PORTD=8;
                Delay_ms(50);
                PORTD=0;
                /*Lcd_Chr(1,1,'8');
                while(RB0_bit);*/
        }
        else{
                if(RB1_bit==0){
                PORTD=5;
                Delay_ms(50);
                PORTD=0;
                /*Lcd_Chr(1,1,'5');
                while(RB1_bit);*/
                }
                else{
                        if(RB2_bit==0){
                        PORTD=2;
                        Delay_ms(50);
                        PORTD=0;
                        /*Lcd_Chr(1,1,'2');
                        while(RB2_bit);*/
                        }
                        else{
                        if(RB3_bit==0){
                        PORTD=0;
                        Delay_ms(50);
                        PORTD=0;
                        /*Lcd_Chr(1,1,'0');
                        while(RB3_bit);*/
                        }
                        }
                }
        }

        PORTB = 0b10111111;
        if(RB0_bit==0){
                PORTD=9;
                Delay_ms(50);
                PORTD=0;
                /*Lcd_Chr(1,1,'9');
                while(RB0_bit);*/
        }
        else{
                if(RB1_bit==0){
                PORTD=6;
                Delay_ms(50);
                PORTD=0;
                /*Lcd_Chr(1,1,'6');
                while(RB1_bit);*/
                }
                else{
                        if(RB2_bit==0){
                        PORTD=3;
                        Delay_ms(50);
                        PORTD=0;
                        /*Lcd_Chr(1,1,'3');
                        while(RB2_bit);*/
                        }
                        else{
                        if(RB3_bit==0){
                        PORTD=14;
                        Delay_ms(50);
                        PORTD=0;
                        /*Lcd_Chr(1,1,'-');
                        while(RB1_bit);*/
                        }
                        }
                }
        }

        PORTB = 0b01111111;
        if(RB0_bit==0){
                PORTD=10;
                Delay_ms(50);
                PORTD=0;
                /*Lcd_Chr(1,1,'/');
                while(RB0_bit);*/
        }
        else{
                if(RB1_bit==0){
                PORTD=11;
                Delay_ms(50);
                PORTD=0;
                /*Lcd_Chr(1,1,'x');
                while(RB1_bit);*/
                }
                else{
                        if(RB2_bit==0){
                        PORTD=13;
                        Delay_ms(50);
                        PORTD=0;
                        /*Lcd_Chr(1,1,'+');
                        while(RB1_bit);*/
                        }
                        else{
                        if(RB3_bit==0){
                        PORTD=14;
                        Delay_ms(50);
                        PORTD=0;
                        /*Lcd_Chr(1,1,'.');
                        while(RB1_bit);*/
                        }
                        }
                }
        }

}


void main() {
 MCU_init();
 while(1){
   lectura_teclado();
   }
}
//////////////7
 
Última edición por un moderador:
Hola.
Supongo que el PIC es de los normales 16F...
Oscila/parpadea si mantienes precionado una tacla? según el código eso mismo tiene que pasar porque no hay nada que espere a que suelten la tecla.
Si activas los comentarios con while(RB0_bit);, éste debería de ser al revez, es decir que se mantiene en el While si RB0 = 0 y cuando sea 1 es porque han soltado la tecla.

Haz visto las librerias? MikroC tiene para leer teclados matriciales, solo configuras el puerto.
 
Hola.
Supongo que el PIC es de los normales 16F...
Oscila/parpadea si mantienes precionado una tacla? según el código eso mismo tiene que pasar porque no hay nada que espere a que suelten la tecla.
Si activas los comentarios con while(RB0_bit);, éste debería de ser al revez, es decir que se mantiene en el While si RB0 = 0 y cuando sea 1 es porque han soltado la tecla.

Haz visto las librerias? MikroC tiene para leer teclados matriciales, solo configuras el puerto.

si me olvide de decirte el pic, es el 16f877a, si trate de hacerlo con la libreria de mikroc pero me salia un error asi que quise hacer la libreria y me base en la que tenia de mplab. Probe con el while, pero tampoco funciona bien. En mplab usaba el while recien con un lcd, pero para reconocer las teclas solo lo hacia de esa manera. Por cierto, en mi opinion esta bien que oscilen 4 pines del puerto B pero el puerto D, que esta como salida, no tendria por que oscilar.
 
Prueba esto:
Falta ordenar las teclas...

Código:
unsigned char a, b;
unsigned char key[4][4]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};

void main() {
   TRISB = 0x0F;
   PORTB = 0xFF;
   OPTION_REG.B7 = 0;
   TRISD = 0;
   PORTD = 0;
   
   while(1){
      a = 0b11101111;

      for(b=0 ; b<4 ; b++){
         PORTB = a;
         Delay_1ms();
         
         if(!PORTB.B0){
            PORTD = key[b][0];
         }
         else if(!PORTB.B1){
            PORTD = key[b][1];
         }
         else if(!PORTB.B2){
            PORTD = key[b][2];
         }
         else if(!PORTB.B3){
            PORTD = key[b][3];
         }
         
         a = a << 1;
      }
   }
}

No he usado tanto IF anidado...
Sobre el while, me referia a estar negado como while(!RB1_bit);, como se supone que con un cero indica tecla presionada, debe de esperar a que vuelva a 1, tecla soltada...
Saludos.
 
Gracias ByAxel!! la parte de tu código en que activas las pull ups con option reg era lo que necesitaba..también voy a usar el while para acoplarlo al lcd. Me sirvió de mucho tu ayuda.
 
Atrás
Arriba