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(); } }