Autor Tema: funcion REMARCADO  (Leído 886 veces)

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

Desconectado Kamus23

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 63
funcion REMARCADO
« en: 04 de Julio de 2005, 12:41:00 »
Como puedo hacer para realizar la funcion de remarcado en codigo C para un 16f84a, aqui le mando el codigo en C de lo que ya tengo hecho y ademas en montaje en proteus.... la idea es que pueda remarcar todos los numeros marcados anteriormente...  no pude subir los archivos adjuntos asi que les pegue el codigo...

////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//rutina para generar los pulsos con el TECLADO y salen por RA0             ///
//RA1= 0 COLGADO, RA1=1 DESCOLGADO, RA2=0 MARCACION TONO, RA2=1 MARCACION PULSO/
// RA3= 0 MARCACIÓN ON, RA3=1 MARCACIÓN OFF,RA4=0 RADIAL OFF, RA4=1 RADIAL ON///
////////////////////////////////////////////////////////////////////////////////
#include <16F84A.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT
#use delay(clock=4000000)
#define use_portb_kbd TRUE
#include "kbd2.c" //las comillas es si está en la misma carpeta de .c
#use fast_io(a)
////////////////////////////////////////////////////////////////////////////////
void main() {
   char k; //k para el lcd
   int j,i,t; //i para el bucle for, t para el bucle de los bit
   //pulso=0;
   port_b_pullups(true);//activo resistencias pull-ups
   set_tris_a(0xFE);//11111110

inicio:

if (input(PIN_A1)) {  //si RA1=1 descolgado
   output_high(PIN_A0); // para q hayan los 7 voltios
///////////////////////////////////////////////////////////////////////////////
//Rutina para explorar el tecldo,
//luego genera los pulsos correspondientes, exectuando las teclas * y #
///////////////////////////////////////////////////////////////////////////////
  do { //bucle de exploracion del TECLADO
teclado:
      if (input(PIN_A1)){ //verifico si esta descolgado
         if (!input(PIN_A2)){ //si RA2=0 es marcacion de pulso
            if (!input(PIN_A3)){ // RA3=0 marcación on
      k=kbd_getc();  // devuelve la tecla y la guarda en K
         if(k!=0) {   // si k distinto de "0" ejecuta
            j++;
                 if((k!="A")&&(k!="B")){ //si k es distinto de * y #
                  t=(k)&(0x0f);  // k and 0x0f -->t para separar datos

                     if(t!=0){ //si t distinto de 0 ejecuta

loop:          for  (i=0;i<t;i++){ //rutina para enviar los pulsos

enviar_pulso:  output_low(PIN_A0); //impulso de cierre //colgado
               delay_ms(60);        //retardo de 60ms
               output_high(PIN_A0); //impulso de ruptura //descolgado
               delay_ms(40);}         //retardo de 40ms
               delay_ms(650);       //pausa interdigital de 650ms
               i=0; }
               else { t=10; //numero marcado el cero
                  goto enviar_pulso;}}
                  else goto teclado;
                  }
                                       }
                                       else
                                       goto inicio;}
                                       else
                                       goto inicio;}
                                        else
                                       goto inicio;}


  while(true);
 }

 else { output_low(PIN_A0); //regresa a la posicion colgado
 goto inicio;}
}





////////////////////////////////////////////////////////////////////////////////////////////////////////
//kbd2.c libreria del teclado que estoy usando
////////////////////////////////////////////////////////////////////////////////////////////////////////
/*-------------------------------------------*
 |  KBD2.C                                   |
 |  Autor: Pedro Mª Jiménez                  |
 |  (c) Microsystems Engineering (Bilbao)    |
*-------------------------------------------*/

// Funciones para la gestión del teclado de la Trainer PLUS.

// char kbd_getc()   Devuelve el código ASCII de la tecla pulsada.
//         Si no se pulsó ninguna, devuelve 0.


// Conexiones del teclado.
/*
            RB0 RB1 RB2 RB3
             ^   ^   ^   ^
             |   |   |   |
           |---|---|---|---|
  RB4 ---> | 1 | 2 | 3 | F |
           |---|---|---|---|
  RB5 ---> | 4 | 5 | 6 | E |
           |---|---|---|---|
  RB6 ---> | 7 | 8 | 9 | D |
           |---|---|---|---|
  RB7 ---> | A | 0 | B | C |
           |---|---|---|---|
*/

// Caracteres ASCII asociados a cada tecla:
char const KEYS[4][4] = {{"1","2","3","F"},
                         {"4","5","6","E"},
                         {"7","8","9","D"},
                         {"A","0","B","C"}};

#byte kbd_port_b = 6


char kbd_getc()
{
  char tecla=0;
  int f,c,t,i,j;

  port_b_pullups(true);
  set_tris_b(0b00001111); // RB7-RB4 salidas, RB3-RB0 entradas

  for(f=0x10, i=0; i<4; f<<=1, i++)
  {
    for(c=0x01, j=0; j<4; c<<=1, j++)
    {
      kbd_port_b = ~f;
      delay_cycles(1);
      t = kbd_port_b & 0x0F;
      t = ~(t | 0xF0);
      if(t == c)
      {
        delay_ms(20);
        tecla=KEYS[j];
        while(t==c)
        {
          restart_wdt();
          t = kbd_port_b & 0x0F;
          t = ~(t | 0xF0);
        }
        break;
      }
    }
    if(tecla)
      break;
  }

  port_b_pullups(false);
  return tecla;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////
Kamus de Acuario