void setup() {
// put your setup code here, to run once:
volatile char *dirf, *dirk, *dira;
volatile char *outf, *ink, *outa;
volatile long i, j;
dirf = 0x30; dirk = 0x107; dira = 0x21;
outf = 0x31; ink = 0x106; outa = 0x22;
*dirf = 0x0F; *dirk = 0x00; *dira = 0xFF;
while(1)
{
for(i=0; i<4; i++)
{
*outf = 1<<i;
*outa = *ink;
if(*ink != 0)
{
*outa = 1<<i;
for(j=0; j<10000; j++);
*outa = 0x00;
}
}
}
}
void loop() {
// put your main code here, to run repeatedly:
char x = readKey();
display(x);
}
char readKey() {
char key = 0;
for (int i = 0; i < 4; i++) {
PORTB &= ~(1 << i); // Set column i low
for (int j = 0; j < 4; j++) {
if (!(PINB & (1 << j))) { // Check if row j is low
key = i * 4 + j + 1; // Calculate key press
return key;
}
}
PORTB |= (1 << i); // Set column i high
}
return 0; // No key press
}
void display(char key) {
switch (key) {
case 1:
PORTK = 0x3F;
break;
case 2:
PORTK = 0x06;
break;
case 3:
PORTK = 0x5B;
break;
case 4:
PORTK = 0x4F;
break;
case 5:
PORTK = 0x66;
break;
case 6:
PORTK = 0x6D;
break;
case 7:
PORTK = 0x07;
break;
case 8:
PORTK = 0x7F;
break;
case 9:
PORTK = 0x6F;
break;
case 0:
PORTK = 0x3F;
break;
}
}