#include "mbed.h"
// Definiši pinove za 7-segmentni displej i prekidače
DigitalOut D1(PTD4);
DigitalOut D2(PTD5);
DigitalOut D3(PTD6);
DigitalOut D4(PTD7);
DigitalOut A(PTA8);
DigitalOut B(PTA9);
DigitalOut C(PTA10);
DigitalOut D(PTA11);
DigitalOut E(PTA12);
DigitalOut F(PTA13);
DigitalOut G(PTA14);
DigitalOut DP(PTA15);
DigitalIn rows[] = {PTB21, PTB22, PTB26, PTB27};
DigitalOut columns[] = {PTB0, PTB1, PTB2, PTB3};
int pos[] = {1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1};
int password[] = {1,2,3,4};
int newpass[] = {0,0,0,0};
int counter = 0;
int temp = 0;
bool auto_mode = true;
// Funkcija za prikazivanje svih segmenata
void points() {
A = 1; B = 1; C = 1; D = 1; E = 1; F = 1; G = 1;
for (int i = 0; i < 250; i += 10) {
DP = 0;
D1 = 1; D2 = 0; D3 = 0; D4 = 0;
ThisThread::sleep_for(2ms);
D1 = 0;
D2 = 1; ThisThread::sleep_for(2ms);
D2 = 0;
D3 = 1; ThisThread::sleep_for(2ms);
D3 = 0;
D4 = 1; ThisThread::sleep_for(2ms);
D4 = 0;
DP = 1; ThisThread::sleep_for(200ms);
}
}
// Funkcija za prikaz broja na 7-segmentnom displeju
void funk(int znak) {
switch(znak) {
case 0: A = 0; B = 0; C = 0; D = 0; E = 0; F = 0; G = 1; break;
case 1: A = 1; B = 0; C = 0; D = 1; E = 1; F = 1; G = 1; break;
case 2: A = 0; B = 0; C = 1; D = 0; E = 0; F = 1; G = 0; break;
case 3: A = 0; B = 0; C = 0; D = 0; E = 1; F = 1; G = 0; break;
case 4: A = 1; B = 0; C = 0; D = 0; E = 1; F = 0; G = 0; break;
case 5: A = 0; B = 1; C = 0; D = 0; E = 1; F = 0; G = 0; break;
case 6: A = 0; B = 1; C = 0; D = 0; E = 0; F = 0; G = 0; break;
case 7: A = 0; B = 0; C = 0; D = 1; E = 1; F = 1; G = 1; break;
case 8: A = 0; B = 0; C = 0; D = 0; E = 0; F = 0; G = 0; break;
case 9: A = 0; B = 0; C = 0; D = 0; E = 1; F = 0; G = 0; break;
case 10: A = 1; B = 1; C = 1; D = 1; E = 1; F = 1; G = 0; break;
}
}
// Funkcija za ponavljanje broja
void repeat(int tmp) {
for (int m = 0; m < 125; m++) {
funk(temp);
D4 = 0; D1 = 1; ThisThread::sleep_for(2ms);
D1 = 0; D2 = 1; ThisThread::sleep_for(2ms);
D2 = 0; D3 = 1; ThisThread::sleep_for(2ms);
D3 = 0; D4 = 1; ThisThread::sleep_for(2ms);
}
}
// Funkcija za prikaz greške
void incorrect() {
for (int j = 0; j < 10; j++) {
D4 = 0;
funk(10);
D1 = 1; ThisThread::sleep_for(2ms);
D1 = 0;
funk(10);
D2 = 1; ThisThread::sleep_for(2ms);
D2 = 0;
funk(10);
D3 = 1; ThisThread::sleep_for(2ms);
D3 = 0;
funk(10);
D4 = 1; ThisThread::sleep_for(2ms);
D1 = 0; D2 = 0; D3 = 0; D4 = 0; ThisThread::sleep_for(500ms);
}
}
// Funkcija za postavljanje broja na displej
void set_display() {
D4 = 0; funk(newpass[0]); D1 = 1; ThisThread::sleep_for(2ms);
D1 = 0; funk(newpass[1]); D2 = 1; ThisThread::sleep_for(2ms);
D2 = 0; funk(newpass[2]); D3 = 1; ThisThread::sleep_for(2ms);
D3 = 0; funk(newpass[3]); D4 = 1; ThisThread::sleep_for(2ms);
}
int main() {
while (true) {
if (newpass[0] == 11) {
incorrect();
newpass[0] = 0; newpass[1] = 0; newpass[2] = 0; newpass[3] = 0;
set_display();
}
for (int i = 0; i < 16; i += 4) {
columns[0] = pos[i];
columns[1] = pos[i+1];
columns[2] = pos[i+2];
columns[3] = pos[i+3];
if (rows[0] == 1) {
funk(i/4 + 1);
newpass[counter] = (i/4 + 1);
counter++;
ThisThread::sleep_for(200ms);
} else if (rows[1] == 1) {
funk(i/4 + 4);
newpass[counter] = (i/4 + 4);
counter++;
ThisThread::sleep_for(200ms);
} else if (rows[2] == 1) {
funk(i/4 + 7);
newpass[counter] = (i/4 + 7);
counter++;
ThisThread::sleep_for(200ms);
} else if (rows[3] == 1) {
if (columns[2] == 1) {
for (int k = 0; k < 4; k++) {
if (newpass[k] != password[k]) {
newpass[0] = 11; newpass[1] = 11; newpass[2] = 11; newpass[3] = 11;
temp++;
break;
}
}
counter = 0;
if (temp == 0) {
points();
DP = 1;
newpass[0] = 0; newpass[1] = 0; newpass[2] = 0; newpass[3] = 0;
}
} else if (columns[1] == 1) {
funk(0);
newpass[counter] = 0;
counter++;
ThisThread::sleep_for(200ms);
}
if (temp == 3) temp = 9;
while (temp > 0) {
repeat(temp);
temp--;
}
temp = 0;
newpass[0] = 0; newpass[1] = 0; newpass[2] = 0; newpass[3] = 0;
}
}
}
}