miniSudoku - MASTER


/*
 * sudo.c
 *
 * Created: 2015-04-01 13:28:19
 *  Author: digpi04
 */ 


#include <avr/io.h>
#include <stdbool.h>
#include <util/delay.h>
char initial;
char y;
char x;
char markerPos;
char menuPos;
char buttonval;
char matrix[4][4];
char nbr;


int main(void){
	setup();	
	while(1)
    {	
	}
}

void setup(){
	DDRB = 0xff;
	DDRD = 0xff;
	initial = 0x3C;
	markerPos = 0;
	displayOn();
	emptyDisplay1();
	emptyDisplay2();
	drawGrid(0, 0);
	draw3(2);
	draw3(4);
	draw3(15);
	draw1(11);
	matrix[0][2] = 3;
	matrix[1][0] = 3;
	matrix[2][3] = 1;
	matrix[3][3] = 3;
	drawMarker(0);
	game();
}

void game(){
	while(1){
		_delay_ms(800);
		readButton();
		if(nbr > 11){
			checkSolution();
		}
	}
}

void write_cmd(char val, char cs){
	if(cs == 1) {
		PORTB = val; 
		PORTD = initial; //lÂg E 
		PORTD = 0x31; //instruktion, hˆg E, lÂg RS, lÂg R/W, hˆg reset, hˆg cs1
		PORTD = 0x21; //E dras hˆg 
		PORTD = initial; 
	}
	if(cs == 2) {
		PORTD = initial;
		PORTB = val;
		PORTD = 0x32;
		PORTD = 0x22;
		PORTD = initial;
	}
}

void write_data(char data, char cs){
	if(cs == 1) {
		PORTD = initial;
		PORTB = data; 
		PORTD = 0x39;//skriver data till ram display
		PORTD = 0x29;
		PORTD = initial;
	}
	if(cs == 2) {
		PORTD = initial;
		PORTB = data;
		PORTD = 0x3A;
		PORTD = 0x2A;
		PORTD = initial;
	}
}

void setXY1(char x, char y){
	PORTB = 0xB8 + x;
	write_cmd(PORTB, 1);
	PORTB = 0x40 + y;
	write_cmd(PORTB, 1);
}

void setXY2(char x, char y){
	PORTB = 0xB8 + x;
	write_cmd(PORTB, 2);
	PORTB = 0x40 + y;
	write_cmd(PORTB, 2);
}

void displayOn(){
	write_cmd(0x3F, 1);
	write_cmd(0x3F, 2);
}

void emptyDisplay1(){
	for(char i = 0; i < 64; i++){
		for(char j = 0; j < 8; j++){
			setXY1(j,i);
			PORTB = 0x00;
			write_data(PORTB, 1);
		}
	}
}

void emptyDisplay2(){
	for(char i = 0; i < 64; i++){
		for(char j = 0; j < 8; j++){
			setXY2(j,i);
			PORTB = 0x00;
			write_data(PORTB, 2);
		}
	}
}

void readButton(){
	buttonval = PINA & 0x08;
	if(buttonval == 0x08){
		moveDown();
	}
	buttonval = PINA & 0x04;
	if(buttonval == 0x04){
		moveRight();
	}
	buttonval = PINA & 0x10;
	if(buttonval == 0x10){
		moveUp();
	}
	buttonval = PINA & 0x02;
	if(buttonval == 0x02){
		moveLeft();
	}
	buttonval = PINA & 0x01;
	if(buttonval == 0x01){
		addNumber();
	}
	
}

void readMenuButton(){
	while(1){
		_delay_ms(300);
		buttonval = PINA & 0x08;
		if(buttonval == 0x08){
			moveMenuDown();
		}
		buttonval = PINA & 0x10;
		if(buttonval == 0x10){
			moveMenuUp();
		}
		buttonval = PINA & 0x01;
		if(buttonval == 0x01){
		if(menuPos == 0){
			draw1(markerPos);
			setMatrixValue(markerPos, 1);
			nbr++;
			break;
		}
		if(menuPos == 1){
			draw2(markerPos);
			setMatrixValue(markerPos, 2);
			nbr++;
			break; 
		}
		if(menuPos == 2){
			draw3(markerPos);
			setMatrixValue(markerPos, 3);
			nbr++;
			break;
		}
		if(menuPos == 3){
			draw4(markerPos);
			setMatrixValue(markerPos, 4);
			nbr++;
			break;
		}
		}
	}
	
}

void addNumber(){
	eraseMarker(markerPos);
	drawMenu();
	menuPos = 0;
	drawMenuMarker(menuPos);
	readMenuButton();
	drawMarker(markerPos);
	emptyDisplay2();
}

void moveMenuUp(){
	if(menuPos > 0){
		eraseMenuMarker(menuPos);
		drawMenuMarker(menuPos - 1);
		menuPos--;
	}
}
	
void moveMenuDown(){
	if(menuPos < 3){
		eraseMenuMarker(menuPos);
		drawMenuMarker(menuPos + 1);
		menuPos++;
	}
}
	
void moveDown(){
	if(markerPos < 12){
		eraseMarker(markerPos);
		drawMarker(markerPos + 4);
		markerPos = markerPos + 4;
	}
}

void moveUp(){
	if(markerPos > 3){
		eraseMarker(markerPos);
		drawMarker( markerPos - 4);
		markerPos = markerPos - 4;
	}
}

void moveRight(){
	if(markerPos != 3 && markerPos != 7 && markerPos != 11 && markerPos != 15){
		eraseMarker(markerPos);
		drawMarker(markerPos + 1);
		markerPos++;
	}
}

void moveLeft(){
	if(markerPos != 0 && markerPos != 4 && markerPos != 8 && markerPos != 12){
		eraseMarker(markerPos);
		drawMarker(markerPos - 1);
		markerPos--;
	}
}

void draw(char x, char y, char data){
	setXY1(x, y);
	write_data(data, 1);
}

void drawC2(char x, char y, char data){
	setXY2(x, y);
	write_data(data, 2);
}

void drawMenuMarker(char pos){
	switch(pos){
		case 0:
		for(char i = 16; i < 23; i++){
			for(char j = 0; j < 2; j++){
				drawC2(j, i, 0xff);
			}
		}
		break;
		case 1:
		for(char i = 16; i < 23; i++){
			for(char j = 2; j < 4; j++){
				drawC2(j, i, 0xff);
			}
		}
		break;
		case 2:
		for(char i = 16; i < 23; i++){
			for(char j = 4; j < 6; j++){
				drawC2(j, i, 0xff);
			}
		}
		break;
		case 3:
		for(char i = 16; i < 23; i++){
			for(char j = 6; j < 8; j++){
				drawC2(j, i, 0xff);
			}
		}
		break;
	}
}

void eraseMenuMarker(char pos){
	switch(pos){
		case 0:
		for(char i = 16; i < 23; i++){
			drawC2(0, i, 0x01);
			drawC2(1, i, 0x00);
		}
		break;
		case 1:
		for(char i = 16; i < 23; i++){
			for(char j = 2; j < 4; j++){
				drawC2(j, i, 0x00);
			}
		}
		break;
		case 2:
		for(char i = 16; i < 23; i++){
			for(char j = 4; j < 6; j++){
				drawC2(j, i, 0x00);
			}
		}
		break;
		case 3:
		for(char i = 16; i < 23; i++){
			drawC2(6, i, 0x00);
			drawC2(7, i, 0x80);
		}
		break;
	}
}

void drawMarker(char pos){
	switch(pos){
		case 0:
			draw(0, 1, 0xff);
			draw(1, 1, 0xff);
			draw(0, 14, 0xff);
			draw(1, 14, 0xff);
			break;
		case 1:
			draw(0, 16, 0xff);
			draw(1, 16, 0xff);
			draw(0, 30, 0xff);
			draw(1, 30, 0xff);
			break;
		case 2:
			draw(0, 32, 0xff);
			draw(1, 32, 0xff);
			draw(0, 46, 0xff);
			draw(1, 46, 0xff);
			break;
		case 3:
			draw(0, 48, 0xff);
			draw(1, 48, 0xff);
			draw(0, 62, 0xff);
			draw(1, 62, 0xff);
			break;					//row 2
		case 4:
			draw(2, 1, 0xff);
			draw(3, 1, 0xff);
			draw(2, 14, 0xff);
			draw(3, 14, 0xff);
			break;
		case 5:
			draw(2, 16, 0xff);
			draw(3, 16, 0xff);
			draw(2, 30, 0xff);
			draw(3, 30, 0xff);
			break;
		case 6:
			draw(2, 32, 0xff);
			draw(3, 32, 0xff);
			draw(2, 46, 0xff);
			draw(3, 46, 0xff);
			break;
		case 7:
			draw(2, 48, 0xff);
			draw(3, 48, 0xff);
			draw(2, 62, 0xff);
			draw(3, 62, 0xff);
			break;					//row 3
		case 8:
			draw(4, 1, 0xff);
			draw(5, 1, 0xff);
			draw(4, 14, 0xff);
			draw(5, 14, 0xff);
			break;
		case 9:
			draw(4, 16, 0xff);
			draw(5, 16, 0xff);
			draw(4, 30, 0xff);
			draw(5, 30, 0xff);
			break;
		case 10:
			draw(4, 32, 0xff);
			draw(5, 32, 0xff);
			draw(4, 46, 0xff);
			draw(5, 46, 0xff);
			break;
		case 11:
			draw(4, 48, 0xff);
			draw(5, 48, 0xff);
			draw(4, 62, 0xff);
			draw(5, 62, 0xff);
			break;					//row 4
		case 12:
			draw(6, 1, 0xff);
			draw(7, 1, 0xff);
			draw(6, 14, 0xff);
			draw(7, 14, 0xff);
			break;
		case 13:
			draw(6, 16, 0xff);
			draw(7, 16, 0xff);
			draw(6, 30, 0xff);
			draw(7, 30, 0xff);
			break;
		case 14:
			draw(6, 32, 0xff);
			draw(7, 32, 0xff);
			draw(6, 46, 0xff);
			draw(7, 46, 0xff);
			break;
		case 15:
			draw(6, 48, 0xff);
			draw(7, 48, 0xff);
			draw(6, 62, 0xff);
			draw(7, 62, 0xff);
			break;					//row 2							
	}
}

void eraseMarker(char pos){
	switch(pos){
		case 0:
			draw(0, 1, 0x01);
			draw(1, 1, 0x00);
			draw(0, 14, 0x01);
			draw(1, 14, 0x00);
			break;
		case 1:
			draw(0, 16, 0x01);
			draw(1, 16, 0x00);
			draw(0, 30, 0x01);
			draw(1, 30, 0x00);
			break;
		case 2:
			draw(0, 32, 0x01);
			draw(1, 32, 0x00);
			draw(0, 46, 0x01);
			draw(1, 46, 0x00);
			break;
		case 3:
			draw(0, 48, 0x01);
			draw(1, 48, 0x00);
			draw(0, 62, 0x01);
			draw(1, 62, 0x00);
			break;					//row 2
		case 4:
			draw(2, 1, 0x01);
			draw(3, 1, 0x00);
			draw(2, 14, 0x01);
			draw(3, 14, 0x00);
			break;
		case 5:
			draw(2, 16, 0x01);
			draw(3, 16, 0x00);
			draw(2, 30, 0x01);
			draw(3, 30, 0x00);
			break;
		case 6:
			draw(2, 32, 0x01);
			draw(3, 32, 0x00);
			draw(2, 46, 0x01);
			draw(3, 46, 0x00);
			break;
		case 7:
			draw(2, 48, 0x01);
			draw(3, 48, 0x00);
			draw(2, 62, 0x01);
			draw(3, 62, 0x00);
			break;							//row 3
		case 8:
			draw(4, 1, 0x01);
			draw(5, 1, 0x00);
			draw(4, 14, 0x01);
			draw(5, 14, 0x00);
			break;
		case 9:
			draw(4, 16, 0x01);
			draw(5, 16, 0x00);
			draw(4, 30, 0x01);
			draw(5, 30, 0x00);
			break;
		case 10:
			draw(4, 32, 0x01);
			draw(5, 32, 0x00);
			draw(4, 46, 0x01);
			draw(5, 46, 0x00);
			break;
		case 11:
			draw(4, 48, 0x01);
			draw(5, 48, 0x00);
			draw(4, 62, 0x01);
			draw(5, 62, 0x00);
			break;					//row 4
		case 12:
			draw(6, 1, 0x01);
			draw(7, 1, 0x80);
			draw(6, 14, 0x01);
			draw(7, 14, 0x80);
			break;
		case 13:
			draw(6, 16, 0x01);
			draw(7, 16, 0x80);
			draw(6, 30, 0x01);
			draw(7, 30, 0x80);
			break;
		case 14:
			draw(6, 32, 0x01);
			draw(7, 32, 0x80);
			draw(6, 46, 0x01);
			draw(7, 46, 0x80);
			break;
		case 15:
			draw(6, 48, 0x01);
			draw(7, 48, 0x80);
			draw(6, 62, 0x01);
			draw(7, 62, 0x80);
			break;					//row 2							
	}
}

void draw1(char pos){
	switch(pos)
	{
		case 0:
			draw(0, 5, 0x01);
			draw(0, 6, 0x01);	
			draw(0, 8, 0x01);
			draw(0, 9, 0x01);			
			draw(0, 7, 0xF1);
			draw(1,	7, 0x0F);
			draw(1, 5, 0x00);
			draw(1, 6, 0x00);
			draw(1, 8, 0x00);
			draw(1, 9, 0x00);
			break;
		case 1:
			draw(0, 21, 0x01);
			draw(0, 22, 0x01);
			draw(0, 24, 0x01);
			draw(0, 25, 0x01);
			draw(0, 23, 0xF1);
			draw(1,	23, 0x0F);
			draw(1, 21, 0x00);
			draw(1, 22, 0x00);
			draw(1, 24, 0x00);
			draw(1, 25, 0x00);
			break;	
		case 2:
			draw(0, 37, 0x01);
			draw(0, 38, 0x01);
			draw(0, 40, 0x01);
			draw(0, 41, 0x01);
			draw(0, 39, 0xF1);
			draw(1,	39, 0x0F);
			draw(1, 37, 0x00);
			draw(1, 38, 0x00);
			draw(1, 40, 0x00);
			draw(1, 41, 0x00);
			break;	
		case 3:
			draw(0, 53, 0x01);
			draw(0, 54, 0x01);
			draw(0, 56, 0x01);
			draw(0, 57, 0x01);
			draw(0, 55, 0xF1);
			draw(1,	55, 0x0F);
			draw(1, 53, 0x00);
			draw(1, 54, 0x00);
			draw(1, 56, 0x00);
			draw(1, 57, 0x00);
			break;	
		case 4:
			draw(2, 5, 0x01);
			draw(2, 6, 0x01);	
			draw(2, 8, 0x01);
			draw(2, 9, 0x01);			
			draw(2, 7, 0xF1);
			draw(3,	7, 0x0F);
			draw(3, 5, 0x00);
			draw(3, 6, 0x00);
			draw(3, 8, 0x00);
			draw(3, 9, 0x00);
			break;
		case 5:
			draw(2, 21, 0x01);
			draw(2, 22, 0x01);
			draw(2, 24, 0x01);
			draw(2, 25, 0x01);
			draw(2, 23, 0xF1);
			draw(3,	23, 0x0F);
			draw(3, 21, 0x00);
			draw(3, 22, 0x00);
			draw(3, 24, 0x00);
			draw(3, 25, 0x00);
			break;	
		case 6:
			draw(2, 37, 0x01);
			draw(2, 38, 0x01);
			draw(2, 40, 0x01);
			draw(2, 41, 0x01);
			draw(2, 39, 0xF1);
			draw(3,	39, 0x0F);
			draw(3, 37, 0x00);
			draw(3, 38, 0x00);
			draw(3, 40, 0x00);
			draw(3, 41, 0x00);
			break;	
		case 7:
			draw(2, 53, 0x01);
			draw(2, 54, 0x01);
			draw(2, 56, 0x01);
			draw(2, 57, 0x01);
			draw(2, 55, 0xF1);
			draw(3,	55, 0x0F);
			draw(3, 53, 0x00);
			draw(3, 54, 0x00);
			draw(3, 56, 0x00);
			draw(3, 57, 0x00);
			break;	
		case 8:
			draw(4, 5, 0x01);
			draw(4, 6, 0x01);	
			draw(4, 8, 0x01);
			draw(4, 9, 0x01);			
			draw(4, 7, 0xF1);
			draw(5,	7, 0x0F);
			draw(5, 5, 0x00);
			draw(5, 6, 0x00);
			draw(5, 8, 0x00);
			draw(5, 9, 0x00);
			break;
		case 9:
			draw(4, 21, 0x01);
			draw(4, 22, 0x01);
			draw(4, 24, 0x01);
			draw(4, 25, 0x01);
			draw(4, 23, 0xF1);
			draw(5,	23, 0x0F);
			draw(5, 21, 0x00);
			draw(5, 22, 0x00);
			draw(5, 24, 0x00);
			draw(5, 25, 0x00);
			break;	
		case 10:
			draw(4, 37, 0x01);
			draw(4, 38, 0x01);
			draw(4, 40, 0x01);
			draw(4, 41, 0x01);
			draw(4, 39, 0xF1);
			draw(5,	39, 0x0F);
			draw(5, 37, 0x00);
			draw(5, 38, 0x00);
			draw(5, 40, 0x00);
			draw(5, 41, 0x00);
			break;	
		case 11:
			draw(4, 53, 0x01);
			draw(4, 54, 0x01);
			draw(4, 56, 0x01);
			draw(4, 57, 0x01);
			draw(4, 55, 0xF1);
			draw(5,	55, 0x0F);
			draw(5, 53, 0x00);
			draw(5, 54, 0x00);
			draw(5, 56, 0x00);
			draw(5, 57, 0x00);
			break;	
		case 12:
			draw(6, 5, 0x01);
			draw(6, 6, 0x01);	
			draw(6, 8, 0x01);
			draw(6, 9, 0x01);			
			draw(6, 7, 0xF1);
			draw(7,	7, 0x8F);
			draw(7, 5, 0x80);
			draw(7, 6, 0x80);
			draw(7, 8, 0x80);
			draw(7, 9, 0x80);
			break;
		case 13:
			draw(6, 21, 0x01);
			draw(6, 22, 0x01);
			draw(6, 24, 0x01);
			draw(6, 25, 0x01);
			draw(6, 23, 0xF1);
			draw(7,	23, 0x8F);
			draw(7, 21, 0x80);
			draw(7, 22, 0x80);
			draw(7, 24, 0x80);
			draw(7, 25, 0x80);
			break;	
		case 14:
			draw(6, 37, 0x01);
			draw(6, 38, 0x01);
			draw(6, 40, 0x01);
			draw(6, 41, 0x01);
			draw(6, 39, 0xF1);
			draw(7,	39, 0x8F);
			draw(7, 37, 0x80);
			draw(7, 38, 0x80);
			draw(7, 40, 0x80);
			draw(7, 41, 0x80);
			break;	
		case 15:
			draw(6, 53, 0x01);
			draw(6, 54, 0x01);
			draw(6, 56, 0x01);
			draw(6, 57, 0x01);
			draw(6, 55, 0xF1);
			draw(7,	55, 0x8F);
			draw(7, 53, 0x80);
			draw(7, 54, 0x80);
			draw(7, 56, 0x80);
			draw(7, 57, 0x80);	
			break;
	}
}

void draw2(char pos){
	switch(pos)
	{
		case 0:
			draw(0, 5, 0x91);
			draw(1,	5, 0x0F);
			draw(0, 6, 0x91);
			draw(1, 6, 0x08);
			draw(0, 7, 0x91);
			draw(1, 7, 0x08);
			draw(0, 8, 0x91);
			draw(1, 8, 0x08);
			draw(0, 9, 0xF1);
			draw(1, 9, 0x08);
			break;
		case 1:
			draw(0, 21, 0x91);
			draw(1,	21, 0x0F);
			draw(0, 22, 0x91);
			draw(1, 22, 0x08);
			draw(0, 23, 0x91);
			draw(1, 23, 0x08);
			draw(0, 24, 0x91);
			draw(1, 24, 0x08);
			draw(0, 25, 0xF1);
			draw(1, 25, 0x08);
			break;
		case 2:
			draw(0, 37, 0x91);
			draw(1,	37, 0x0F);
			draw(0, 38, 0x91);
			draw(1, 38, 0x08);
			draw(0, 39, 0x91);
			draw(1, 39, 0x08);
			draw(0, 40, 0x91);
			draw(1, 40, 0x08);
			draw(0, 41, 0xF1);
			draw(1, 41, 0x08);
			break;
		case 3:
			draw(0, 53, 0x91);
			draw(1,	53, 0x0F);
			draw(0, 54, 0x91);
			draw(1, 54, 0x08);
			draw(0, 55, 0x91);
			draw(1, 55, 0x08);
			draw(0, 56, 0x91);
			draw(1, 56, 0x08);
			draw(0, 57, 0xF1);
			draw(1, 57, 0x08);
			break;
		case 4:
			draw(2, 5, 0x91);
			draw(3,	5, 0x0F);
			draw(2, 6, 0x91);
			draw(3, 6, 0x08);
			draw(2, 7, 0x91);
			draw(3, 7, 0x08);
			draw(2, 8, 0x91);
			draw(3, 8, 0x08);
			draw(2, 9, 0xF1);
			draw(3, 9, 0x08);
			break;
		case 5:	
			draw(2, 21, 0x91);
			draw(3,	21, 0x0F);
			draw(2, 22, 0x91);
			draw(3, 22, 0x08);
			draw(2, 23, 0x91);
			draw(3, 23, 0x08);
			draw(2, 24, 0x91);
			draw(3, 24, 0x08);
			draw(2, 25, 0xF1);
			draw(3, 25, 0x08);
			break;
		case 6:
			draw(2, 37, 0x91);
			draw(3,	37, 0x0F);
			draw(2, 38, 0x91);
			draw(3, 38, 0x08);
			draw(2, 39, 0x91);
			draw(3, 39, 0x08);
			draw(2, 40, 0x91);
			draw(3, 40, 0x08);
			draw(2, 41, 0xF1);
			draw(3, 41, 0x08);
			break;
		case 7:
			draw(2, 53, 0x91);	//0x91
			draw(3,	53, 0x0F);	//0x0F
			draw(2, 54, 0x91);	//0x91
			draw(3, 54, 0x08);	//0x08
			draw(2, 55, 0x91);	//0x091
			draw(3, 55, 0x08);	//0x08
			draw(2, 56, 0x91);	//0x91
			draw(3, 56, 0x08);	//0x08
			draw(2, 57, 0xF1);	//0xF1
			draw(3, 57, 0x08); //0x08
			break;
		case 8:
				draw(4, 5, 0x91);
				draw(5,	5, 0x0F);
				draw(4, 6, 0x91);
				draw(5, 6, 0x08);
				draw(4, 7, 0x91);
				draw(5, 7, 0x08);
				draw(4, 8, 0x91);
				draw(5, 8, 0x08);
				draw(4, 9, 0xF1);
				draw(5, 9, 0x08);
				break;
		case 9:
				draw(4, 21, 0x91);
				draw(5,	21, 0x0F);
				draw(4, 22, 0x91);
				draw(5, 22, 0x08);
				draw(4, 23, 0x91);
				draw(5, 23, 0x08);
				draw(4, 24, 0x91);
				draw(5, 24, 0x08);
				draw(4, 25, 0xF1);
				draw(5, 25, 0x08);
				break;
		case 10:
				draw(4, 37, 0x91);
				draw(5,	37, 0x0F);
				draw(4, 38, 0x91);
				draw(5, 38, 0x08);
				draw(4, 39, 0x91);
				draw(5, 39, 0x08);
				draw(4, 40, 0x91);
				draw(5, 40, 0x08);
				draw(4, 41, 0xF1);
				draw(5, 41, 0x08);
				break;
		case 11:
				draw(4, 53, 0x91);	//0x91
				draw(5,	53, 0x0F);	//0x0F
				draw(4, 54, 0x91);	//0x91
				draw(5, 54, 0x08);	//0x08
				draw(4, 55, 0x91);	//0x091
				draw(5, 55, 0x08);	//0x08
				draw(4, 56, 0x91);	//0x91
				draw(5, 56, 0x08);	//0x08
				draw(4, 57, 0xF1);	//0xF1
				draw(5, 57, 0x08); //0x08
				break;
		case 12:
				draw(6, 5, 0x91);
				draw(7,	5, 0x8F);
				draw(6, 6, 0x91);
				draw(7, 6, 0x88);
				draw(6, 7, 0x91);
				draw(7, 7, 0x88);
				draw(6, 8, 0x91);
				draw(7, 8, 0x88);
				draw(6, 9, 0xF1);
				draw(7, 9, 0x88);
				break;
		case 13:
				draw(6, 21, 0x91);
				draw(7,	21, 0x8F);
				draw(6, 22, 0x91);
				draw(7, 22, 0x88);
				draw(6, 23, 0x91);
				draw(7, 23, 0x88);
				draw(6, 24, 0x91);
				draw(7, 24, 0x88);
				draw(6, 25, 0xF1);
				draw(7, 25, 0x88);
				break;
		case 14:
				draw(6, 37, 0x91);
				draw(7,	37, 0x8F);
				draw(6, 38, 0x91);
				draw(7, 38, 0x88);
				draw(6, 39, 0x91);
				draw(7, 39, 0x88);
				draw(6, 40, 0x91);
				draw(7, 40, 0x88);
				draw(6, 41, 0xF1);
				draw(7, 41, 0x88);
				break;
		case 15:
				draw(6, 53, 0x91);	//0x91
				draw(7,	53, 0x8F);	//0x0F
				draw(6, 54, 0x91);	//0x91
				draw(7, 54, 0x88);	//0x08
				draw(6, 55, 0x91);	//0x091
				draw(7, 55, 0x88);	//0x08
				draw(6, 56, 0x91);	//0x91
				draw(7, 56, 0x88);	//0x08
				draw(6, 57, 0xF1);	//0xF1
				draw(7, 57, 0x88); //0x08
				break;
	}
}

void draw3(char pos){
	switch(pos)
	{
		case 0:
			draw(0, 5, 0x11);
			draw(1,	5, 0x08);
			draw(0, 6, 0x91);
			draw(1, 6, 0x08);
			draw(0, 7, 0x91);
			draw(1, 7, 0x08);
			draw(0, 8, 0x91);
			draw(1, 8, 0x08);
			draw(0, 9, 0xF1);
			draw(1, 9, 0x0F);
			break;
		case 1:
			draw(0, 21, 0x11);
			draw(1,	21, 0x08);
			draw(0, 22, 0x91);
			draw(1, 22, 0x08);
			draw(0, 23, 0x91);
			draw(1, 23, 0x08);
			draw(0, 24, 0x91);
			draw(1, 24, 0x08);
			draw(0, 25, 0xF1);
			draw(1, 25, 0x0F);
			break;
		case 2:
			draw(0, 37, 0x11);
			draw(1,	37, 0x08);
			draw(0, 38, 0x91);
			draw(1, 38, 0x08);
			draw(0, 39, 0x91);
			draw(1, 39, 0x08);
			draw(0, 40, 0x91);
			draw(1, 40, 0x08);
			draw(0, 41, 0xF1);
			draw(1, 41, 0x0F);
			break;
		case 3:
			draw(0, 53, 0x11);
			draw(1,	53, 0x08);
			draw(0, 54, 0x91);
			draw(1, 54, 0x08);
			draw(0, 55, 0x91);
			draw(1, 55, 0x08);
			draw(0, 56, 0x91);
			draw(1, 56, 0x08);
			draw(0, 57, 0xF1);
			draw(1, 57, 0x0F);
			break;
		case 4:
			draw(2, 5, 0x11);
			draw(3,	5, 0x08);
			draw(2, 6, 0x91);
			draw(3, 6, 0x08);
			draw(2, 7, 0x91);
			draw(3, 7, 0x08);
			draw(2, 8, 0x91);
			draw(3, 8, 0x08);
			draw(2, 9, 0xF1);
			draw(3, 9, 0x0F);
			break;
		case 5:
			draw(2, 21, 0x11);
			draw(3,	21, 0x08);
			draw(2, 22, 0x91);
			draw(3, 22, 0x08);
			draw(2, 23, 0x91);
			draw(3, 23, 0x08);
			draw(2, 24, 0x91);
			draw(3, 24, 0x08);
			draw(2, 25, 0xF1);
			draw(3, 25, 0x0F);
			break;
		case 6:
			draw(2, 37, 0x11);
			draw(3,	37, 0x08);
			draw(2, 38, 0x91);
			draw(3, 38, 0x08);
			draw(2, 39, 0x91);
			draw(3, 39, 0x08);
			draw(2, 40, 0x91);
			draw(3, 40, 0x08);
			draw(2, 41, 0xF1);
			draw(3, 41, 0x0F);
			break;
		case 7:
			draw(2, 53, 0x11);	//0x91
			draw(3,	53, 0x08);	//0x0F
			draw(2, 54, 0x91);	//0x91
			draw(3, 54, 0x08);	//0x08
			draw(2, 55, 0x91);	//0x091
			draw(3, 55, 0x08);	//0x08
			draw(2, 56, 0x91);	//0x91
			draw(3, 56, 0x08);	//0x08
			draw(2, 57, 0xF1);	//0xF1
			draw(3, 57, 0x0F); //0x08
			break;
		case 8:
			draw(4, 5, 0x11);
			draw(5,	5, 0x08);
			draw(4, 6, 0x91);
			draw(5, 6, 0x08);
			draw(4, 7, 0x91);
			draw(5, 7, 0x08);
			draw(4, 8, 0x91);
			draw(5, 8, 0x08);
			draw(4, 9, 0xF1);
			draw(5, 9, 0x0F);
			break;
		case 9:
			draw(4, 21, 0x11);
			draw(5,	21, 0x08);
			draw(4, 22, 0x91);
			draw(5, 22, 0x08);
			draw(4, 23, 0x91);
			draw(5, 23, 0x08);
			draw(4, 24, 0x91);
			draw(5, 24, 0x08);
			draw(4, 25, 0xF1);
			draw(5, 25, 0x0F);
			break;
		case 10:
			draw(4, 37, 0x11);
			draw(5,	37, 0x08);
			draw(4, 38, 0x91);
			draw(5, 38, 0x08);
			draw(4, 39, 0x91);
			draw(5, 39, 0x08);
			draw(4, 40, 0x91);
			draw(5, 40, 0x08);
			draw(4, 41, 0xF1);
			draw(5, 41, 0x0F);
			break;
		case 11:
			draw(4, 53, 0x11);	//0x91
			draw(5,	53, 0x08);	//0x0F
			draw(4, 54, 0x91);	//0x91
			draw(5, 54, 0x08);	//0x08
			draw(4, 55, 0x91);	//0x091
			draw(5, 55, 0x08);	//0x08
			draw(4, 56, 0x91);	//0x91
			draw(5, 56, 0x08);	//0x08
			draw(4, 57, 0xF1);	//0xF1
			draw(5, 57, 0x0F); //0x08
			break;
		case 12:
			draw(6, 5, 0x11);
			draw(7,	5, 0x88);
			draw(6, 6, 0x91);
			draw(7, 6, 0x88);
			draw(6, 7, 0x91);
			draw(7, 7, 0x88);
			draw(6, 8, 0x91);
			draw(7, 8, 0x88);
			draw(6, 9, 0xF1);
			draw(7, 9, 0x8F);
			break;
		case 13:
			draw(6, 21, 0x11);
			draw(7,	21, 0x88);
			draw(6, 22, 0x91);
			draw(7, 22, 0x88);
			draw(6, 23, 0x91);
			draw(7, 23, 0x88);
			draw(6, 24, 0x91);
			draw(7, 24, 0x88);
			draw(6, 25, 0xF1);
			draw(7, 25, 0x8F);
			break;
		case 14:
			draw(6, 37, 0x11);
			draw(7,	37, 0x88);
			draw(6, 38, 0x91);
			draw(7, 38, 0x88);
			draw(6, 39, 0x91);
			draw(7, 39, 0x88);
			draw(6, 40, 0x91);
			draw(7, 40, 0x88);
			draw(6, 41, 0xF1);
			draw(7, 41, 0x8F);
			break;
		case 15:
			draw(6, 53, 0x11);	//0x91
			draw(7,	53, 0x88);	//0x0F
			draw(6, 54, 0x91);	//0x91
			draw(7, 54, 0x88);	//0x08
			draw(6, 55, 0x91);	//0x091
			draw(7, 55, 0x88);	//0x08
			draw(6, 56, 0x91);	//0x91
			draw(7, 56, 0x88);	//0x08
			draw(6, 57, 0xF1);	//0xF1
			draw(7, 57, 0x8F); //0x08
			break;
	}
}

void draw4(char pos){
	switch(pos)
	{
		case 0:
			draw(0, 5, 0xF1);
			draw(0, 6, 0x81);
			draw(0, 7, 0x81);
			draw(0, 8, 0x81);
			draw(0, 9, 0xF1);
			draw(1, 9, 0x0F);
			draw(1, 5, 0x00);
			draw(1, 6, 0x00);
			draw(1, 7, 0x00);
			draw(1, 8, 0x00);
			break;
		case 1:
			draw(0, 21, 0xF1);
			draw(0, 22, 0x81);
			draw(0, 23, 0x81);
			draw(0, 24, 0x81);
			draw(0, 25, 0xF1);
			draw(1, 25, 0x0F);
			draw(1, 21, 0x00);
			draw(1, 22, 0x00);
			draw(1, 23, 0x00);
			draw(1, 24, 0x00);
			break;
		case 2:
			draw(0, 37, 0xF1);
			draw(0, 38, 0x81);
			draw(0, 39, 0x81);
			draw(0, 40, 0x81);
			draw(0, 41, 0xF1);
			draw(1, 41, 0x0F);
			draw(1, 37, 0x00);
			draw(1, 38, 0x00);
			draw(1, 39, 0x00);
			draw(1, 40, 0x00);
			break;
		case 3:
			draw(0, 53, 0xF1);
			draw(0, 54, 0x81);
			draw(0, 55, 0x81);
			draw(0, 56, 0x81);
			draw(0, 57, 0xF1);
			draw(1, 57, 0x0F);
			draw(1, 53, 0x00);
			draw(1, 54, 0x00);
			draw(1, 55, 0x00);
			draw(1, 56, 0x00);
			break;
		case 4:
			draw(2, 5, 0xF1);
			draw(2, 6, 0x81);
			draw(2, 7, 0x81);
			draw(2, 8, 0x81);
			draw(2, 9, 0xF1);
			draw(3, 9, 0x0F);
			draw(3, 5, 0x00);
			draw(3, 6, 0x00);
			draw(3, 7, 0x00);
			draw(3, 8, 0x00);
			break;
		case 5:
			draw(2, 21, 0xF1);
			draw(2, 22, 0x81);
			draw(2, 23, 0x81);
			draw(2, 24, 0x81);
			draw(2, 25, 0xF1);
			draw(3, 25, 0x0F);
			draw(3, 21, 0x00);
			draw(3, 22, 0x00);
			draw(3, 23, 0x00);
			draw(3, 24, 0x00);
			break;
		case 6:
			draw(2, 37, 0xF1);
			draw(2, 38, 0x81);
			draw(2, 39, 0x81);
			draw(2, 40, 0x81);
			draw(2, 41, 0xF1);
			draw(3, 41, 0x0F);
			draw(3, 37, 0x00);	
			draw(3, 38, 0x00);
			draw(3, 39, 0x00);
			draw(3, 40, 0x00);
			break;
		case 7:
			draw(2, 53, 0xF1);
			draw(2, 54, 0x81);
			draw(2, 55, 0x81);
			draw(2, 56, 0x81);
			draw(2, 57, 0xF1);
			draw(3, 57, 0x0F);
			draw(3, 53, 0x00);
			draw(3, 54, 0x00);
			draw(3, 55, 0x00);
			draw(3, 56, 0x00);
			break;
		case 8:
			draw(4, 5, 0xF1);
			draw(4, 6, 0x81);
			draw(4, 7, 0x81);
			draw(4, 8, 0x81);
			draw(4, 9, 0xF1);
			draw(5, 9, 0x0F);
			draw(5, 5, 0x00);
			draw(5, 6, 0x00);
			draw(5, 7, 0x00);
			draw(5, 8, 0x00);
			break;
		case 9:
			draw(4, 21, 0xF1);
			draw(4, 22, 0x81);
			draw(4, 23, 0x81);
			draw(4, 24, 0x81);
			draw(4, 25, 0xF1);
			draw(5, 25, 0x0F);
			draw(5, 21, 0x00);
			draw(5, 22, 0x00);
			draw(5, 23, 0x00);
			draw(5, 24, 0x00);
			break;
		case 10:
			draw(4, 37, 0xF1);
			draw(4, 38, 0x81);
			draw(4, 39, 0x81);
			draw(4, 40, 0x81);
			draw(4, 41, 0xF1);
			draw(5, 41, 0x0F);
			draw(5, 37, 0x00);
			draw(5, 38, 0x00);
			draw(5, 39, 0x00);
			draw(5, 40, 0x00);
			break;
		case 11:
			draw(4, 53, 0xF1);
			draw(4, 54, 0x81);
			draw(4, 55, 0x81);
			draw(4, 56, 0x81);
			draw(4, 57, 0xF1);
			draw(5, 57, 0x0F);
			draw(5, 53, 0x00);
			draw(5, 54, 0x00);
			draw(5, 55, 0x00);
			draw(5, 56, 0x00);
			break;
		case 12:
			draw(6, 5, 0xF1);
			draw(6, 6, 0x81);
			draw(6, 7, 0x81);
			draw(6, 8, 0x81);
			draw(6, 9, 0xF1);
			draw(7, 9, 0x8F);
			draw(7, 5, 0x80);
			draw(7, 6, 0x80);
			draw(7, 7, 0x80);
			draw(7, 8, 0x80);
			break;
		case 13:
			draw(6, 21, 0xF1);
			draw(6, 22, 0x81);
			draw(6, 23, 0x81);
			draw(6, 24, 0x81);
			draw(6, 25, 0xF1);
			draw(7, 25, 0x8F);
			draw(7, 21, 0x80);
			draw(7, 22, 0x80);
			draw(7, 23, 0x80);
			draw(7, 24, 0x80);
			break;
		case 14:
			draw(6, 37, 0xF1);
			draw(6, 38, 0x81);
			draw(6, 39, 0x81);
			draw(6, 40, 0x81);
			draw(6, 41, 0xF1);
			draw(7, 41, 0x8F);
			draw(7, 37, 0x80);
			draw(7, 38, 0x80);
			draw(7, 39, 0x80);
			draw(7, 40, 0x80);
			break;
		case 15:
				draw(6, 53, 0xF1);
				draw(6, 54, 0x81);
				draw(6, 55, 0x81);
				draw(6, 56, 0x81);
				draw(6, 57, 0xF1);
				draw(7, 57, 0x8F);
				draw(7, 53, 0x80);
				draw(7, 54, 0x80);
				draw(7, 55, 0x80);
				draw(7, 56, 0x80);
			break;
	}
}

 void drawGrid(){
	for(char i = 0; i < 64; i++){  //Ritar linje v 1
		draw(0, i, 0x01);
	}
	for(char i = 0; i < 64; i++){  //Ritar linje v 2
		draw(2, i, 0x01);
	}
	for(char i = 0; i < 64; i++){  //Ritar linje v 3
		draw(4, i, 0x01);
	}
	for(char i = 0; i < 64; i++){  //Ritar linje v 4
		draw(6, i, 0x01);
	}
	for(char i = 0; i < 64; i++){  //Ritar linje v 5
		draw(7, i, 0x80);
	}
	for(char i = 0; i < 8; i++){  // Ritar linje l 1
		draw(i, 0, 0xff);
	}
	for(char i = 0; i < 8; i++){  // Ritar linje l 2
		draw(i, 15, 0xff);
	}
	for(char i = 0; i < 8; i++){  // Ritar linje l 3
		draw(i, 31, 0xff);
	}
	for(char i = 0; i < 8; i++){  // Ritar linje l 4
		draw(i, 47, 0xff);
	}
	for(char i = 0; i < 8; i++){  // Ritar linje l 5
		draw(i, 63, 0xff);
	}
}

void drawMenu(){
	for(char i = 15; i < 48; i++){  // Ritar rutn‰t
		drawC2(0, i, 0x01);
	}
	for(char i = 15; i < 48; i++){
		drawC2(7, i, 0x80);
	}
	for(char i = 0; i < 8; i++){
		drawC2(i, 15, 0xff);
	}
	for(char i = 0; i < 8; i++){
		drawC2(i, 47, 0xff);
	}
	for(char i = 0; i < 8; i++){
		drawC2(i, 23, 0xff);
	}
	drawC2(0, 35, 0xF1);		// Ritar 1
	drawC2(1, 35, 0x0F);
	drawC2(2, 33, 0x90);		// Ritar 2
	drawC2(3, 33, 0x0F);
	drawC2(2, 34, 0x90);
	drawC2(3, 34, 0x08);
	drawC2(2, 35, 0x90);
	drawC2(3, 35, 0x08);
	drawC2(2, 36, 0x90);
	drawC2(3, 36, 0x08);
	drawC2(2, 37, 0xF0);
	drawC2(3, 37, 0x08);
	drawC2(4, 33, 0x10);			// Ritar 3
	drawC2(5, 33, 0x08);
	drawC2(4, 34, 0x90);
	drawC2(5, 34, 0x08);
	drawC2(4, 35, 0x90);
	drawC2(5, 35, 0x08);
	drawC2(4, 36, 0x90);
	drawC2(5, 36, 0x08);
	drawC2(4, 37, 0xF0);
	drawC2(5, 37, 0x0F);
	drawC2(6, 33, 0xF0);			// Ritar 4
	drawC2(6, 34, 0x80);
	drawC2(6, 35, 0x80);
	drawC2(6, 36, 0x80);
	drawC2(6, 37, 0xF0);
	drawC2(7, 37, 0x8F);
	drawC2(7, 33, 0x80);
	drawC2(7, 34, 0x80);
	drawC2(7, 35, 0x80);
	drawC2(7, 36, 0x80);
}

void setMatrixValue(char pos, char value){
	switch(pos){
		case 0:
			matrix[0][0] = value;
			break;
		case 1:
			matrix[0][1] = value;
			break;
		case 2:
			matrix[0][2] = value;
			break;
		case 3:
			matrix[0][3] = value;
			break;
		case 4:
			matrix[1][0] = value;
			break;
		case 5:
			matrix[1][1] = value;
			break;
		case 6:
			matrix[1][2] = value;
			break;
		case 7:
			matrix[1][3] = value;
			break;
		case 8:
			matrix[2][0] = value;
			break;
		case 9:
			matrix[2][1] = value;
			break;
		case 10:
			matrix[2][2] = value;
			break;
		case 11:
			matrix[2][3] = value;
			break;
		case 12:
			matrix[3][0] = value;
			break;
		case 13:
			matrix[3][1] = value;
			break;
		case 14:
			matrix[3][2] = value;
			break;
		case 15:
			matrix[3][3] = value;
			break;				
	}
}

void redLed(){
	PORTD = PORTD | 0x80;
}

void greenLed(){
	PORTD = PORTD | 0x40;
}

bool validate(char row, char column, char val){
	for(char i = 0; i < 4; i ++){
		if(val == matrix[row][i] && column != i){
			return false;
		}
	}
	
	for(char i = 0; i < 4; i++){
		if(val == matrix[i][column] && row != i){
			return false;
		}
	}
	
	for(char i = (row/2)*2; i < ((row/2)*2) + 2; i++){
		for(char j = (column/2)*2; j < ((column/2)*2)+2; j++){
			if(val == matrix[i][j] && row != i && column != j){
				return false;
			}
		}
		
	}
	return true;
}

void checkSolution(){
	char a = 0;
	for(char i = 0; i < 4; i++){
		for(char j = 0; j < 4; j++){
			char val = matrix[i][j];
			if(!validate(i, j, val)){
				a = 1;
			}	
		}
	}
	if(a == 1){
		redLed();
	} else {
		greenLed();
	}
}