int seg[]={22,24,26,28,30,32,34,36};//七段顯示器abcdefg(dp)接腳,a為最低位
int digit[]={13,12,3,2};//七段顯示器之千,百,十,個,掃瞄控制接腳,千為最低位
char num[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};
//七段16進制編碼 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10(-)
String disp=":1234567890:";//欲顯示之字串,若為:改為顯示-
int count=0;//目前顯示disp位數之計數,初值為0(最左側)。
int dir=1;//顯示方向,=1表左向右依序顯示。=-1表右向左依序顯示,初值為1
int t=5;//每位數字顯示5ms
unsigned long time0=0;//計時變數。
void setup() {//初值設定
Serial.begin(9600);//串列埠傳輸鮑率為9600bps
for(int i=0;i<8;i++)//使i=0~7
pinMode(seg[i],OUTPUT);//七段顯示器abcdefg(dp)接腳設為輸出
for(int i=0;i<4;i++)//使i=0~3
pinMode(digit[i],OUTPUT);//七段COM1~4掃瞄控制接腳設定為輸出
Serial.println("Setup OK Display -123456789-");
}//setup()結束
void loop() {//主迴圈
if(Serial.available()){//若序列埠有輸入
count=0;//將目前顯示位數之計數設定為0(回最左位)。
disp=Serial.readString();//讀入序列埠字串
disp.remove(disp.length()-1);
//上一行,若序列埠輸入加NL或CR,要去掉最後一字,若沒有結尾不用打
if(disp.length()<4)//若輸入少於4個字
disp="::::";//字串顯示----,表示錯誤
Serial.print("Display string="); //印Display string=,不換行
Serial.println(disp);//印輸入之字串,換行
}//若序列埠有輸入之if執行結束
for(int i=0;i<4;i++){//由左(i=0,千位)而右(i=3,個位)顯示
//查disp字串第count位起4字之七段編碼,測試節段位元=1亮,0x30是0之ASCII
int number = disp[count+i]-0x30;//抓disp字串要顯示的字元轉數字
char code = num[number];//將要顯示的數字,查出各節段之字碼
for(int j=0;j<8;j++){//顯示各節段值,j=0為a,=1為b...=6為g,=7為小數點
if(bitRead(code,j))//判斷各節段之值是否為1
digitalWrite(seg[j],HIGH);//若該段位元值為1,輸出HIGH(亮)
else //否則,該段位元值為0
digitalWrite(seg[j],LOW);//該段為0,輸出LOW(滅)
//前7行之動作,除變數j之for迴圈,其他行可濃縮成下面1行即可
//digitalWrite(seg[j],bitRead(num[disp[count+i]-0x30],j));
}//顯示各段變數j之for迴圈結束
digitalWrite(digit[i],1); //第i位顯示器,掃描顯示數字
delay(t); //每位數字掃描顯示時間,亮5ms
digitalWrite(digit[i],0); //第i位顯示器,關閉不亮(消除鬼影)
if(millis()-time0 >= t*100){//現在時間比剛才記錄超過0.5秒(5ms*100)
time0 = millis();//重新記錄目前系統時間。
count+=dir;//要顯示位數之計數值count加1或減1
//Serial.print("count=");Serial.println(count);//目前顯示位數
if(count>disp.length()-4 || count<0){//若超過顯示範圍
delay(t*100);//關全燈,延遲0.5秒後
dir*=-1; //改變方向,=1表左向右顯示。=-1表右向左顯示
}//若超過顯示範圍if結束
}//經過0.5秒if結束
}//掃瞄之變數i之for迴圈結束
}//loop()結束