unsigned long now,then=0;
int increment=1;
int count=0;
const byte led_code[10]{ //for cathode, use opposite value for anode
B00111111,//0
B00000110,//1
B01011011,//2
B01001111,//3
B01100110,//4
B01101101,//5
B01111101,//6
B00000111,//7
B01111111,//8
B01101111//9
};
const int pin_num=7,module_num=2;
int pin_ids[module_num][pin_num]={{15,16,17,5,18,19,25},{21,22,23,32,33,26,27}};//các chân ở đây (thứ từ a->g)
void setup() {
// put your setup code here, to run once:
for(int i=0;i<module_num;i++){
for(int j=0;j<pin_num;j++){
pinMode(pin_ids[i][j],OUTPUT);
}
}
Serial.begin(9600);
}
void loop() {
if(setInterval(500)){
count+=increment;
for(int i=0;i<module_num;i++){
displayNum(i,getDigit(count,i),"cathode");
}
if(count==99 || count==0)increment=-increment;
}
//new module id, start from 0->n
}
void displayNum(int module_id,int num,char* AnodeOrCathode){//cái này cũng tái sử dụng được cho mọi bài led 7 đoạn, syntax: displayNum(hiển thị số mấy?,cathode hay anode?);
for(int i=0;i<pin_num;i++){
bool led_state=(AnodeOrCathode=="cathode")?bitRead(led_code[num],i):!bitRead(led_code[num],i);
digitalWrite(pin_ids[module_id][i],led_state);
}
}
int getDigit(int num,int pos){//getDigit(145,0) returns 1; getDigit(1,0) returns 0; getDigit(1,1) returns 1
String numStr=String(num);
if(num<10){
if(pos==0)return 0;
if(pos==1)return num;
}
else
return numStr[pos]-'0';
}
bool setInterval(int downtime){ //Cái này tái sử dụng cũng tốt nè, syntax là if(setInterval(miligiây)){code trong này;} thì code sẽ chạy với chu kì miligiaay
now=millis();
if(now-then>=downtime){
then=now;
return true;
}
else return false;
}