#define ROW_1 10 // pin matice 9
#define ROW_2 A1 // pin 14
#define ROW_3 2 // pin 8
#define ROW_4 13 // pin 12
#define ROW_5 9 // pin 1
#define ROW_6 3 // pin 7
#define ROW_7 8 // pin 2
#define ROW_8 5 // pin 5
#define COL_1 A0 // pin 13
#define COL_2 7 // pin 3
#define COL_3 6 // pin 4
#define COL_4 11 // pin 10
#define COL_5 4 // pin 6
#define COL_6 12 // pin 11
#define COL_7 A2 // pin 15
#define COL_8 A3 // pin 16
const byte rows[] = {
ROW_1, ROW_2, ROW_3, ROW_4, ROW_5, ROW_6, ROW_7, ROW_8
};
byte radek_1=B00000000;
byte radek_2=B00000000;
byte radek_3=B00000000;
byte radek_4=B00000000;
byte radek_5=B00000000;
byte radek_6=B00000000;
byte radek_7=B00000000;
byte radek_8=B00000000;
byte b=0;
int radekCount=0;
int x=0;
int pozicePadu=0;
// kódy káždého znaku, zobrazeného na displeji
// jako Hexadecimal
int timeCount = 0;
void setup() {
// nastavení pinů displeje jako výstupu
for (byte i = 2; i <= 13; i++) {
pinMode(i, OUTPUT);
}
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
Serial.begin(9600);
}
void loop() {
// Pauzu můžeš odstranit.
// tím pádem bude displej jasnější.
delay(2);
if (timeCount == 0) {
radekCount += 1;
posundolu();
}
timeCount += 1;
if(timeCount < 40 ) {
drawScreen();
// } else if (timeCount < 110) {
// nic neděláme -> pauza mezi znaky
// a zase od začátku...
} else if (timeCount == 41) {
timeCount = 0;
}
}
void drawScreen(){
byte heart[]={radek_1,radek_2,radek_3,radek_4,radek_5,radek_6,radek_7,radek_8};
for (byte i = 0; i < 8; i++) {
b = heart[i];
setColumns(); // zobraz sloupce pro tento konkrétní řádek
digitalWrite(rows[i], LOW); // zapínáme každý řádek v sérii
delay(2);
digitalWrite(rows[i], HIGH);
// nastav na 50 až 100, chceš-li vidět multiplexní efekt!!!
}
}
void setColumns() {
digitalWrite(COL_1, (b >> 0) & 0x01); // získat a vypsat 1 bit: 10000000
digitalWrite(COL_2, (b >> 1) & 0x01); // získat 2 bit: 01000000
digitalWrite(COL_3, (b >> 2) & 0x01); // získat 3 bit: 00100000
digitalWrite(COL_4, (b >> 3) & 0x01); // získat 4 bit: 00010000
digitalWrite(COL_5, (b >> 4) & 0x01); // získat 5 bit: 00001000
digitalWrite(COL_6, (b >> 5) & 0x01); // získat 6 bit: 00000100
digitalWrite(COL_7, (b >> 6) & 0x01); // získat 7 bit: 00000010
digitalWrite(COL_8, (b >> 7) & 0x01); // získat 8 bit: 00000001
}
void posundolu() {
switch (radekCount) {
case 1:
pozicePadu=random(0,8);
if (bitRead(radek_1,pozicePadu)==1)
{(radekCount=0);
if (radek_1==255){
konec();
}
} else {bitSet(radek_1,pozicePadu);
}
break;
case 2:
if (bitRead(radek_2,pozicePadu)==1)
{radekCount=0;
} else {bitSet(radek_2,pozicePadu);
bitClear(radek_1,pozicePadu);
}
break;
case 3:
if (bitRead(radek_3,pozicePadu)==1)
{radekCount=0;
} else {bitSet(radek_3,pozicePadu);
bitClear(radek_2,pozicePadu);
}
break;
case 4:
if (bitRead(radek_4,pozicePadu)==1)
{radekCount=0;
} else {bitSet(radek_4,pozicePadu);
bitClear(radek_3,pozicePadu);
}
break;
case 5:
if (bitRead(radek_5,pozicePadu)==1)
{radekCount=0;
} else {bitSet(radek_5,pozicePadu);
bitClear(radek_4,pozicePadu);
}
break;
case 6:
if (bitRead(radek_6,pozicePadu)==1)
{radekCount=0;
} else {bitSet(radek_6,pozicePadu);
bitClear(radek_5,pozicePadu);
}
break;
case 7:
if (bitRead(radek_7,pozicePadu)==1)
{radekCount=0;
} else {bitSet(radek_7,pozicePadu);
bitClear(radek_6,pozicePadu);
}
break;
case 8:
if (bitRead(radek_8,pozicePadu)==1)
{radekCount=0;
} else {bitSet(radek_8,pozicePadu);
bitClear(radek_7,pozicePadu);
radekCount=0;
}
break;
default:
break;
}
}
void konec() {
radek_1=B00000000;
radek_2=B00000000;
radek_3=B00000000;
radek_4=B00000000;
radek_5=B00000000;
radek_6=B00000000;
radek_7=B00000000;
radek_8=B00000000;
for (x=0; x < 100; x++) {
drawScreen();
}
radekCount=0;
}