Buenas compañeros del foro de electronica, vengo con una duda.
En estos momentos me encuentro trabajando con el pic 18f4550 para manejar un teclado 5x6, estoy haciendo una calculadora cientifica con las funciones basicas, suma, resta y deseo añadir funciones trigonometricas, exponencial, hiperbolicas, entre otros, dependiendo del boton que se presione en el teclado se hace la operacion. Pero bueno el problema no es eso, mas que nada diseñe el siguiente codigo solamente para ver en un lcd la tecla que presiono, para despues si enfocarme en la calculadora.
Coloque las columnas en el puerto D, y las filas en el C, el codigo proviene de la modificacion del archivo kdb.c, El problema es este, no se si la cuestion es que no se puede separa el teclado en dos puertos, si no defini bien cual son las entradas o salidas, o si hay una mala conexion en el diagrama de proteus, este es el programa :
Aca añado la imagen en proteus, coloque las resistencias de pull up, y probe cambiando entre vcc y tierra, por si era la forma de conectar, pero no funciono, me parece que el problema esta en el codigo, cualquier sugerencia es bien recibida, gracias de antemano.
En estos momentos me encuentro trabajando con el pic 18f4550 para manejar un teclado 5x6, estoy haciendo una calculadora cientifica con las funciones basicas, suma, resta y deseo añadir funciones trigonometricas, exponencial, hiperbolicas, entre otros, dependiendo del boton que se presione en el teclado se hace la operacion. Pero bueno el problema no es eso, mas que nada diseñe el siguiente codigo solamente para ver en un lcd la tecla que presiono, para despues si enfocarme en la calculadora.
Coloque las columnas en el puerto D, y las filas en el C, el codigo proviene de la modificacion del archivo kdb.c, El problema es este, no se si la cuestion es que no se puede separa el teclado en dos puertos, si no defini bien cual son las entradas o salidas, o si hay una mala conexion en el diagrama de proteus, este es el programa :
Código:
////////////////// The following defines the keypad layout on port D
#include <18F4550.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,NOLVP
#include <math.h>
#include <lcd.c>
#define use_portd_kbd TRUE
// Make sure the port used has pull-up resistors (or the LCD) on
// the column pins
#if defined(__PCH__)
#if defined use_portd_kbd
#byte kbd_rows = 0xF82 // Port C
#byte kbd_cols = 0xF83 // Port D
#endif
#else
#byte kbd_rows = 7 // Port C
#byte kbd_cols = 8 // Port D
#endif
#define set_tris_kbd_rows(x) set_tris_c(x)
#define set_tris_kbd_cols(x) set_tris_d(x)
#define Bitmask(x) (1 << (x & 7))
// These statements define the connections between the keypad
// pins and the PIC pins. For example, the column 0 pin on the
// keypad connector goes to pin D0 on the PIC. If you change
// the wiring on your board, then you must also change the
// definitions below to match your board. I have used the
// Bitmask() macro in the following statements because I think
// it makes the connections easier to understand, compared to
// the way CCS does it in their driver.
#define COL0 Bitmask(PIN_D0)
#define COL1 Bitmask(PIN_D1)
#define COL2 Bitmask(PIN_D2)
#define COL3 Bitmask(PIN_D3)
#define COL4 Bitmask(PIN_D4)
#define COL5 Bitmask(PIN_D5)
#define ROW0 Bitmask(PIN_C0)
#define ROW1 Bitmask(PIN_C1)
#define ROW2 Bitmask(PIN_C2)
#define ROW3 Bitmask(PIN_C3)
#define ROW4 Bitmask(PIN_C4)
#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3|ROW4)
#define ALL_COLS (COL0|COL1|COL2|COL3|COL4|COL5)
// Keypad layout:
char const KEYS[5][6] = {{'1','2','3','A','F','J'},
{'4','5','6','B','G','K'},
{'7','8','9','D','H','L'},
{'C','0','=','E','I','M'}
{'N','O','P','Q','R','S'}};
#define KBD_DEBOUNCE_FACTOR 5 // Set this number to apx n/333 where
// n is the number of times you expect
// to call kbd_getc each second
void kbd_init() {
}
char kbd_getc( ) {
static byte kbd_call_count;
static short int kbd_down;
static char last_key;
static byte col;
byte kchar;
byte row;
kchar='\0';
if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
switch (col) {
case 0 : set_tris_kbd_cols(ALL_COLS&~COL0);
kbd_cols=~COL0&ALL_COLS;
break;
case 1 : set_tris_kbd_cols(ALL_COLS&~COL1);
kbd_cols=~COL1&ALL_COLS;
break;
case 2 : set_tris_kbd_cols(ALL_COLS&~COL2);
kbd_cols=~COL2&ALL_COLS;
break;
case 3 : set_tris_kbd_cols(ALL_COLS&~COL3);
kbd_cols=~COL3&ALL_COLS;
break;
case 4 : set_tris_kbd_cols(ALL_COLS&~COL4);
kbd_cols=~COL4&ALL_COLS;
break;
case 5 : set_tris_kbd_cols(ALL_COLS&~COL5);
kbd_cols=~COL5&ALL_COLS;
break;
}
if(kbd_down) {
if((kbd_cols & (ALL_ROWS))==(ALL_ROWS)) {
kbd_down=false;
kchar=last_key;
last_key='\0';
}
} else {
if((kbd_cols & (ALL_ROWS))!=(ALL_ROWS)) {
if((kbd_cols & ROW0)==0)
row=0;
else if((kbd_cols & ROW1)==0)
row=1;
else if((kbd_cols & ROW2)==0)
row=2;
else if((kbd_cols & ROW3)==0)
row=3;
else if((kbd_cols & ROW4)==0)
row=4;
last_key =KEYS[row][col];
kbd_down = true;
} else {
++col;
if(col==6)
col=0;
}
}
kbd_call_count=0;
}
set_tris_kbd_rows(ALL_ROWS);
set_tris_kbd_cols(ALL_COLS);
return(kchar);
}
void main()
{
char k;
kbd_init(); // initialize keypad
delay_ms(200);
while(1)
{
k = kbd_getc(); // scan for key press
delay_ms(200);
lcd_init();
// Lcd_gotoxy (4,1);
lcd_putc(k);
}
Aca añado la imagen en proteus, coloque las resistencias de pull up, y probe cambiando entre vcc y tierra, por si era la forma de conectar, pero no funciono, me parece que el problema esta en el codigo, cualquier sugerencia es bien recibida, gracias de antemano.