Fixed pixel mapping
This commit is contained in:
parent
14316190c5
commit
9975153300
178
LED-Board.ino
Normal file
178
LED-Board.ino
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
#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);
|
||||||
|
}
|
@ -1,126 +0,0 @@
|
|||||||
#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) {
|
|
||||||
return p->data[y*p->width + x];
|
|
||||||
}
|
|
||||||
|
|
||||||
byte set_pixel(image_t* p, int x, int y, byte value) {
|
|
||||||
p->data[y*p->width + x] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
Serial.begin(115200);
|
|
||||||
|
|
||||||
img.width = 32;
|
|
||||||
img.height = 40;
|
|
||||||
|
|
||||||
// put your setup code here, to run once:
|
|
||||||
byte pixel = 1;
|
|
||||||
for(int y = 0; y < img.height; y++) {
|
|
||||||
pixel = y % 2;
|
|
||||||
for(int x = 0; x < img.width; x++) {
|
|
||||||
set_pixel(&img, x, y, pixel);
|
|
||||||
pixel = !pixel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pinMode(DATA,OUTPUT);
|
|
||||||
pinMode(CLOCK,OUTPUT);
|
|
||||||
pinMode(LOAD,OUTPUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
void send_block(image_t* p, int x, int y) {
|
|
||||||
int order[32][2] = {
|
|
||||||
{ 6, 2 }, // 32
|
|
||||||
{ 7, 2 }, // 31
|
|
||||||
{ 6, 3 }, // 30
|
|
||||||
{ 5, 2 }, // 29
|
|
||||||
{ 5, 3 }, // 28
|
|
||||||
{ 4, 2 }, // 27
|
|
||||||
{ 7, 3 }, // 26
|
|
||||||
{ 4, 3 }, // 25
|
|
||||||
{ 3, 3 }, // 24
|
|
||||||
{ 3, 2 }, // 23
|
|
||||||
{ 2, 3 }, // 22
|
|
||||||
{ 0, 2 }, // 21
|
|
||||||
{ 2, 2 }, // 20
|
|
||||||
{ 1, 3 }, // 19
|
|
||||||
{ 1, 2 }, // 18
|
|
||||||
{ 0, 3 }, // 17
|
|
||||||
{ 0, 0 }, // 16
|
|
||||||
{ 1, 1 }, // 15
|
|
||||||
{ 0, 1 }, // 14
|
|
||||||
{ 1, 0 }, // 13
|
|
||||||
{ 2, 1 }, // 12
|
|
||||||
{ 2, 0 }, // 11
|
|
||||||
{ 3, 0 }, // 10
|
|
||||||
{ 3, 1 }, // 9
|
|
||||||
{ 4, 0 }, // 8
|
|
||||||
{ 7, 1 }, // 7
|
|
||||||
{ 7, 0 }, // 6
|
|
||||||
{ 4, 1 }, // 5
|
|
||||||
{ 5, 0 }, // 4
|
|
||||||
{ 6, 1 }, // 3
|
|
||||||
{ 6, 0 }, // 2
|
|
||||||
{ 5, 1 } // 1
|
|
||||||
};
|
|
||||||
|
|
||||||
Serial.println("start block");
|
|
||||||
for(int n = 0; n < 32; n++) {
|
|
||||||
int x_offset = order[n][1];
|
|
||||||
int y_offset = order[n][0];
|
|
||||||
|
|
||||||
byte pixel = get_pixel(p, x + x_offset, y + y_offset);
|
|
||||||
Serial.print("x=");
|
|
||||||
Serial.print(x_offset);
|
|
||||||
Serial.print(" y=");
|
|
||||||
Serial.print(y_offset);
|
|
||||||
Serial.print(" pixel=");
|
|
||||||
Serial.println(pixel);
|
|
||||||
|
|
||||||
|
|
||||||
digitalWrite(DATA, pixel);
|
|
||||||
clock();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 33 bit - kein pixel - senden
|
|
||||||
clock();
|
|
||||||
}
|
|
||||||
|
|
||||||
void clock() {
|
|
||||||
digitalWrite(CLOCK,HIGH);
|
|
||||||
digitalWrite(CLOCK,LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void load() {
|
|
||||||
digitalWrite(LOAD,HIGH);
|
|
||||||
digitalWrite(LOAD,LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
digitalWrite(DATA, LOW);
|
|
||||||
for(int i = 0; i < 1320; i++) {
|
|
||||||
clock();
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int y = 0; y < img.height; y+=8) {
|
|
||||||
for(int x = 0; x < img.width; x+=4) {
|
|
||||||
send_block(&img, x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
load();
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user