#include <ST7565.h>
#include <SPI.h>
#define outC 2
#define outB 3
#define outA 4
#define in 12
#define button 10
#define SW1 11
byte KMAP/*2][4]*/;
String BOOL = "";
String Old = "";
byte t;
byte f;
ST7565 glcd(9, 8, 7, 6, 5);
void setup()
/* This section sets up the intial conditions required to execute
/ all subsequent functions, mostly setting the pins as input
/ and output and intializing the LCD libraries.
*/
{
//pinMode(outC, OUTPUT); //Set these pins to output
//pinMode(outB, OUTPUT);
//pinMode(outA, OUTPUT);
//pinMode(in, INPUT); //Set these pins to input
digitalWrite(in, HIGH);
pinMode(button, INPUT);
digitalWrite(button, HIGH); //Turn on internal pullup resistor
Serial.begin(9600); //Start serial communication
Serial.println("Serial begin."); //Print the test line
Serial.println(freeRam());
glcd.begin(0x18);
glcd.st7565_init();
glcd.st7565_command(CMD_DISPLAY_ON);
glcd.st7565_command(CMD_SET_ALLPTS_NORMAL);
DDRC |= B111;
}
void loop()
{
if (digitalRead(button) == LOW) {
digitalWrite(13, HIGH);
READ();
CONV();
}
else {
digitalWrite(13, LOW);
}
//DISP();
glcd.display();
}
/*digitalWrite(13, LOW);
if (digitalRead(SW1) == LOW) {
DISPT();
}
else if (digitalRead(SW1) == HIGH) {
DISPB();
}*/
void READ()
/* This section is the read and store section; it interacts with
/ the outside world via the designated output and input pins.
/ This section will write to each output, counting up in binary
/ with the MSB called A, and the LSB called C.
*/
{
byte KMAP = 0;
byte x;
byte y;
for (x = 0; x < 8; x++) {
PORTC = x;
delay(2);
bitWrite(KMAP, x, digitalRead(in));
}
}
void CONV()
/* This is the Karnaugh mapping section, which checks for contiguous
/ sections of true outputs on a grid created in the array KMAP.
/ This simplifies the expression by eliminating variables whose level
/ is irrelevant because the output is true when it is true or false.
/ Simplified expressions are added to string BOOL.
*/
{
BOOL = "";
if (bitRead(KMAP, 4) && bitRead(KMAP, 5) && bitRead(KMAP, 6) && bitRead(KMAP, 7)) {
BOOL += "A + ";
}
else if (bitRead(KMAP, 4) || bitRead(KMAP, 5)) {
if (bitRead(KMAP, 4) && bitRead(KMAP, 5) && !(bitRead(KMAP, 2) && bitRead(KMAP, 3))) {
BOOL += "AB + ";
}
else if (bitRead(KMAP, 4) && !(bitRead(KMAP, 2) || bitRead(KMAP, 6))) {
BOOL += "ABC' + ";
}
else if (!(bitRead(KMAP, 3) || bitRead(KMAP, 7))) {
BOOL += "ABC + ";
}
}
else if (bitRead(KMAP, 6) || bitRead(KMAP, 7)) {
if (bitRead(KMAP, 6) && bitRead(KMAP, 7) && !(bitRead(KMAP, 0) && bitRead(KMAP, 1))) {
BOOL += "AB' + ";
}
else if (bitRead(KMAP, 6) && !(bitRead(KMAP, 2) || bitRead(KMAP, 6))) {
BOOL += "AB'C' + ";
}
else if (!(bitRead(KMAP, 3) || bitRead(KMAP, 7))) {
BOOL += "AB'C + ";
}
}
/*-----------------------------------------------------------------------------------------------*/
if (bitRead(KMAP, 0) && bitRead(KMAP, 1) && bitRead(KMAP, 2) && bitRead(KMAP, 3)) {
BOOL += "A' + ";
}
else if (bitRead(KMAP, 0) || bitRead(KMAP, 1)) {
if (bitRead(KMAP, 0) && bitRead(KMAP, 1) && !(bitRead(KMAP, 6) && bitRead(KMAP, 7))) {
BOOL += "A'B' + ";
}
else if (bitRead(KMAP, 0) && !(bitRead(KMAP, 2) || bitRead(KMAP, 6))) {
BOOL += "A'B'C' + ";
}
else if (!(bitRead(KMAP, 3) || bitRead(KMAP, 7))) {
BOOL += "A'B'C + ";
}
}
else if (bitRead(KMAP, 2) || bitRead(KMAP, 3)) {
if (bitRead(KMAP, 2) && bitRead(KMAP, 3) && !(bitRead(KMAP, 4) && bitRead(KMAP, 5))) {
BOOL += "A'B + ";
}
else if (bitRead(KMAP, 2) && !bitRead(KMAP, 4) && !bitRead(KMAP, 0)) {
BOOL += "A'BC' + ";
}
else if (!(bitRead(KMAP, 5) || bitRead(KMAP, 1))) {
BOOL += "A'BC + ";
}
}
/*-----------------------------------------------------------------------------------------------*/
if (bitRead(KMAP, 2) && bitRead(KMAP, 3) && bitRead(KMAP, 4) && bitRead(KMAP, 5)) {
BOOL += "B + ";
}
else if (bitRead(KMAP, 2) || bitRead(KMAP, 3)) {
if (bitRead(KMAP, 2) && bitRead(KMAP, 3) && !(bitRead(KMAP, 0) && bitRead(KMAP, 1))) {
BOOL += "A'B + ";
}
else if (bitRead(KMAP, 2) && !(bitRead(KMAP, 0) || bitRead(KMAP, 4))) {
BOOL += "A'BC' + ";
}
else if (!(bitRead(KMAP, 1) || bitRead(KMAP, 5))) {
BOOL += "A'BC + ";
}
}
else if (bitRead(KMAP, 4) || bitRead(KMAP, 5)) {
if (bitRead(KMAP, 4) && bitRead(KMAP, 5) && !(bitRead(KMAP, 6) && bitRead(KMAP, 7))) {
BOOL += "AB + ";
}
else if (bitRead(KMAP, 4) && !(bitRead(KMAP, 2) || bitRead(KMAP, 6))) {
BOOL += "ABC' + ";
}
else if (!(bitRead(KMAP, 3) || bitRead(KMAP, 7))) {
BOOL += "ABC + ";
}
}
/*-----------------------------------------------------------------------------------------------*/
if (bitRead(KMAP, 0) && bitRead(KMAP, 1) && bitRead(KMAP, 6) && bitRead(KMAP, 7)) {
BOOL += "B' + ";
}
else if (bitRead(KMAP, 0) || bitRead(KMAP, 1)) {
if (bitRead(KMAP, 0) && bitRead(KMAP, 6) && !(bitRead(KMAP, 1) || bitRead(KMAP, 7)) && !(bitRead(KMAP, 2) && bitRead(KMAP, 4))) {
BOOL += "B'C' + ";
}
else if (bitRead(KMAP, 1) && bitRead(KMAP, 7) && !(bitRead(KMAP, 3) && bitRead(KMAP, 5))) {
BOOL += "B'C + ";
}
}
/*-----------------------------------------------------------------------------------------------*/
if (bitRead(KMAP, 1) && bitRead(KMAP, 3) && bitRead(KMAP, 5) && bitRead(KMAP, 7)) {
BOOL += "C + ";
}
else if (bitRead(KMAP, 1) || bitRead(KMAP, 3)) {
if (bitRead(KMAP, 1) && bitRead(KMAP, 3) && !(bitRead(KMAP, 0) && bitRead(KMAP, 2))) {
BOOL += "A'C + ";
}
else if (bitRead(KMAP, 3) && bitRead(KMAP, 5) && !(bitRead(KMAP, 2) && bitRead(KMAP, 4))) {
BOOL += "BC + ";
}
}
else if (bitRead(KMAP, 5) || bitRead(KMAP, 7)) {
if (bitRead(KMAP, 5) && bitRead(KMAP, 7) && !(bitRead(KMAP, 4) && bitRead(KMAP, 6))) {
BOOL += "AC + ";
}
else if (bitRead(KMAP, 1) && bitRead(KMAP, 7) && !(bitRead(KMAP, 0) && bitRead(KMAP, 6))) {
BOOL += "B'C + ";
}
}
/*-----------------------------------------------------------------------------------------------*/
if (bitRead(KMAP, 0) && bitRead(KMAP, 2) && bitRead(KMAP, 4) && bitRead(KMAP, 6)) {
BOOL += "C' + ";
}
else if (bitRead(KMAP, 0) || bitRead(KMAP, 2)) {
if (bitRead(KMAP, 0) && bitRead(KMAP, 2) && !(bitRead(KMAP, 1) && bitRead(KMAP, 3))) {
BOOL += "A'C' + ";
}
else if (bitRead(KMAP, 0) && bitRead(KMAP, 6) && !(bitRead(KMAP, 1) && bitRead(KMAP, 7))) {
BOOL += "B'C' + ";
}
}
else if (bitRead(KMAP, 4) || bitRead(KMAP, 6)) {
if (bitRead(KMAP, 4) && bitRead(KMAP, 6) && !(bitRead(KMAP, 5) && bitRead(KMAP, 7))) {
BOOL += "AC' + ";
}
else if (bitRead(KMAP, 2) && bitRead(KMAP, 4) && !(bitRead(KMAP, 3) && bitRead(KMAP, 5))) {
BOOL += "BC' + ";
}
}
/*-----------------------------------------------------------------------------------------------*/
if (bitRead(KMAP, 0) && bitRead(KMAP, 2) && bitRead(KMAP, 4) && bitRead(KMAP, 6) && bitRead(KMAP, 1) && bitRead(KMAP, 3) && bitRead(KMAP, 5) && bitRead(KMAP, 7)) {
BOOL = "All conditions are true.";
t = 1;
}
if (!(bitRead(KMAP, 0) || bitRead(KMAP, 2) || bitRead(KMAP, 4) || bitRead(KMAP, 6) || bitRead(KMAP, 1) || bitRead(KMAP, 3) || bitRead(KMAP, 5) || bitRead(KMAP, 7))) {
BOOL = "All conditions are false.";
f = 1;
}
/*-----------------------------------------------------------------------------------------------*/
}
/*void DISP()
{
if (!t && !f) {
BOOL[BOOL.length() - 2] = NULL;
}
if (BOOL != Old) {
Serial.println(BOOL);
Old = BOOL;
byte x;
byte y;
for (x = 0; x < 2; x++)
{
for (y = 0; y < 3; y++)
{
Serial.print(KMAP[x][y]);
Serial.print(" ");
}
Serial.print(KMAP[x][y]);
Serial.println("");
}
}
}*/
void DISPT() {
// Displays the truth table for the logic circuit.
//glcd.drawchar(
glcd.drawstring(0, 0, "A'B'C'");
glcd.drawstring(1, 0, "A'B'C");
glcd.drawstring(2, 0, "A'BC'");
glcd.drawstring(3, 0, "A'BC");
glcd.drawstring(4, 0, "AB'C'");
glcd.drawstring(5, 0, "AB'C");
glcd.drawstring(6, 0, "ABC'");
glcd.drawstring(7, 0, "ABC");
byte y;
for (y = 0; y < 8; y++) {
glcd.drawchar(y, 8, bitRead(KMAP, y));
}
/*
byte x;
byte y;
for (x = 0; x < 2; x++) {
for (y = 0; y < 3; y++) {
glcd.drawchar(y, x, KMAP[x][y]);
}
glcd.drawchar(y, x, KMAP[x][y]);
}*/
}
void DISPB() {
// Displays the boolean expression for the logic cicuit.
int L = BOOL.length() - 2;
byte l;
byte m;
for (l = 0; l < L; l++) {
for (m = 0; m < 122; m++) {
glcd.drawchar(m, 0, BOOL[l]);
Serial.print(BOOL[l]);
Serial.print(" ");
Serial.println(m);
}
}
}
int freeRam() {
extern int __bss_end;
extern int *__brkval;
int free_memory;
if((int)__brkval == 0) {
free_memory = ((int)&free_memory) - ((int)&__bss_end);
}
else {
free_memory = ((int)&free_memory) - ((int)__brkval);
}
return free_memory;
}