Projet

Général

Profil

// subroutines for control the matriced keyboard

#ifdef M32C87
#include "sfr32c87.h"
#endif

#ifdef M32C83
#include "sfr32c83.h"
#endif

#include <itron.h>
#include <kernel.h>
#include <kernel_api.h>
#include "kernel_id.h"

#ifdef M32C87
void clavier_init(int int_level)
{
pd10= 0x0F; // bit7 to bit4 input bit3 to bit0 output for port 10
p10= 0xF0;
pu31 = 1; // pull up enable for pins P10_7 to P10_4
kupic = int_level; // set key interrupt level
}

unsigned char clavier_scan(void)
{
unsigned char touche;
static unsigned char ltouche;
const unsigned char t_scan[4]={~(1<<0),~(1<<1),~(1<<2),~(1<<3)};
static int col=0;
p10=t_scan[col++];
col&=0x03;
touche = p10; // lecture code binaire clavier
switch(touche) //determine et affiche numero touche appuyee
{
case 0xBE:
touche = '1';
break;
case 0xDE:
touche = '2';
break;
case 0x7E:
touche = '3';
break;
case 0xBD:
touche = '4';
break;
case 0xDD:
touche = '5';
break;
case 0x7D:
touche = '6';
break;
case 0xEB:
touche = '7';
break;
case 0xDB:
touche = '8';
break;
case 0x7B:
touche = '9';
break;
case 0xE7:
touche = '*';
break;
case 0xD7:
touche = '0';
break;
case 0x77:
touche = '#';
break;
default : touche = 0;
break;
}
return( touche );
}

int touche_filter(void)
{
SYSTIM time;
static SYSTIM ltime;
SYSTIM dtime;

iget_tim(&time);
dtime.utime=time.utime-ltime.utime;
if (time.ltime<ltime.ltime)
dtime.utime--;
dtime.ltime=time.ltime-ltime.ltime;
ltime.utime=time.utime;
ltime.ltime=time.ltime;
if (dtime.utime>0)
return 1;
else if (dtime.ltime>100)
return 1;
return 0;
}

void itouche(void )
{
char t;
if (t=clavier_scan()){
if (touche_filter())
vipsnd_dtq(QdmTouche,t);
}
p10=0xF0;
}

#endif

#ifdef M32C83

// Clavier M32C83 Carte Lp

void clavier_init(int level)
{
pd4 &= 0x0F; //p44->P47 inputs p40 -> p44 outputs
pd5 = 0xFF; //port 5 outputs
p5 = 0xFD;
}



unsigned char clavier_scan(void)
{
unsigned int code;
unsigned int row;
unsigned int colum;
static unsigned char table[] = {0x7F,0xBF,0xEF,0xF7,0xFB,0xFD};
static int i=0;

p5 = colum = table[i];
i++;
if(i==6) i=0;

row = p4 & 0xF0;
code = (colum << 8) | row;

switch(code)
{
case(0x7F70) : return('/');
break;
case(0xBF70) : return('*');
break;
case(0xEF70) : return('F');
break;
case(0xF770) : return('E');
break;
case(0xFB70) : return('D');
break;
case(0xFD70) : return('C');
break;
case(0x7FB0) : return('X');
break;
case(0xBFB0) : return('#');
break;
case(0xEFB0) : return('B');
break;
case(0xF7B0) : return('A');
break;
case(0xFBB0) : return('9');
break;
case(0xFDB0) : return('8');
break;
case(0x7FD0) : return('-');
break;
case(0xBFD0) : return('.');
break;
case(0xEFD0) : return('7');
break;
case(0xF7D0) : return('6');
break;
case(0xFBD0) : return('5');
break;
case(0xFDD0) : return('4');
break;
case(0x7FE0) : return('+');
break;
case(0xBFE0) : return('=');
break;
case(0xEFE0) : return('3');
break;
case(0xF7E0) : return('2');
break;
case(0xFBE0) : return('1');
break;
case(0xFDE0) : return('0');
break;
default : return(0); // Si aucune touche renvoi 0 plus facile a tester
break;
}
}

void itouche(void) // Dummy fonction compatibility with Polytech Card
{}

#endif
(27-27/46)