Hola Amigos,
Aunque el topic es muy generico, estoy empezando ahora si seriamente con C. Y es por este motivo que decidi empezar haciendo cosas que las tengo hechas en Basic.
Lo primero fue adaptarme al manejo de los mensajes al LCD, para convertir mis valores binarios a Ascii. Felizmente esto ya lo solucione con printf(lcd_getc...).
Ahora estaba adaptando el driver de teclado 74c922, hecho con un PIC16F628A. Y pese a que me parecen que ambos codigos tanto en C, como en Basic hacen lo mismo. No se porque el de Basic si puedo simularlo en Proteus y el de C NOooo
Les coloco los codigos, y avisenme si me equivoco:
//archivo key4x4.c
#include <16F628A.h>
#FUSES NOWDT, INTRC_IO, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD
//CONFIG INTRC_OSC_NOCLKOUT , WDT_OFF , PWRTE_OFF , BODEN_OFF , LVP_OFF , PWRTE_OFF , CP_OFF
#use delay(clock=4000000)
#define use_portb_kbd 1
#define tecla 5
#include <teclado4.h>
void main()
{
set_tris_a(0b10000000);
set_tris_b(0b11110000);
#asm
; BSF STATUS,RP0
bsf 3,5
; clrf OPTION
clrf 1
; bcf status,rp0
bcf 3,5
#endasm
port_b_pullups(true);
// setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
// TODO: USER CODE!!
*tecla=0;
do{
while(input_state(PIN_A4)==0){
kbd_getc();}
while(input_state(PIN_A7)==1){
#asm
nop
#endasm
}
*tecla=0;
}while(true);
}
//teclado4.h
#define portb 6
#define L1 0b00000111
#define L2 0b00001011
#define L3 0b00001101
#define L4 0b00001110
void kbd_getc()
{
char temp;
*portb=L1;
temp=portb;
temp=temp&0xF0;
switch (temp){
case 0b11100000:*tecla=0x10;
break;
case 0b11010000:*tecla=0x11;
break;
case 0b10110000:*tecla=0x12;
break;
case 0b01110000:*tecla=0x13;
break;}
*portb=L2;
temp=portb;
temp=temp&0xF0;
switch (temp){
case 0b11100000:*tecla=0x14;
break;
case 0b11010000:*tecla=0x15;
break;
case 0b10110000:*tecla=0x16;
break;
case 0b01110000:*tecla=0x17;
break;}
*portb=L3;
temp=portb;
temp=temp&0xF0;
switch (temp){
case 0b11100000:*tecla=0x18;
break;
case 0b11010000:*tecla=0x19;
break;
case 0b10110000:*tecla=0x1A;
break;
case 0b01110000:*tecla=0x1B;
break;}
*portb=L4;
temp=portb;
temp=temp&0xF0;
switch (temp){
case 0b11100000:*tecla=0x1C;
break;
case 0b11010000:*tecla=0x1D;
break;
case 0b10110000:*tecla=0x1E;
break;
case 0b01110000:*tecla=0x1F;
break;}
*portb=0x0f;
return;
}
Ahora su equivalente Basic:
'****************************************************************
'* Name : key4x4.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2006 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 22/09/2006 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
'
' ___ ___ ___ ___
' | | | | |
' |_7_|_8_|_9_|_C_|
' | | | | |
' |_4_|_5_|_6_|_D_|
' | | | | |
' |_1_|_2_|_3_|_E_|
' | | | | |
' |_A_|_0_|_B_|_F_|
'
'
DEVICE 16F628A
CONFIG INTRC_OSC_NOCLKOUT , WDT_OFF , PWRTE_OFF , BODEN_OFF , LVP_OFF , PWRTE_OFF , CP_OFF
DECLARE XTAL 4
ON_HARDWARE_INTERRUPT GOTO TECLADO
'DEFINE OSC 4
'Manejo Teclado
DIM L4 As %00000111
DIM L3 As %00001011
DIM L2 As %00001101
DIM L1 As %00001110
DIM I As BYTE
Dim Temporal As BYTE
Dim Ultima_Tecla As Byte
'Dim FLAG As BYTE
Dim dato As byte
Dim Tecla As porta
DIM FLAG aS porta.4
dIM EXT AS PORTA.7
GOTO INICIO
TECLADO:
PORTB = L1
SELECT CASE PORTB & $F0
CASE %11100000
TECLA=$17
CASE %11010000
TECLA=$18
CASE %10110000
TECLA=$19
CASE %01110000
TECLA=$1C
END SELECT
PORTB = L2 'Lin 120
SELECT CASE PORTB & $F0
CASE %11100000
TECLA=$14
CASE %11010000
TECLA=$15
CASE %10110000
TECLA=$16
CASE %01110000
TECLA=$1D
END SELECT
PORTB = L3
SELECT CASE PORTB & $F0
CASE %11100000
TECLA=$11
CASE %11010000
TECLA=$12
CASE %10110000
TECLA=$13
CASE %01110000
TECLA=$1E
END SELECT
PORTB = L4
SELECT CASE PORTB & $F0
CASE %11100000
TECLA=$1A
CASE %11010000
TECLA=$10
CASE %10110000
TECLA=$1B
CASE %01110000
TECLA=$1F
END SELECT
PORTB =$0F
return
INICIO:
CMCON=7
VRCON=0
TRISB = %11110000
TRISA = %10000000
OPTION_REG=%00000000 'Activamos Pull-up
FLAG=0
clrf PORTA
PORTB =$0F
INTCON= %10001000
REPITE:
gosub teclado
if tecla.4=0 then repite
while Ext==0
nop
wend
TECLA=0
GOTO REPITE
RETURN
END
Adjunto el archivo de proteus 6.9SP5 y los archivos generados por cada uno. Por diversos motivos, no he podido implementarlo todavia. Pero no habia tenido antes un problema con la simulacion de un teclado.
Saludos,
Yoel
PD: Como no me deja adjuntar, aca el enlace
http://proyectosfie.com/amigotes/teclado.rar