char fdir= 0x30;
char fout = 0x31;
int kdir = 0x107;
int kin= 0x106;
char adir = 0x21;
char aout= 0x22;
char bdir = 0x24;
char bout = 0x25;
char bbout =0x25;
void init (volatile char*dir, char x)
{
*dir = x;
}
void output (volatile char*out, char x)
{
*out = x;
}
int input( volatile char*in)
{
char x;
x= *in;
return x;
}
void delay()
{
volatile long long i;
for (i=0;i<=12000; i++);
}
int readswitch ()
{
char x,i;
for (i=0; i<4;i++)
{
output(fout , (1<<i));
x = input(kin);
// delay();
if (i==0){
if(( x&0x01)==0x01){
return 1;
}
if (( x&0x02)==0x02)
{
return 2;
}
if(( x&0x04)==0x04){
return 3;
}
if (( x&0x08)==0x08)
{
return '+';
}
}
if (i==1){
if(( x&0x01)==0x01){
return 4;
}
if (( x&0x02)==0x02)
{
return 5;
}
if(( x&0x04)==0x04){
return 6;
}
if (( x&0x08)==0x08)
{
return '-';
}
}
if (i==2){
if(( x&0x01)==0x01){
return 7;
}
if (( x&0x02)==0x02)
{
return 8;
}
if(( x&0x04)==0x04){
return 9;
}
if (( x&0x08)==0x08)
{
return '*';
}
}
if (i==3){
if(( x&0x01)==0x01){
return '/';
}
if (( x&0x02)==0x02)
{
return 0;
}
if(( x&0x04)==0x04){
return 'c';
}
if (( x&0x08)==0x08)
{
return '=';
}
}
}
return -1;
}
void display( int y , int x)
{
switch(x)
{
case 0:
output(y,0x3F);
break;
case 1:
output(y,0x06);
break;
case 2:
output(y,0x5B);
break;
case 3:
output(y,0x4F);
break;
case 4:
output(y,0x66);
break;
case 5:
output(y,0x6D);
break;
case 6:
output(y,0x7C);
break;
case 7:
output(y,0x07);
break;
case 8:
output(y,0x7F);
break;
case 9:
output(y,0x67);
break;
}
}
void sevseg(int x)
{
char ones = (x%10);
char tens = ((x/10)%10);
char hundreds = ((x/100)%10);
char thousands = ((x/1000)%10);
char i;
for(i=0;i<4;i++)
{
output(bbout, 0xFF);
if(i==0){
display(0x22, thousands);
//delayMicroseconds(100);
output(bbout, 0xEF);
//delayMicroseconds(1000);
}
if(i==1){
display(0x22, hundreds);
//delayMicroseconds(100);
output(bbout, 0xDF);
//delayMicroseconds(1000);
}
if(i==2){
display(0x22, tens);
//elayMicroseconds(100);
output(bbout, 0xBF);
//delayMicroseconds(1000);
}
if(i==3){
display(0x22, ones);
//delayMicroseconds(100);
output(bbout, 0x7F);
//delayMicroseconds(1000);
}
}
}
int main()
{
init ( fdir , 0xFF);
init (kdir , 0x00);
init ( adir , 0xFF);
init ( bdir , 0xFF);
output(bbout, 0xFF);
int cn=0;
Serial.begin(115200);
char count =0;
char y;
while(1){
char x = readswitch();
if(x!=y){
x= y;
if((x>=0)&&(x<=9))
{
count++;
cn = ((cn*10)+x);
count =0;
}
}
Serial.println(cn);
sevseg(cn);
//delay();
}
}