LED-BOARD/LED-Board.ino
2019-11-10 14:25:30 +01:00

179 lines
2.9 KiB
C++

#define LOAD 10
#define DATA 8
#define CLOCK 9
#define MAX_WIDTH 32
#define MAX_HEIGHT 40
typedef struct image_t {
int width;
int height;
byte data[MAX_WIDTH * MAX_HEIGHT];
};
image_t img;
byte get_pixel(image_t* p, int x, int y) {
if(check_bounds(p, x, y) == false) {
return 0;
}
return p->data[y*p->width + x];
}
void set_pixel(image_t* p, int x, int y, byte value) {
if(check_bounds(p, x, y) == false) {
return;
}
p->data[y*p->width + x] = value;
}
bool check_bounds(image_t* p, int x, int y) {
if(p == NULL) {
return false;
}
if((x < 0) || (y < 0)) {
return false;
}
if((x > p->width) || (y > p->height)) {
return false;
}
return true;
}
void clear_pixels(image_t* p) {
if(p == NULL) {
return;
}
memset(p->data, 0, sizeof(p->data));
}
void setup() {
Serial.begin(115200);
img.width = 32;
img.height = 40;
pinMode(DATA,OUTPUT);
pinMode(CLOCK,OUTPUT);
pinMode(LOAD,OUTPUT);
}
void send_block(image_t* p, int x, int y) {
int order[32][2] = {
{ 1, 1 }, // 1
{ 1, 0 }, // 2
{ 0, 1 }, // 3
{ 1, 2 }, // 4
{ 0, 2 }, // 5
{ 1, 3 }, // 6
{ 0, 0 }, // 7
{ 0, 3 }, // 8
{ 0, 4 }, // 9
{ 1, 4 }, // 10
{ 0, 5 }, // 11
{ 1, 7 }, // 12
{ 1, 5 }, // 13
{ 0, 6 }, // 14
{ 1, 6 }, // 15
{ 0, 7 }, // 16
{ 3, 7 }, // 17
{ 2, 6 }, // 18
{ 2, 7 }, // 19
{ 3, 6 }, // 20
{ 2, 5 }, // 21
{ 3, 5 }, // 22
{ 3, 4 }, // 23
{ 2, 4 }, // 24
{ 3, 3 }, // 25
{ 2, 0 }, // 26
{ 3, 0 }, // 27
{ 2, 3 }, // 28
{ 3, 2 }, // 29
{ 2, 1 }, // 30
{ 3, 1 }, // 31
{ 2, 2 }, // 32
};
for(int n = 0; n < 32; n++) {
int x_offset = order[n][0];
int y_offset = order[n][1];
byte pixel = get_pixel(p, x + x_offset, y + y_offset);
digitalWrite(DATA, pixel);
clock();
}
// 33 bit - kein pixel - senden
clock();
}
void send_image(image_t* p) {
for(int y = 0; y < img.height; y+=8) {
for(int x = 0; x < img.width; x+=4) {
send_block(p, x, y);
}
}
load();
}
void clock() {
digitalWrite(CLOCK,HIGH);
digitalWrite(CLOCK,LOW);
}
void load() {
digitalWrite(LOAD,HIGH);
digitalWrite(LOAD,LOW);
}
void loop() {
/*
static int offset = 0;
digitalWrite(DATA, LOW);
for(int i = 0; i < 1320; i++) {
clock();
}
digitalWrite(DATA, HIGH);
for(int i = 0; i < 33; i++) {
clock();
}
digitalWrite(DATA, LOW);
for(int i = 0; i < offset; i++) {
clock();
}
offset++;
*/
clear_pixels(&img);
/*
static int offset = 0;
for(int n = 0; n < 40; n++) {
set_pixel(&img, (n + offset) % 32, n, 1);
set_pixel(&img, (n + 16 + offset) % 32, n, 1);
}
offset = (offset + 1) % 33;
*/
memcpy(&(img.data), &invader, sizeof(invader));
/*
for(int x = 0; x < 4; x++) {
for(int y = 0; y < 8; y++) {
set_pixel(&img, x, y, 1);
}
}
*/
send_image(&img);
//delay(100);
}