// Configuation
// Port B 0 - 3 - LED Port 4 - 7
// Port D 4 - 7 - LED Port 0 - 3
// PORT C 0 - 3 - Keypad Row 1 - 4
// Port C 4 - 5 - Keypad Col 2 - 3
// Port C 2 -3 - Keypad Col 0 - 1
// Keypad configuation
// 1 - 1; 2 - 2; 3 - 3
void init_port(void);
void outport(char);
void delay1(int);
char inport(void);
char scan_keypad(void);
void outportc(char);
void setup() {
char x;
outport(0);
init_port();
x = scan_keypad();
while(1)
{
while(x == 0)
{
x = scan_keypad();
delay1(1);
}
outport(x);
x = 0;
}
}
;
char scan_keypad()
{
int i,row,col,column;
char j,k,rdata;
for(row =0; row<4; row++)
{
outportc(~(1<<row));
for(col=0; col<4; col++)
{
column = inport();
if(column != 0x0)
{
delay1(1);
for(col=0; col<4; col++)
{
if(column == (1 << col))
{
rdata = row * 4 + col + 1;
delay1(1);
return(rdata);
}
}
}
}
}
return(0);
}
void init_port()
{
char *portb_dir = (char *)0x24;
char *portc_dir = (char *)0x27;
char *portd_dir = (char *)0x2A;
*portb_dir = 0x0F;
*portd_dir = 0xF0;
*portc_dir = 0x0F;
}
void outport( char out_data)
{
char *portb_data = (char *)0x25;
char *portd_data = (char *)0x2B;
*portb_data = out_data >> 4;
*portd_data = out_data << 4;
}
void outportc( char out_data)
{
char *portc_data = (char *)0x28;
*portc_data = out_data;
}
void delay1(int count)
{
volatile long i;
while(count)
{
for(i=0; i<1000; i++);
count--;
}
}
char inport(void)
{
char indata,datad,datac;
char *portc_data = (char *)0x26;
char *portd_data = (char *)0x29;
datad = *portd_data;
datac = *portc_data;
indata = (((datac & 0x30)>>2) & 0x0F) | ((datad & 0x0C) >> 2);
indata = ~indata & 0x0F;
return(indata);
}
void loop() {
}