LEDMatrixDisplay Program 文字ごとに色を変更できるように修正
Fork of LEDMatrix_Master by
main.cpp
- Committer:
- nameless129
- Date:
- 2013-11-07
- Revision:
- 3:5605bd4d6295
- Parent:
- 2:402191724e28
- Child:
- 4:70a1803901d1
File content as of revision 3:5605bd4d6295:
#pragma import __use_all_ctype #include "mbed.h" #include <string.h> #include "kfont8.h" #include "process_fonts.h" unsigned char matrixdata[32]; SPI spi(p5, p6, p7); // mosi, miso, sclk BusOut bords(p15,p16,p17,p18,p19,p20); Serial pc(USBTX, USBRX); // tx, rx SPI spi2(p11, p12, p13); // mosi, miso, sclk DigitalOut cs(p14); #define DISPLAY_XSIZE (96) unsigned int ImageBuf[3][DISPLAY_XSIZE];//16*6 unsigned int ColerMap[3][DISPLAY_XSIZE]; void read_font(unsigned short code) { unsigned char c1, c2, MSB,LSB; uint32_t Address, seq; // SJIS to kuten code conversion c1 = (code>>8); c2 = (code & 0xFF); seq = (c1<=159 ? c1-129 : c1-193)*188 + (c2<=126 ? c2-64 : c2-65); MSB = seq / 94 + 1; LSB = seq % 94 + 1; Address = 0; if( MSB >= 1 && MSB <= 15 && LSB >= 1 && LSB <= 94) Address =( (MSB - 1) * 94 + (LSB - 1))*32; else if(MSB >= 16 && MSB <= 47 && LSB >= 1 && LSB <= 94) Address =( (MSB - 16) * 94 + (LSB - 1))*32 + 0x0AA40L; else if(MSB >= 48 && MSB <= 84 && LSB >= 1 && LSB <= 94) Address = ((MSB - 48) * 94 + (LSB - 1))*32 + 0x21CDFL; else if(MSB == 85 && LSB >= 1 && LSB <= 94) Address = ((MSB - 85) * 94 + (LSB - 1))*32 + 0x3C4A0L; else if(MSB >= 88 && MSB <= 89 && LSB >= 1 && LSB <= 94) Address = ((MSB - 88) * 94 + (LSB - 1))*32 + 0x3D060L; // Deselect the device cs = 1; // Setup the spi for 8 bit data, high steady state clock spi2.format(8,3); spi2.frequency(1000000); // Select the device by seting chip select low cs = 0; spi2.write(0x03); // Read data byte spi2.write(Address>>16 & 0xff); spi2.write(Address>>8 & 0xff); spi2.write(Address & 0xff); // Send a dummy byte to receive the contents of the WHOAMI register for(int i=0; i<32; i++) { matrixdata[i]=spi2.write(0x00); } // Deselect the device cs = 1; } void draw_kanji_15x16(int pos_x,unsigned char color) { int i = 0; for(i=0;i<16;i++) { if( ((signed int)(15-i+pos_x) >= 0) && ((15-i+pos_x) <= (DISPLAY_XSIZE-1)) ) { if(color == COLOR_G || color == COLOR_C || color == COLOR_Y || color == COLOR_W) { ImageBuf[0][15-i+pos_x] = matrixdata[i]; ImageBuf[0][15-i+pos_x] |= matrixdata[i+16]<<8; } if(color == COLOR_R || color == COLOR_Y || color == COLOR_M || color == COLOR_W) { ImageBuf[1][15-i+pos_x] = matrixdata[i]; ImageBuf[1][15-i+pos_x] |= matrixdata[i+16]<<8; } if(color == COLOR_B || color == COLOR_C || color == COLOR_M || color == COLOR_W) { ImageBuf[2][15-i+pos_x] = matrixdata[i]; ImageBuf[2][15-i+pos_x] |= matrixdata[i+16]<<8; } } } } unsigned int CountChar(char *str) { unsigned char f_SJISChar = 0; unsigned char c = 0; unsigned int CountChar = 0; c = *str; while(c != '\0') { //2バイト文字の判定 if( ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc)) && f_SJISChar != 1 ) { f_SJISChar = 1; } else { f_SJISChar = 0; CountChar++; } str++; c = *str; } return CountChar; } void drawStr15x16(char *str ,int pos_x,unsigned char color) { unsigned char f_SJISChar = 0; unsigned char c = 0; unsigned int SJISChar = 0; unsigned int CountChar = 0; c = *str; while(c != '\0') { //2バイト文字の判定 if( ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc)) && f_SJISChar != 1 ) { SJISChar = c; f_SJISChar = 1; } else if(f_SJISChar == 1) { SJISChar = (SJISChar<<8) | c; f_SJISChar = 0; read_font(SJISChar); draw_kanji_15x16(pos_x-CountChar*16,color); CountChar++; } else //ASCII文字 { SJISChar = c; f_SJISChar = 0; read_font(SJISChar); draw_kanji_15x16(pos_x-CountChar*16,color); CountChar++; } str++; c = *str; } } void SPILineOut(unsigned char setLine) { unsigned int data[3]={0}; unsigned int i = 0; for(i=0;i<=5;i++) { data[0] |= ((ImageBuf[2][setLine]>>(15-i))&0x01) << (15-(3*i)); } for(i=0;i<=4;i++) { data[0] |= ((ImageBuf[1][setLine]>>(15-i))&0x01) << (14-(3*i)); data[0] |= ((ImageBuf[0][setLine]>>(15-i))&0x01) << (13-(3*i)); } for(i=0;i<=5;i++) { data[1] |= ((ImageBuf[1][setLine]>>(10-i))&0x01) << (15-(3*i)); } for(i=0;i<=4;i++) { data[1] |= ((ImageBuf[0][setLine]>>(10-i))&0x01) << (14-(3*i)); data[1] |= ((ImageBuf[2][setLine]>>(9-i))&0x01) << (13-(3*i)); } for(i=0;i<=5;i++) { data[2] |= ((ImageBuf[0][setLine]>>(5-i))&0x01) << (15-(3*i)); } for(i=0;i<=4;i++) { data[2] |= ((ImageBuf[2][setLine]>>(4-i))&0x01) << (14-(3*i)); data[2] |= ((ImageBuf[1][setLine]>>(4-i))&0x01) << (13-(3*i)); } spi.write(data[0]); spi.write(data[1]); spi.write(data[2]); } void outBordData() { unsigned char ch = 0,Max_ch=0; unsigned int i = 0; Max_ch = (DISPLAY_XSIZE-16)/16; for(ch=0;ch<=Max_ch;ch++) { wait_us(10); bords = 0x01 << ch; for(i=(ch*16);i<(ch*16+16);i++) { SPILineOut(i); } } } void bufLeftShift_Loop(void) { signed int i = 0; for(i=(DISPLAY_XSIZE-1);i>=1;i--) { ImageBuf[0][i] = ImageBuf[0][i-1]; ImageBuf[1][i] = ImageBuf[1][i-1]; ImageBuf[2][i] = ImageBuf[2][i-1]; } ImageBuf[0][0] = ImageBuf[0][(DISPLAY_XSIZE-1)]; ImageBuf[1][0] = ImageBuf[1][(DISPLAY_XSIZE-1)]; ImageBuf[2][0] = ImageBuf[2][(DISPLAY_XSIZE-1)]; } void bufLeftShift(void) { signed int i = 0; for(i=(DISPLAY_XSIZE-1);i>=1;i--) { ImageBuf[0][i] = ImageBuf[0][i-1]; ImageBuf[1][i] = ImageBuf[1][i-1]; ImageBuf[2][i] = ImageBuf[2][i-1]; } ImageBuf[0][0] = 0; ImageBuf[1][0] = 0; ImageBuf[2][0] = 0; } void TestMode(void) { unsigned char i = 0; for(i=0;i<16;i++) { ImageBuf[0][i] = 0xffff; } for(i=16;i<16+16;i++) { ImageBuf[1][i] = 0xffff; } for(i=32;i<32+16;i++) { ImageBuf[2][i] = 0xffff; } outBordData(); while(1) { wait(0.1); bufLeftShift_Loop(); outBordData(); } } void SetRandamColer(void) { unsigned char color = 0; unsigned int i=0,j=0; memset(ColerMap,0,sizeof(ColerMap)); for(j=0;j<DISPLAY_XSIZE;j++) { for(i=0;i<16;i++) { color = rand()%7; if(color == COLOR_G || color == COLOR_C || color == COLOR_Y || color == COLOR_W) { ColerMap[0][j] |= 1<<i; } if(color == COLOR_R || color == COLOR_Y || color == COLOR_M || color == COLOR_W) { ColerMap[1][j] |= 1<<i; } if(color == COLOR_B || color == COLOR_C || color == COLOR_M || color == COLOR_W) { ColerMap[2][j] |= 1<<i; } } } } unsigned char ConvHue(unsigned char num) { unsigned char Hue[7] = {COLOR_G,COLOR_C,COLOR_B,COLOR_M,COLOR_R,COLOR_Y,COLOR_W}; return Hue[num]; } void SetRainbowColer(void) { unsigned char color = 0; unsigned int j=0; memset(ColerMap,0,sizeof(ColerMap)); for(j=0;j<DISPLAY_XSIZE;j++) { color = ConvHue((++color)%7); if(color == COLOR_G || color == COLOR_C || color == COLOR_Y || color == COLOR_W) { ColerMap[0][j] |= 0xffff; } if(color == COLOR_R || color == COLOR_Y || color == COLOR_M || color == COLOR_W) { ColerMap[1][j] |= 0xffff; } if(color == COLOR_B || color == COLOR_C || color == COLOR_M || color == COLOR_W) { ColerMap[2][j] |= 0xffff; } } } void ApplyColerMap(void) { unsigned i = 0; for(i=0;i<DISPLAY_XSIZE;i++) { ImageBuf[0][i] = ImageBuf[0][i]&ColerMap[0][i]; ImageBuf[1][i] = ImageBuf[1][i]&ColerMap[1][i]; ImageBuf[2][i] = ImageBuf[2][i]&ColerMap[2][i]; } } int main() { unsigned char f_mode = 0; unsigned int i = 0; unsigned char coler = 0; char tmpstr[100]; unsigned int cnt_tmpstr = 0; char strs[100]={0x82,0x6C,0x82,0x81,0x82,0x8B,0x82,0x85,0x82,0x65,0x82,0x81,0x82,0x89,0x82,0x92, 0x82,0x73,0x82,0x8F,0x82,0x8B,0x82,0x99,0x82,0x8F,0x82,0x51,0x82,0x4F,0x82,0x50,0x82,0x52,0x00}; spi.format(16,1); spi.frequency(1000000); memset(tmpstr,0,sizeof(tmpstr)); memset(ImageBuf,0,sizeof(ImageBuf)); i=0; wait(1); //TestMode(); SetRandamColer(); // SetRainbowColer(); while(1) { memset(ImageBuf,0,sizeof(ImageBuf)); // read_font(0x826d); // draw_kanji_15x16(0,0); for(i=0;i<DISPLAY_XSIZE+(15*CountChar(strs)-1);i++) { drawStr15x16(strs ,i,COLOR_W); ApplyColerMap(); outBordData(); wait(0.1); } } while(1) { if(f_mode == 0) { memset(ImageBuf,0,sizeof(ImageBuf)); pc.scanf("%s",&strs); pc.printf("cmdOK\r\n"); if(strstr(strs,"barusu") != NULL) { memset(ImageBuf,0xffff,sizeof(ImageBuf)); f_mode = 2; } else { f_mode = 1; } } if(f_mode == 1) { drawStr(strs,coler,i,4); i++; if(i > (16*6 - 8 )) { f_mode = 2; coler = (coler+1)%7; i = 0; } } if(f_mode == 2) { bufLeftShift(); i++; if(i>=((16*6 - 8)*3)) { memset(ImageBuf,0,sizeof(ImageBuf)); i = 0; f_mode = 1; } } if(pc.readable()) { tmpstr[cnt_tmpstr] = pc.getc(); if(tmpstr[cnt_tmpstr] == '\n') { tmpstr[cnt_tmpstr+1] = 0; pc.printf("%s\r\n",tmpstr); } cnt_tmpstr++; } outBordData(); wait(0.1); } }