Skip to content

Instantly share code, notes, and snippets.

@jornvdmaat17
Created November 3, 2018 15:26
Show Gist options
  • Save jornvdmaat17/710356a598a3b0a5168b5428843b6396 to your computer and use it in GitHub Desktop.
Save jornvdmaat17/710356a598a3b0a5168b5428843b6396 to your computer and use it in GitHub Desktop.
#include "simlogic.h"
#include <Keypad.h>
#define buttonA 2
#define buttonB 3
#define buttonC 4
#define ledSum 5
#define ledC_out 6
#define latchPin 12//Pin connected to ST_CP of 74HC595
#define clockPin 10//Pin connected to SH_CP of 74HC595
#define dataPin 11 //Pin connected to DS of 74HC595
int datArray[10] = {3, 159, 37, 13, 153, 73, 65, 31, 1, 9};
void writeDigit(int);
String decToBin(int);
int binToDec(String);
#define ROWS 4
#define COLS 3
char keys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'\0', '\0', '\0'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {6, 7, 8};
Keypad keyp = Keypad(makeKeymap(keys), rowPins , colPins , ROWS , COLS);
#define createBit(i) \
create(Input , inputA##i); \
create(Input , inputB##i); \
create(Input , inputCarry##i); \
create(Xor, xorAB##i); \
create(And, anAnd##i); \
create(And, andAB##i); \
create(Xor, sum##i); \
create(Or, carry##i); \
connect(inputA##i, xorAB##i.inA); \
connect(inputB##i, xorAB##i.inB); \
connect(inputA##i, andAB##i.inA); \
connect(inputB##i, andAB##i.inB); \
connect(xorAB##i, sum##i.inA); \
connect(inputCarry##i, sum##i.inB); \
connect(xorAB##i, anAnd##i.inA); \
connect(inputCarry##i, anAnd##i.inB); \
connect(anAnd##i, carry##i.inA); \
connect(andAB##i, carry##i.inB);
int main() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
writeDigit(0);
char key0;
while (!(key0 = keyp.getKey())) {
}
int input0 = key0 - '0';
char key1;
while (!(key1 = keyp.getKey())) {
}
int input1 = key1 - '0';
String a = decToBin(input0);
String b = decToBin(input1);
while(a.length() < 3){
a = '0' + a;
}
while(b.length() < 3) {
b = '0' + b;
}
create(False, aFalse);
createBit(0);
createBit(1);
createBit(2);
connect(aFalse, inputCarry0.in);
connect(carry0, inputCarry1.in);
connect(carry1, inputCarry2.in);
inputA0.value = a.charAt(2) - '0';
inputA1.value = a.charAt(1) - '0';
inputA2.value = a.charAt(0) - '0';
inputB0.value = b.charAt(2) - '0';
inputB1.value = b.charAt(1) - '0';
inputB2.value = b.charAt(0) - '0';
evaluate();
String out = String(carry2.value) + String(sum2.value) + String(sum1.value) + String(sum0.value);
writeDigit(binToDec(out));
delay(5000);
main();
return 0;
}
void writeDigit(int i) {
digitalWrite(latchPin , LOW);
shiftOut(dataPin , clockPin , MSBFIRST , datArray[i]);
digitalWrite(latchPin , HIGH);
}
String decToBin(int dec) { //Functie voor decimaal naar binair
String bit; //Maak een lege bit string aan
while (dec > 0) { //Zolang de decimaal niet 0 is, voer dit uit
int binary = dec % 2; //Slaat de rest van decimaal gedeeld over 2 op, dit is 1 of 0
dec /= 2; //Vervolgens delen we decimaal over 2 en slaan we dit op in dec
bit += String(binary); //Voeg de 0 of 1 aan de bit string toe
}
String out; //Maak een nieuwe string out aan, omdat de bits in de verkeerde volgorde staan
for (int i = bit.length(); i > 0; i--) { //Loop die ervoor zorgt dat de string omgedraaid wordt
out += bit[i - 1]; //Voeg de achterste char van de bin string aan out toe, totdat de bit string op is
}
return out; //Return de out string
}
int binToDec(String s) { //Functie voor binair naar decimaal
int decimal = 0; //Initaliseert decimal op 0
for (int i = 0; i < s.length(); i++) { //Gaat alle bits langs uit de string
int b = s[s.length() - 1 - i] - '0' ; // haal bit uit string en converteer naar 0 of 1
decimal += b * round(pow(2 , i)); //Vermedigvuldig de 1 of 0 met een macht van twee die bijgehouden is door middel van de for loop
}
return decimal; //Return de decimale waarde
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment