void display(volatile unsigned char* out,volatile unsigned char* digit,char thousands,char hundreds,char tens,char ones);
char seven_segment_code(char num, char decimal);
volatile char read_keypad(volatile unsigned char* in_key,volatile unsigned char* out_key);
int main()
{
volatile char* dir;
dir = 0x30;
*dir = 0x0F;
dir = 0x107;
*dir = 0xFF;
dir = 0x27;
*dir = 0xFF;
volatile unsigned char* out_key;
volatile unsigned char* in_key;
volatile unsigned char* out_display;
volatile unsigned char* out_display_picker;
volatile char data,i,sum;
volatile char num[4];
out_key = 0x31;
in_key = 0x2F;
out_display = 0x108;
out_display_picker = 0x28;
i=0;
sum = 0;
while(1)
{
data = read_keypad(in_key,out_key);
if(data!=-1 && i!=2)
{
sum = data+sum;
i++;
while(data!=-1)
{
data = read_keypad(in_key,out_key);
}
}
else if(i == 2)
{
display(out_display,out_display_picker,(sum/1000)%10,(sum/100)%10,(sum/10)%10,(sum)%10);
}
}
}
void display(volatile unsigned char* out,volatile unsigned char* window,char thousands,char hundreds,char tens,char ones)
{
//ones
*window = ~(0x01);
*out = seven_segment_code(ones,0);
for(volatile long i = 0;i<10000;i++);
*out = 0x00;
//tens
*window = ~(0x01<<1);
*out = seven_segment_code(tens,0);
for(volatile long i = 0;i<10000;i++);
*out = 0x00;
//hundreds
*window = ~(0x01<<2);
*out = seven_segment_code(hundreds,0);
for(volatile long i = 0;i<10000;i++);
*out = 0x00;
//thousands
*window = ~(0x01<<3);
*out = seven_segment_code(thousands,0);
for(volatile long i =0;i<10000;i++);
*out = 0x00;
}
char seven_segment_code(char num, char decimal)
{
char temp;
switch(num)
{
case 0:
temp = 0x3F;
break;
case 1:
temp = 0x06;
break;
case 2:
temp = 0x5B;
break;
case 3:
temp = 0x4F;
break;
case 4:
temp = 0x66;
break;
case 5:
temp = 0x6D;
break;
case 6:
temp = 0x7D;
break;
case 7:
temp = 0x07;
break;
case 8:
temp = 0X7F;
break;
case 9:
temp = 0x6F;
break;
}
if(decimal == 0)
{
;
}
else if(decimal == 1)
{
temp = temp + 128;
}
return(temp);
}
volatile char read_keypad(volatile unsigned char* in_key,volatile unsigned char* out_key)
{
volatile char matrix[4][4] = {1,2,3,'A',4,5,6,'B',7,8,9,'C','*',0,'#','D'};
char i;
volatile unsigned char temp;
volatile char count;
for(volatile long i = 0;i<5000;i++); //debouncing
for(i=0;i<4;i++)
{
temp = 0x10;
*out_key = 0x01<<i;
if(((*in_key)&0xF0)!=0x00) //the expression inside is for masking
{
count = 0;
while(((*in_key)&0xF0)!=temp) //to convert to a number
{
temp = temp<<1;
count++;
}
return(matrix[i][count]);
}
}
return -1; // << optional
}