請參考家豪教學網 矩陣 LED 跑馬燈 範例一: 寫一程式在 8x8 led 上顯示阿拉伯數字 0 至 9。 電路圖: 程式碼: const char N = 8; const int led[2][N]={{19,18,5,17,16,4,2,15},{13,12,14,27,26,25,33,32}}; const char num[10][N*N]={ {1,1,1,0,0,0,1,1,//0 1,1,0,1,1,0,1,1, 1,1,0,1,1,1,0,1, 1,0,1,1,1,1,0,1, 1,0,1,1,1,1,0,1, 1,0,1,1,1,0,1,1, 1,0,1,1,1,0,1,1, 1,1,0,0,0,1,1,1}, {1,1,1,1,0,1,1,1,//1 1,1,1,0,0,1,1,1, 1,1,1,1,0,1,1,1, 1,1,1,1,0,1,1,1, 1,1,1,0,1,1,1,1, 1,1,1,0,1,1,1,1, 1,1,1,0,1,1,1,1, 1,1,1,0,1,1,1,1}, {1,1,0,0,0,0,0,1,//2 1,0,1,1,1,1,1,0, 1,1,1,1,1,1,0,1, 1,1,1,1,1,0,1,1, 1,1,1,1,0,1,1,1, 1,1,0,0,1,1,1,1, 1,0,1,1,1,1,1,1, 0,0,0,0,0,0,1,1}, {1,1,1,0,0,0,0,1,//3 1,1,0,1,1,1,1,0, 1,1,1,1,1,0,0,1, 1,1,1,1,0,1,1,1, 1,1,0,0,0,0,1,1, 1,1,1,1,1,0,1,1, 1,1,1,1,0,1,1,1, 0,0,0,0,1,1,1,1}, {1,1,1,1,0,0,0,1,//4 1,1,1,0,1,1,0,1, 1,1,0,1,1,0,1,1, 1,0,1,1,1,0,1,1, 0,1,1,1,0,1,1,1, 0,0,0,0,0,0,0,1, 1,1,1,0,1,1,1,1, 1,1,0,1,1,1,1,1}, {1,1,1,0,0,0,0,0,//5 1,1,1,0,1,1,1,1, 1,1,0,1,1,1,1,1, 1,1,0,0,0,0,0,1, 1,1,1,1,1,1,0,1, 1,1,1,1,1,0,1,1, 1,1,1,1,0,1,1,1, 0,0,0,0,1,1,1,1}, {1,1,1,1,1,0,0,1,//6 1,1,1,0,0,1,1,0, 1,1,0,1,1,1,1,1, 1,1,0,0,0,1,1,1, 1,0,1,1,1,0,1,1, 1,0,1,1,1,0,1,1, 1,0,1,1,1,0,1,1, 1,1,0,0,0,1,1,1}, {1,1,0,0,0,0,0,1,//7 1,1,1,1,1,1,0,1, 1,1,1,1,1,0,1,1, 1,1,1,1,0,1,1,1, 1,1,1,0,1,1,1,1, 1,1,1,0,1,1,1,1, 1,1,0,1,1,1,1,1, 1,1,0,1,1,1,1,1}, {1,1,0,0,0,0,0,1,//8 1,0,1,1,1,1,1,0, 1,0,1,1,1,1,0,1, 1,1,0,0,0,0,1,1, 1,0,1,1,1,1,0,1, 0,1,1,1,1,1,0,1, 0,1,1,1,1,1,0,1, 1,0,0,0,0,0,1,1}, {1,1,1,1,0,0,0,1,//9 1,1,0,0,1,1,0,1, 1,0,1,1,1,1,0,1, 1,0,1,1,1,0,1,1, 1,0,0,0,0,1,1,1, 1,1,1,0,1,1,1,1, 1,1,0,1,1,1,1,1, 1,1,0,1,1,1,1,1} }; char buff[N*N]; char number=0; int Len;//整個表格長度 單位( 8 ) hw_timer_t * ClockTimer = NULL;//宣告 timer 物件 void show(){ int i,j; for(i=0;i<N;i++) digitalWrite(led[0][i], LOW); for(i=0;i<N;i++){ digitalWrite(led[0][i], HIGH); if(i>0) digitalWrite(led[0][i-1], LOW); for(j=0;j<N;j++) digitalWrite(led[1][j], buff[i*N+j]); delay(1); } } void IRAM_ATTR moveBuf(){//0.3秒觸發一次 int i; for(i=0;i<N*N;i++){ buff[i]=num[number][i]; } number++; number%=10; } void begin(int n){ Len = n*8; } void setup() { Serial.begin(115200); for(int i=0;i<2;i++) for(int j=0;j<8;j++) pinMode(led[i][j], OUTPUT); ClockTimer = timerBegin(0, 80, true); timerAttachInterrupt(ClockTimer, &moveBuf, true);//timer 物件觸發後執行 onTimer 程式 timerAlarmWrite(ClockTimer, 1000000, true);//0.3 秒後觸發 (300000 微秒 = 0.3 秒) timerAlarmEnable(ClockTimer); Serial.println(sizeof(num)); moveBuf(); } void loop() { show(); } 另一種編碼: const char num[10][N*N]={ {1,1,1,0,0,0,1,1,//0 1,1,0,1,1,0,1,1, 1,1,0,1,1,1,0,1, 1,0,1,1,1,1,0,1, 1,0,1,1,1,1,0,1, 1,0,1,1,1,0,1,1, 1,0,1,1,1,0,1,1, 1,1,0,0,0,1,1,1}, {1,1,1,1,0,1,1,1,//1 1,1,1,0,0,1,1,1, 1,1,1,1,0,1,1,1, 1,1,1,1,0,1,1,1, 1,1,1,0,1,1,1,1, 1,1,1,0,1,1,1,1, 1,1,1,0,1,1,1,1, 1,1,1,0,1,1,1,1}, {1,1,0,0,0,0,0,1,//2 1,0,1,1,1,1,1,0, 1,1,1,1,1,1,0,1, 1,1,1,1,1,0,1,1, 1,1,1,1,0,1,1,1, 1,1,0,0,1,1,1,1, 1,0,1,1,1,1,1,1, 0,0,0,0,0,0,1,1}, {1,1,1,0,0,0,0,1,//3 1,1,0,1,1,1,1,0, 1,1,1,1,1,0,0,1, 1,1,1,1,0,1,1,1, 1,1,0,0,0,0,1,1, 1,1,1,1,1,0,1,1, 1,1,1,1,0,1,1,1, 0,0,0,0,1,1,1,1}, {1,1,1,1,0,0,0,1,//4 1,1,1,0,1,1,0,1, 1,1,0,1,1,0,1,1, 1,0,1,1,1,0,1,1, 0,1,1,1,0,1,1,1, 0,0,0,0,0,0,0,1, 1,1,1,0,1,1,1,1, 1,1,0,1,1,1,1,1}, {1,1,1,0,0,0,0,0,//5 1,1,1,0,1,1,1,1, 1,1,0,1,1,1,1,1, 1,1,0,0,0,0,0,1, 1,1,1,1,1,1,0,1, 1,1,1,1,1,0,1,1, 1,1,1,1,0,1,1,1, 0,0,0,0,1,1,1,1}, {1,1,1,1,1,0,0,1,//6 1,1,1,0,0,1,1,0, 1,1,0,1,1,1,1,1, 1,1,0,0,0,1,1,1, 1,0,1,1,1,0,1,1, 1,0,1,1,1,0,1,1, 1,0,1,1,1,0,1,1, 1,1,0,0,0,1,1,1}, {1,1,0,0,0,0,0,1,//7 1,1,1,1,1,1,0,1, 1,1,1,1,1,0,1,1, 1,1,1,1,0,1,1,1, 1,1,1,0,1,1,1,1, 1,1,1,0,1,1,1,1, 1,1,0,1,1,1,1,1, 1,1,0,1,1,1,1,1}, {1,1,0,0,0,0,0,1,//8 1,0,1,1,1,1,1,0, 1,0,1,1,1,1,0,1, 1,1,0,0,0,0,1,1, 1,0,1,1,1,1,0,1, 0,1,1,1,1,1,0,1, 0,1,1,1,1,1,0,1, 1,0,0,0,0,0,1,1}, {1,1,1,1,0,0,0,1,//9 1,1,0,0,1,1,0,1, 1,0,1,1,1,1,0,1, 1,0,1,1,1,0,1,1, 1,0,0,0,0,1,1,1, 1,1,1,0,1,1,1,1, 1,1,0,1,1,1,1,1, 1,1,0,1,1,1,1,1} }; 範例: 寫一程式讓數字 0~9 往上捲動。 (電路圖同上) 程式碼: const char N = 8; const int led[2][N]={{19,18,5,17,16,4,2,15},{13,12,14,27,26,25,33,32}}; const char num[11*N*N]={ 1,1,1,0,0,0,1,1,//0 1,1,0,1,1,0,1,1, 1,1,0,1,1,1,0,1, 1,0,1,1,1,1,0,1, 1,0,1,1,1,1,0,1, 1,0,1,1,1,0,1,1, 1,0,1,1,1,0,1,1, 1,1,0,0,0,1,1,1, 1,1,1,1,0,1,1,1,//1 1,1,1,0,0,1,1,1, 1,1,1,1,0,1,1,1, 1,1,1,1,0,1,1,1, 1,1,1,0,1,1,1,1, 1,1,1,0,1,1,1,1, 1,1,1,0,1,1,1,1, 1,1,1,0,1,1,1,1, 1,1,0,0,0,0,0,1,//2 1,0,1,1,1,1,1,0, 1,1,1,1,1,1,0,1, 1,1,1,1,1,0,1,1, 1,1,1,1,0,1,1,1, 1,1,0,0,1,1,1,1, 1,0,1,1,1,1,1,1, 0,0,0,0,0,0,1,1, 1,1,1,0,0,0,0,1,//3 1,1,0,1,1,1,1,0, 1,1,1,1,1,0,0,1, 1,1,1,1,0,1,1,1, 1,1,0,0,0,0,1,1, 1,1,1,1,1,0,1,1, 1,1,1,1,0,1,1,1, 0,0,0,0,1,1,1,1, 1,1,1,1,0,0,0,1,//4 1,1,1,0,1,1,0,1, 1,1,0,1,1,0,1,1, 1,0,1,1,1,0,1,1, 0,1,1,1,0,1,1,1, 0,0,0,0,0,0,0,1, 1,1,1,0,1,1,1,1, 1,1,0,1,1,1,1,1, 1,1,1,0,0,0,0,0,//5 1,1,1,0,1,1,1,1, 1,1,0,1,1,1,1,1, 1,1,0,0,0,0,0,1, 1,1,1,1,1,1,0,1, 1,1,1,1,1,0,1,1, 1,1,1,1,0,1,1,1, 0,0,0,0,1,1,1,1, 1,1,1,1,1,0,0,1,//6 1,1,1,0,0,1,1,0, 1,1,0,1,1,1,1,1, 1,1,0,0,0,1,1,1, 1,0,1,1,1,0,1,1, 1,0,1,1,1,0,1,1, 1,0,1,1,1,0,1,1, 1,1,0,0,0,1,1,1, 1,1,0,0,0,0,0,1,//7 1,1,1,1,1,1,0,1, 1,1,1,1,1,0,1,1, 1,1,1,1,0,1,1,1, 1,1,1,0,1,1,1,1, 1,1,1,0,1,1,1,1, 1,1,0,1,1,1,1,1, 1,1,0,1,1,1,1,1, 1,1,0,0,0,0,0,1,//8 1,0,1,1,1,1,1,0, 1,0,1,1,1,1,0,1, 1,1,0,0,0,0,1,1, 1,0,1,1,1,1,0,1, 0,1,1,1,1,1,0,1, 0,1,1,1,1,1,0,1, 1,0,0,0,0,0,1,1, 1,1,1,1,0,0,0,1,//9 1,1,0,0,1,1,0,1, 1,0,1,1,1,1,0,1, 1,0,1,1,1,0,1,1, 1,0,0,0,0,1,1,1, 1,1,1,0,1,1,1,1, 1,1,0,1,1,1,1,1, 1,1,0,1,1,1,1,1, 1,1,1,0,0,0,1,1,//0 1,1,0,1,1,0,1,1, 1,1,0,1,1,1,0,1, 1,0,1,1,1,1,0,1, 1,0,1,1,1,1,0,1, 1,0,1,1,1,0,1,1, 1,0,1,1,1,0,1,1, 1,1,0,0,0,1,1,1 }; char buff[N*N]; int number; int Len;//整個表格長度 單位( 8 ) hw_timer_t *ClockTimer = NULL;//宣告 timer 物件 void show(){ int i,j; for(i=0;i<N;i++) digitalWrite(led[0][i], LOW); for(i=0;i<N;i++){ digitalWrite(led[0][i], HIGH); if(i>0) digitalWrite(led[0][i-1], LOW); for(j=0;j<N;j++) digitalWrite(led[1][j], buff[i*N+j]); delay(1); } } void nextMove(int c){ switch(c){ case 0://每次跳一個數字 number+=Len; break; case 1://向上捲動 number+=N; break; } number%=10*Len; } void IRAM_ATTR moveBuf(){//0.3秒觸發一次 int i; for(i=0;i<Len;i++){ buff[i]=num[number+i]; } nextMove(1); } void begin(){ number = 0; Len = N*N; } void setup() { Serial.begin(115200); begin(); for(int i=0;i<2;i++) for(int j=0;j<8;j++) pinMode(led[i][j], OUTPUT); ClockTimer = timerBegin(0, 80, true); timerAttachInterrupt(ClockTimer, &moveBuf, true);//timer 物件觸發後執行 onTimer 程式 timerAlarmWrite(ClockTimer, 200000, true);//0.2 秒後觸發 (300000 微秒 = 0.2 秒) timerAlarmEnable(ClockTimer); Serial.print("Length="); Serial.println(sizeof(num)); moveBuf(); } void loop() { show(); } |