class sevin_4_leds
{
private:
int8_t d[4];
////
public:
int8_t data[10][8] =
{ //十個數量時,八燈炮分別high/low
{1, 1, 1, 1, 1, 1, 0, 0}, //0
{0, 1, 1, 0, 0, 0, 0, 0}, //1
{1, 1, 0, 1, 1, 0, 1, 0}, //2
{1, 1, 1, 1, 0, 0, 1, 0}, //3
{0, 1, 1, 0, 1, 1, 0, 0}, //4
{1, 0, 1, 1, 0, 1, 1, 0}, //5
{1, 0, 1, 1, 1, 1, 1, 0}, //6
{1, 1, 1, 0, 0, 1, 0, 0}, //7
{1, 1, 1, 1, 1, 1, 1, 0}, //8
{1, 1, 1, 1, 0, 1, 1, 0} //9
};
//
int8_t pins[8]; //八燈泡腳位代號
int8_t coms[4]; //四燈接地角位代號
void set_datapins(int8_t a, int8_t b, int8_t c, int8_t d, int8_t e, int8_t f, int8_t g, int8_t h)
{
pins[0] = a; //a號燈
pins[1] = b; //b號燈
pins[2] = c; //c號燈
pins[3] = d; //d號燈
pins[4] = e; //e號燈
pins[5] = f; //f號燈
pins[6] = g; //g號燈
pins[7] = h; //h號燈
}
void set_compins(int8_t A, int8_t B, int8_t C, int8_t D)
{
coms[0] = A; //13號位 千位的com
coms[1] = B; //12號位 百位的com
coms[2] = C; //11號位 十位的com
coms[3] = D; //10號位 個位的com
}
//
void init() //設定角位為輸出
{
for (int i = 0; i <= 7; i++)
pinMode(pins[i], OUTPUT);
for (int j = 0; j <= 3; j++)
pinMode(coms[j], OUTPUT);
}
//
void set_digits(int val) //分離四位數字
{
d[0] = val / 1000; //千位數
d[1] = val / 100 % 10; //百位數
d[2] = val / 10 % 10; //十位數
d[3] = val % 10; //個位數
}
//
void output() //執行發亮
{
for (int i = 0; i <= 3; i++) //依次四個位數
{
for (int j = 0; j <= 7; j++) //每個位數的八個登
{
int k = d[i]; //i=0(k=千位的數字) i=1(k=百位的數字) i=2(k=十位的數字) i=3(k=個位的數字)
digitalWrite( pins[j], data[k][j] ); //把第K位數的a到h號燈的亮暗寫入角位(四個燈會同步)
}
digitalWrite( coms[i], LOW ); //控制單一該位數亮
delay(20); //持續亮
digitalWrite( coms[i], HIGH ); //關閉該位數的亮,i++進到下一位數
}
}
void turn_off() //一開始全暗
{
for(int i=0; i<=3; i++)
digitalWrite( coms[i] , HIGH );
}
};
//
sevin_4_leds number; //宣告四位數
int count = 0; //老師打的,不知道要欉三小
int val = 0; //要顯示的數字
//
void setup()
{
Serial.begin(9600);
Serial.print("go");
number.init();
number.set_datapins(2, 3, 4, 5, 6, 7, 8, 9);
number.set_compins(13, 12, 11, 10);
number.turn_off();
}
//
void loop()
{
if ( Serial.available() > 0 )
{
val = Serial.parseInt();
Serial.println(val);
number.set_digits(val);
}
number.output();
}