Aliexpressなどで販売されている64x32のフルカラードットマトリクスLED2枚とNucleo F401REを利用して、 E233系の駅停車時、路線名表示ありのLED側面行先表示を再現するプログラムです。 3秒間隔、3段階切替で、路線名、種別、行先、次停車駅を個別に指定することが可能です。
Dependencies: SDFileSystem mbed
Revision 29:bc82c25b6b94, committed 2015-02-03
- Comitter:
- chirashi
- Date:
- Tue Feb 03 10:36:24 2015 +0000
- Parent:
- 28:4cc6aa3acd92
- Child:
- 30:3ac9aa4faa34
- Commit message:
- add comment
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Mon Feb 02 11:44:47 2015 +0000
+++ b/main.cpp Tue Feb 03 10:36:24 2015 +0000
@@ -44,10 +44,11 @@
#define B_Debug3 0
#define B_Debug4 0
-
+//表示幅を増やす場合ここ以外も変更が必要
#define LED_Width 128
#define LED_Height 16
+
#define DisplayWait 15
//最大停車駅数
@@ -65,6 +66,9 @@
Serial pc(USBTX,USBRX );
//LEDModule
+//R1,R2,G1,G2,B1,B2はモジュールによりコネクタのピンアサインが異なります。
+//色が違う場合DigitalOutのピンアサインを変更してください。
+
//R1 - D4(PB5)
//R2 - D5(PB4)
//G1 - D6(PB10)
@@ -97,7 +101,7 @@
-//SumSW
+//SumSW(現状未使用)
DigitalOut SCK(PB_7);
DigitalOut SI(PC_13);
DigitalOut RCK(PC_14);
@@ -106,10 +110,12 @@
DigitalIn SumSW2(PA_1);
DigitalIn SumSW4(PA_4);
DigitalIn SumSW8(PB_0);
-
//BusIn SumSWNum(PA_0,PA_1,PA_4,PB_0);
+
+//表示切替用タイマ
Ticker ChangeTimer;
+//スクロール用タイマ(現状未使用)
Ticker ScrollTimer;
//Debug
@@ -135,6 +141,7 @@
bool Scroll = 1;
//起動時スクロール読み込み有効/無効(SDがない場合0にする)
+//(1になっている場合SDカードが刺さっていないと起動に数分かかります)
bool ScrollEnable = 1;
int ChangeCount = 0;
@@ -154,9 +161,16 @@
//SDCardFilePath
char SDFilePath[80]= "/sd/a.txt";
-unsigned char gm[32][6]; // Buffer with 32x6 bytes. Graphics memory if you like.
+//unsigned char gm[32][6]; // Buffer with 32x6 bytes. Graphics memory if you like.
unsigned long CT; // Counter for demo code
+
+//StopStationCode:停車駅コード(最大100駅 それ以上の場合MaxStopStationを増やしてください)
+//停車駅コード終端は0にする
+//StationNameLength:駅名の文字数(最大8文字)
+//停車駅名データ:/sd/E233/StationName/(停車駅コード).bin
+//128x32
+
//int StopStationCode[MaxStopStation] = {2,3,7,11,14,20,24,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,0};
//Keihin-Tohoku Rapid Ofuna
//int StopStationCode[MaxStopStation] = {202,203,204,205,206,207,208,209,210,211,212,213,214,218,220,222,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,0};
@@ -382,16 +396,16 @@
}
-void WriteRow(unsigned char Row, int8_t Buffer[32][128], int8_t index)
+void WriteRow(unsigned char Row, int8_t Buffer[32][128], int8_t index2)
{
ABC = 15-Row;
for(int col=0; col<LED_Width; col++) {
- R1 = R1Data[index][(Buffer [(15-Row)][col])];
- G1 = G1Data[index][(Buffer [(15-Row)][col])];
- B1 = B1Data[index][(Buffer [(15-Row)][col])];
- R2 = R1Data[index][(Buffer [(31-Row)][col])];
- G2 = G1Data[index][(Buffer [(31-Row)][col])];
- B2 = B1Data[index][(Buffer [(31-Row)][col])];
+ R1 = R1Data[index2][(Buffer [(15-Row)][col])];
+ G1 = G1Data[index2][(Buffer [(15-Row)][col])];
+ B1 = B1Data[index2][(Buffer [(15-Row)][col])];
+ R2 = R1Data[index2][(Buffer [(31-Row)][col])];
+ G2 = G1Data[index2][(Buffer [(31-Row)][col])];
+ B2 = B1Data[index2][(Buffer [(31-Row)][col])];
CLK = HIGH;
CLK = LOW;
}
@@ -417,21 +431,21 @@
LAT = LOW;
}
-void Pset(unsigned char x,unsigned char y, unsigned char c)
-{
+//void Pset(unsigned char x,unsigned char y, unsigned char c)
+//{
// Set pixel (x,y) to color c
// Manipulates graphics memory, so you won't see any change til you Paint() it.
- unsigned char ud,l,r0,g0,b0;
- ud=(y & 8)>>3; // 0 = upper half, 1 = lower half
- l=y & 7; // Extract row in upper/lower half
- r0=(c & 4) >>2; // Extract red bit from color
- g0=(c & 2) >>1; // Extract green bit from color
- b0=(c & 1); // Extract blue bit from color
+// unsigned char ud,l,r0,g0,b0;
+// ud=(y & 8)>>3; // 0 = upper half, 1 = lower half
+// l=y & 7; // Extract row in upper/lower half
+// r0=(c & 4) >>2; // Extract red bit from color
+// g0=(c & 2) >>1; // Extract green bit from color
+// b0=(c & 1); // Extract blue bit from color
// *******Removes current bit ******* *Adds bit**
- gm[x][0+3*ud]=(gm[x][0+3*ud] & (255-(1<<(7-l))))+(r0<<(7-l)); // Red byte
- gm[x][1+3*ud]=(gm[x][1+3*ud] & (255-(1<<(7-l))))+(g0<<(7-l)); // Green byte
- gm[x][2+3*ud]=(gm[x][2+3*ud] & (255-(1<<(7-l))))+(b0<<(7-l)); // Blue byte
-}
+// gm[x][0+3*ud]=(gm[x][0+3*ud] & (255-(1<<(7-l))))+(r0<<(7-l)); // Red byte
+// gm[x][1+3*ud]=(gm[x][1+3*ud] & (255-(1<<(7-l))))+(g0<<(7-l)); // Green byte
+// gm[x][2+3*ud]=(gm[x][2+3*ud] & (255-(1<<(7-l))))+(b0<<(7-l)); // Blue byte
+//}
void Paint(int8_t Buffer2[32][128])
{
@@ -439,9 +453,10 @@
for(int Row=0; Row<LED_Height; Row++) {
OE = HIGH; // Disable output
WriteRow(Row,Buffer2,index);
- //wait_us(10);
+ //wait_us(5);
OE = LOW; // Enable output
wait_us(DisplayWait); // Wasting some time. Use for whatever else. Probably better with a ticker for the display refresh.
+ OE = HIGH; // Disable output
}
}
}
@@ -473,25 +488,15 @@
}
void CopyScrollBuffer(int8_t ReadBuffer[16][2048],int8_t WriteBuffer[32][128],int Startx){
-
-
-
for(int y = 0; y < 16; y++){
- int xCount = 0;
-
+ int xCount = 0;
for(int x = 0; x < 80; x++){
- //for(int z =0; z < 8; z++){
- //LEDMainBuffer[y + 16][x + 48] = ScrollBuffer[y][x + Startx];
-
if(bitRead(ScrollBuffer[y][(x + Startx) / 8 ], (x + Startx)% 8) != 0){
LEDMainBuffer[y + 16][x + 48] = 4;
}else{
LEDMainBuffer[y + 16][x + 48] = 0;
- }
-
+ }
xCount = xCount + 1;
- //}
-
}
}
}
@@ -509,7 +514,6 @@
void TimerTick(){
//OE = HIGH;
-
//DisplayMode = 1 3段階表示ならば
if(DisplayMode == 1){
if (ChangeCount == 0){
@@ -967,47 +971,47 @@
//SumSW
- int testData[16] = {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0};
- SI = LOW;
- for(int a = 0; a < 16; a++){
- if(testData[a] == 1){
- SI = HIGH;
- pc.printf("1,");
- }else{
- SI = LOW;
- pc.printf("0,");
- }
- SCK = HIGH;
- wait_us(15);
- SCK = LOW;
- wait_us(15);
- }
+ //int testData[16] = {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0};
+ //SI = LOW;
+ //for(int a = 0; a < 16; a++){
+ // if(testData[a] == 1){
+ // SI = HIGH;
+ // pc.printf("1,");
+ // }else{
+ // SI = LOW;
+ // pc.printf("0,");
+ // }
+ // SCK = HIGH;
+ // wait_us(15);
+ // SCK = LOW;
+ // wait_us(15);
+ //}
- RCK = HIGH;
- wait_us(15);
- RCK = LOW;
- pc.printf("\r\n");
+ //RCK = HIGH;
+ //wait_us(15);
+ //RCK = LOW;
+ //pc.printf("\r\n");
- int SumSWNum = 0;
- if(SumSW1 == 1 ){
- SumSWNum = SumSWNum + 1;
- }
- if(SumSW2 == 1){
- SumSWNum = SumSWNum + 2;
- }
- if(SumSW4 == 1){
- SumSWNum = SumSWNum + 4;
- }
- if(SumSW8 == 1){
- SumSWNum = SumSWNum + 8;
- }
- pc.printf("SumSW:%d\r\n",SumSWNum);
+ //int SumSWNum = 0;
+ //if(SumSW1 == 1 ){
+ // SumSWNum = SumSWNum + 1;
+ //}
+ //if(SumSW2 == 1){
+ // SumSWNum = SumSWNum + 2;
+ //}
+ //if(SumSW4 == 1){
+ // SumSWNum = SumSWNum + 4;
+ //}
+ //if(SumSW8 == 1){
+ // SumSWNum = SumSWNum + 8;
+ //}
+ //pc.printf("SumSW:%d\r\n",SumSWNum);
-
+ //SDカードから表示データを読み込み
SDFileRead();
-
+ //起動時にスクロールデータを読み込み
if(ScrollEnable == 1){
//ScrollDebug
ScrollWriteCount = 80;
@@ -1024,7 +1028,6 @@
if(StopStationCode[i] == 0){
break;
}
-
//駅名
sprintf(SDFilePath,"/sd/E233/StationName/%d.bin",StopStationCode[i]);
SDScrollBufferWrite(ScrollBuffer,ScrollWriteCount,0,128,16);
@@ -1047,10 +1050,7 @@
sprintf(SDFilePath,"/sd/E233/StopStation/0x8132.bin");
SDScrollBufferWrite(ScrollBuffer,ScrollWriteCount,0,16,16);
ScrollWriteCount = ScrollWriteCount + 16;
-
}
-
-
ScrollWriteCount = ScrollWriteCount - 16;
sprintf(SDFilePath,"/sd/E233/StopStation/StopStation%d.bin",3);
SDScrollBufferWrite(ScrollBuffer,ScrollWriteCount,0,80,16);
@@ -1085,10 +1085,6 @@
//2段階表示に変更
DisplayMode = 2;
-
-
-
-
//Serial
pc.attach(pc_rx, Serial::RxIrq);
@@ -1103,7 +1099,7 @@
while(1) {
- CT++;
+ //CT++;
// if (ChangeCount == 0){
// Paint(LEDBuffer);
// }else if(ChangeCount == 1){
@@ -1117,17 +1113,17 @@
//スクロール(現状不動作)
//スクロールが有効なら
if(Scroll == 1){
- if(CT>0) {
+ //if(CT>0) {
//MkPattern(); // Restore original priceless artwork
- CT=0; // Start all over.
+ //CT=0; // Start all over.
OE = HIGH;
ScrollTimerTick();
OE = LOW;
- }
- }else{
- if(CT>4160){
- CT=0;
- }
+ //}
+ //}else{
+ //if(CT>4160){
+ // CT=0;
+ //}
}