void setup() {
// put your setup code here, to run once:
volatile char *dirk,*dirf,*dira,*dirb,*outf,*outk,*outa,*outb,*ink,x;
dirk=0x107;outk=0x108;ink=0x106;dirf=0x30;outf=0x31;dira=0x21;outa=0x22;dirb=0x24;outb=0x25;
*dirk=0xf0;*dira=0xff;*dirf=0xff;*outa=0xff;*dirb=0xff;
volatile long row,cols,input=0,datacount=0,i;
volatile char one,ten,hundred,thousand;
const char keymap[4][3]={{0},{7,8,9},{4,5,6},{1,2,3}};
const char display[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E};
while(1)
{
if(datacount<4){
for(row=0;row<4;row++)
{
*outk=1<<(row+4);
*outf=*ink;
cols=(*ink&0x0f);
if(cols!=0)
{
for(i=0;i<4000;i++);//delay
cols=*ink&0x0f;
if(cols==0) continue;
else if(*ink&0x80)
{
if(*ink&0x08){
input=(input*10)+1;
datacount++;
}
if(*ink&0x04){
input=(input*10)+2;
datacount++;
}
if(*ink&0x02){
input=(input*10)+3;
datacount++;
}
}
else if(*ink&0x40)
{
if(*ink&0x08){
input=(input*10)+4;
datacount++;
}
if(*ink&0x04){
input=(input*10)+5;
datacount++;
}
if(*ink&0x02){
input=(input*10)+6;
datacount++;
}
}
else if(*ink&0x20)
{
if(*ink&0x08){
input=(input*10)+7;
datacount++;
}
if(*ink&0x04){
input=(input*10)+8;
datacount++;
}
if(*ink&0x02){
input=(input*10)+9;
datacount++;
}
}
else if(*ink&0x10)
{
if(*ink&0x04){
input=(input*10)+0;
datacount++;
}
while((*ink & 0x0f) != 0);//wait till key released
}
}
}
}
if(datacount>=4)
{
volatile char led_in=input;
one=led_in%10;
ten=(led_in/10)%10;
led_in/=10;
hundred=(led_in/10)%10;
led_in/=10;
thousand=(led_in/10)%10;
datacount=0;
input=0;
}
*outb=0x01;
*outa=display[thousand];
*outa=0xff;
for(i=0;i<1000;i++);
*outb=0x02;
*outa=display[hundred];
*outa=0xff;
for(i=0;i<1000;i++);
*outb=0x04;
*outa=display[ten];
*outa=0xff;
for(i=0;i<1000;i++);
*outb=0x08;
*outa=display[one];
*outa=0xff;
for(i=0;i<1000;i++);
}
}