volatile unsigned char *dirf, *dirk, *dirc, *dira, *dirl, *dirb;
volatile unsigned char *bit4, *bit3, *bit2, *bit1, *key_in, *key_out;
// display on sevenseg using integer as input
void sevenseg(volatile unsigned char *reg ,volatile char dig=10,volatile bool dot=0){
volatile char dot_add;
if(dot){
dot_add=0x80;
}else
dot_add=0;
switch(dig){
case 0: *reg=0x3f|dot_add; break; //0
case 1: *reg=0x06|dot_add; break; //1
case 2: *reg=0x5b|dot_add; break; //2
case 3: *reg=0x4f|dot_add; break; //3
case 4: *reg=0x66|dot_add; break; //4
case 5: *reg=0x6d|dot_add; break; //5
case 6: *reg=0x7d|dot_add; break; //6
case 7: *reg=0x07|dot_add; break; //7
case 8: *reg=0x7f|dot_add; break; //8
case 9: *reg=0x6f|dot_add; break; //9
default: *reg=0x79|dot_add; break; //E
}
}
// 7seg with keypad data
void sevenseg_keypad(volatile unsigned char *reg, volatile char i, volatile char j){
switch(i){
case 0: {
switch(j){
case 0: *reg=0x06; break; //1
case 1: *reg=0x5b; break; //2
case 2: *reg=0x4f; break; //3
default: *reg=0x80; break; // dot
}break;
}
case 1: {
switch(j){
case 0: *reg=0x66; break; //4
case 1: *reg=0x6d; break; //5
case 2: *reg=0x7d; break; //6
default: *reg=0x80; break; // dot
}break;
}
case 2: {
switch(j){
case 0: *reg=0x07; break; //7
case 1: *reg=0x7f; break; //8
case 2: *reg=0x6f; break; //9
default: *reg=0x80; break; // dot
}break;
}
case 3:{
switch(j){
case 1: *reg=0x3f; break; //0
default: *reg=0x80; break; // dot
}break;
}
default:
*reg=0x80; break;
}
}
// keypad scanning
volatile unsigned char read_keypad(volatile char i, volatile char j){
switch(i){
case 0: {
switch(j){
case 0: return 1; //1
case 1: return 2; //2
case 2: return 3; //3
case 3: return '+'; //+
//default: *reg=0x80; break; // dot
}break;
}
case 1: {
switch(j){
case 0: return 4; //4
case 1: return 5; //5
case 2: return 6; //6
case 3: return '-'; //-
//default: *reg=0x80; break; // dot
}break;
}
case 2: {
switch(j){
case 0: return 7; //7
case 1: return 8; //8
case 2: return 9; //9
case 3: return '*';
// default: *reg=0x80; break; // dot
}break;
}
case 3:{
switch(j){
case 1: return 0; //0
case 2: return '='; //0
//default: *reg=0x80; break; // dot
}break;
}
//default:
// *reg=0x80; break;
}
}
void add(volatile unsigned long num1,volatile unsigned long num2){
volatile unsigned long result=0;
result=num1+num2;
if(result<10000){
sevenseg(bit1,result%10);
result/=10;
sevenseg(bit2,result%10);
result/=10;
sevenseg(bit3,result%10);
result/=10;
sevenseg(bit4,result%10);
}else{
// display default values EEEE
sevenseg(bit1);
sevenseg(bit2);
sevenseg(bit3);
sevenseg(bit4);
}
}
void setup() {
// put your setup code here, to run once:
dirf=0x30; dirk=0x107; dirc=0x27; dira=0x21; dirl=0x10a; dirb=0x24;
*dirf=0xff; *dirk=0xff; *dirc=0xff; *dira=0xff; *dirl=0x0f; *dirb=0x00;
bit4=0x31; bit3=0x108; bit2=0x28; bit1=0x22; key_out=0x10b; key_in=0x23;
volatile unsigned long inp,dig=0,num1=0, num2=0;
volatile unsigned char operat=0;
while(dig<4){
for(volatile char i=0;i<4;i++){
*key_out=1<<i;
for(volatile char j=0;j<4;j++){
inp=*key_in;
if((inp&(1<<j))==(1<<j)){
// stop entering num1 if operator is entered
if(read_keypad(i,j)=='+'){
operat=read_keypad(i,j);
dig=4;
for(volatile long del=0;del<100000;del++);
// skip the current iteration
continue;
}
// enter num1
num1=num1*10+read_keypad(i,j);
sevenseg(bit1,read_keypad(i,j));
for(volatile long del=0;del<100000;del++);
dig++;
}
}
}
}
// enter operator only if num1 is 4 digits, otherwise operator taken from above only
if(!operat){
dig=0;
while(dig<1){
for(volatile char i=0;i<4;i++){
*key_out=1<<i;
for(volatile char j=0;j<4;j++){
inp=*key_in;
if((inp&(1<<j))==(1<<j)){
if(read_keypad(i,j)=='+'){
operat=read_keypad(i,j);
dig++;
for(volatile long del=0;del<100000;del++);
}
}
}
}
}
}
dig=0;
// enter num2
while(dig<4){
for(volatile char i=0;i<4;i++){
*key_out=1<<i;
for(volatile char j=0;j<4;j++){
inp=*key_in;
if((inp&(1<<j))==(1<<j)){
// stop entering num2 if = is occured
if(read_keypad(i,j)=='='){
dig=4;
for(volatile long del=0;del<100000;del++);
continue;
}
num2=num2*10+read_keypad(i,j);
sevenseg(bit1,read_keypad(i,j));
for(volatile long del=0;del<100000;del++);
dig++;
}
}
}
}
if(operat=='+'){
add(num1,num2);
}
}
void loop() {
// put your main code here, to run repeatedly:
}