/* KEY.C */
#include "derivative.h" /* include peripheral declarations */
#define COL1_OFF() PTB_PTB0=1; DDRB_DDRB0 = 1
#define COL2_OFF() PTB_PTB1=1; DDRB_DDRB1 = 1
#define COL3_OFF() PTB_PTB2=1; DDRB_DDRB2 = 1
#define COL4_OFF() PTB_PTB3=1; DDRB_DDRB3 = 1
#define FILA1() !PTA_PTA0
#define FILA2() !PTA_PTA1
#define FILA3() !PTA_PTA2
#define FILA4() !PTA_PTA3
#define NRO_FILAS 4
#define NRO_COLUMNAS 4
#define Buzzer_On() PTA_PTA4=1;DDRA_DDRA4=1
#define Buzzer_Off()PTA_PTA4=0;DDRA_DDRA4=1
char teclaPress;
char ValorReal;
char keySt; //variable de estados de teclado
#define KEY_DUMMY 0
#define KEY_TST_Fi 1
#define KEY_WAIT_F 5
const char teclado[NRO_FILAS][NRO_COLUMNAS]={ //Teclado Matricial 4x4
'1','2','3','A',
'4','5','6','B',
'7','8','9','C',
'*','0','#','D',
};
const char Valortecla[NRO_FILAS][NRO_COLUMNAS]={ //Teclado Matricial 4x4
1,2,3,'A',
4,5,6,'B',
7,8,9,'C',
'*',0,'#','D',
};
typedef void (*vFuncPtrV)(void);
#define KEY_UP 'A'
#define KEY_DW 'B'
#define KEY_ENTER 'C'
#define KEY_ESC 'D'
#define ENABLE_COL_1() PTB_PTB0=0; DDRB_DDRB0 = 1 //Columnas como salidas
#define ENABLE_COL_2() PTB_PTB1=0; DDRB_DDRB1 = 1
#define ENABLE_COL_3() PTB_PTB2=0; DDRB_DDRB2 = 1
#define ENABLE_COL_4() PTB_PTB3=0; DDRB_DDRB3 = 1 // Macros y Funciones definiones de pines Filas y Columnas
#define ENABLE_FILA_1() DDRA_DDRA0=0; PTAPUE_PTAPUE0=1 //Filas como entradas
#define ENABLE_FILA_2() DDRA_DDRA1=0; PTAPUE_PTAPUE1=1
#define ENABLE_FILA_3() DDRA_DDRA2=0; PTAPUE_PTAPUE2=1
#define ENABLE_FILA_4() DDRA_DDRA3=0; PTAPUE_PTAPUE3=1
static void Col1_ON(void){
ENABLE_COL_1();
}
static void Col2_ON(void){
ENABLE_COL_2();
}
static void Col3_ON(void){
ENABLE_COL_3();
}
static void Col4_ON(void){
ENABLE_COL_4();
}
static void Enable_Filas(void){
ENABLE_FILA_1();
ENABLE_FILA_2();
ENABLE_FILA_3();
ENABLE_FILA_4();
}
const vFuncPtrV ColsPtr[NRO_COLUMNAS]={
Col1_ON,Col2_ON,Col3_ON,Col4_ON
};
static void Cols_OFF(void){
Enable_Filas();
COL1_OFF();
COL2_OFF();
COL3_OFF();
COL4_OFF();
}
static char Test_Filas(void){
if(FILA1()) return 1;
if(FILA2()) return 2;
if(FILA3()) return 3;
if(FILA4()) return 4;
return 0;
}
void Antirrebote(void){
}
void Key_Init(void){ //Funcion de Inicializacion de Teclado
keySt = KEY_TST_Fi;
}
void Key_Run(void){ // Funcion de Ejecucion de Teclado
static char nroColTst=0;
Cols_OFF();
Enable_Filas();
ColsPtr[nroColTst]();
if (Test_Filas()){
teclaPress = teclado[Test_Filas()-1][nroColTst];
Buzzer_On();
ValorReal=Valortecla[Test_Filas()-1][nroColTst];
keySt=51;
}else{
nroColTst++;
nroColTst %=NRO_COLUMNAS;
Buzzer_Off();
Cols_OFF();
keySt=50;
}
}