#define dirk ((volatile unsigned char*)0x107)
#define outk ((volatile unsigned char*)0x108)
#define ink ((volatile unsigned char*)0x106)
#define ddra ((volatile unsigned char*)0x21)
#define ddrb ((volatile unsigned char*)0x24)
#define ledout ((volatile unsigned char*)0x22)
#define select ((volatile unsigned char*)0x25)
#define dirf ((volatile unsigned char*)0x30)
#define outf ((volatile unsigned char*)0x31)
void commonanode(volatile long input);
volatile char keypad(void);
void setup(){
*dirk=0xf0;*ddra=0xff;*ddrb=0x0f;*dirf=0xff;
volatile char keyin,datacount=0;
volatile long input,i;
while(1)
{
keyin=0;
keyin=keypad();
if(keyin!=0)
{
input=(input*10)+(keyin-'0');
datacount++;
}
commonanode(input);
if(datacount>=4)
{
for(i=0;i<10;i++){
commonanode(input);
}
datacount=0;
input=0;
}
/*previous code
if(datacount>=4)
{
commonanode(input);
for(i=0;i<400000;i++);
datacount=0;
input=0;
}*/
}
}
volatile char keypad(void)
{
volatile char pressedkey=0;
volatile long j,row,col;
for(row=0;row<4;row++)
{
*outk=1<<(row+4);
col=(*ink&0x0f);
if(col!=0)
{
for(j=0;j<20000;j++);
if((*ink&0x80)==0x80)
{
if((*ink&0x08)==0x08)
{
pressedkey='1';
}
else if((*ink&0x04)==0x04)
{
pressedkey='2';
}
else if((*ink&0x02)==0x02)
{
pressedkey='3';
}
/*else if((*ink&0x01)==0x01)
{
common_anode('A'-7-'0');//A
}*/
}
else if((*ink&0x40)==0x40)
{
if((*ink&0x08)==0x08)
{
pressedkey='4';
}
else if((*ink&0x04)==0x04)
{
pressedkey='5';
}
else if((*ink&0x02)==0x02)
{
pressedkey='6';
}
/*else if((*ink&0x01)==0x01)
{
common_anode('B'-7-'0');//B
}*/
}
else if((*ink&0x20)==0x20)
{
if((*ink&0x08)==0x08)
{
pressedkey='7';
}
else if((*ink&0x04)==0x04)
{
pressedkey='8';
}
else if((*ink&0x02)==0x02)
{
pressedkey='9';
}
/*else if((*ink&0x01)==0x01)
{
common_anode('C'-7-'0');//C
}*/
}
else if((*ink&0x10)==0x10)
{
/*if((*ink&0x08)==0x08)
{
common_anode('*'-'0');//*
}*/
if((*ink&0x04)==0x04)
{
pressedkey='0';
}
/*else if((*ink&0x02)==0x02)
{
common_anode('#'-'0');//#
}
/*else if((*ink&0x01)==0x01)
{
common_anode('D'-7-'0');//D
}*/
}
while((*ink&0x0f)!=0);
break;
}
}
return pressedkey;
}
void commonanode(volatile long input)
{
volatile long i,j;
volatile char thousand,hundred,one,ten;
volatile char display[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
thousand=input/1000;
hundred=(input%1000)/100;
ten=(input%100)/10;
one=input%10;
if(thousand!=0)
{
*select=0x01;
*ledout=display[thousand];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<6000;i++);
*select=0x02;
*ledout=display[hundred];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<6000;i++);
*select=0x04;
*ledout=display[ten];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<6000;i++);
*select=0x08;
*ledout=display[one];
for(i=0;i<4000;i++);//wait till display settles
*ledout=0xff;
for(i=0;i<6000;i++);
}
else if(hundred!=0)
{
*select=0x02;
*ledout=display[hundred];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<9333;i++);
*select=0x04;
*ledout=display[ten];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<9334;i++);
*select=0x08;
*ledout=display[one];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<9333;i++);
}
else if(ten!=0)
{
*select=0x04;
*ledout=display[ten];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<16000;i++);
*select=0x08;
*ledout=display[one];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<16000;i++);
}
else{
*select=0x08;
*ledout=display[one];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<36000;i++);
}
}