void setup() {
volatile char * dirA=0x21;
volatile char * dirC=0x27;
volatile char * dirF=0x30;
volatile char * dirK=0x107;
*dirA=0XFF;
*dirC=0x0F;
*dirF=0x0F;
*dirK=0xF0;
Serial.begin(9600);
}
void loop() {
int keys[4][4]={
{1,2,3,65},
{4,5,6,66},
{7,8,9,67},
{42,0,35,68}
};
volatile char * outF=0x31;
volatile char * inpK=0x106;
int val=0;
for(int k=0;k<4;){
for(int i=0;i<4;i++){
*outF=1<<i;
char x=*inpK;
if(x!=0x00){
int j;
for(j=0;j<4;j++){
if(x&(1<<j))break;
}
if(keys[i][j]<10){
// Serial.println(keys[i][j]);
display_four_digit_number(keys[i][j]);
val=val*10+keys[i][j];
Serial.println(val);
k++;
}
else
{
Serial.println(char(keys[i][j]));
}
}
}
delay(200);}
display_four_digit_number(val);
}
void display_four_digit_number(int N){
const char segments[] = {
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
char digit_on[4]={0x0E,0x0D,0X0B,0x07}; //This array stores hex for which digit should be on in particular time slot
unsigned volatile char * outA=0x22;
unsigned volatile char * outC=0x28;
int digits_i[4]={0}; // array to store the digits ,initially all zeroes
int k=3;
int x=N;
// this iteravtively stores the digits from last digit
while(x!=0){
int rem=x%10;
digits_i[k]=rem;
x=x/10;
k--;
}
for(int l=0;l<200;l++)
for(int j=0;j<4;j++){
*outC=digit_on[j];
*outA=segments[digits_i[j]];
delay(1);
*outA=0x00;
delay(1);
}
delay(500);
}