// Programmer : Ts. Abd Rahim Bin Kasiman
// Date : 28 January 2025
// This is a template program for Arduino Multi Learning Sheild
#define dataS(x) digitalWrite(8, x? HIGH:LOW)
#define shCLK(x) digitalWrite(7, x? HIGH:LOW)
#define stCLK(x) digitalWrite(4, x? HIGH:LOW)
#define BUZ(x) digitalWrite(3, x? LOW:HIGH)
#define LED1(x) digitalWrite(13, x? LOW:HIGH)
#define LED2(x) digitalWrite(12, x? LOW:HIGH)
#define LED3(x) digitalWrite(11, x? LOW:HIGH)
#define LED4(x) digitalWrite(10, x? LOW:HIGH)
#define S1 digitalRead(A1)
#define S2 digitalRead(A2)
#define S3 digitalRead(A3)
// Array data & variables used for 7-segment Common Anode - numeric value only
// INDEX: 0 1 2 3 4 5 6 7 8 9 10, 11, 12, 13 14 15 16 17 18 19 20 21 22
// NUM: 0 1 2 3 4 5 6 7 8 9 BLNK, G, o, d, E, r, c, -, U, P, n, t, F
const uint8_t num[30] = {0xC0,0XF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xC2,0xA3,0xA1,0x86,0xAF,0xA7,0xBF,0xC1,0x8C,0xAB,0x87,0x8E};
const uint8_t seg[4] = {0xF1,0xF2,0xF4,0xF8};
uint16_t ptr2disp;
uint16_t buff[4];
uint8_t mode=0;
uint8_t getPB(void)
{ uint8_t PBvalue=0;
if(S1==LOW) PBvalue |= 1<<0;
if(S2==LOW) PBvalue |= 1<<1;
if(S3==LOW) PBvalue |= 1<<2;
return PBvalue;
}
void LEDs(uint8_t decimal)
{ LED1(decimal & 1<<0);
LED2(decimal & 1<<1);
LED3(decimal & 1<<2);
LED4(decimal & 1<<3);
}
void displaySegment(void)
{ static uint8_t seg=0;
stCLK(LOW);
for(int8_t i=15;i>-1;i--)
{ shCLK(LOW);
if(buff[seg] & (1<<i)) dataS(HIGH);
else dataS(LOW);
shCLK(HIGH);
}
stCLK(HIGH);
if(++seg>3) seg=0;
}
void multiplexSegment(uint16_t num4digit)
{ for(uint8_t i=0;i<4;i++)
{ switch(i)
{ case 0:
if(mode==0) ptr2disp = num4digit / 1000;
if(mode==1) ptr2disp = 11; //G
if(mode==2) ptr2disp = 14; //E
if(mode==3) ptr2disp = 16; //c
if(mode==4) ptr2disp = 16; //c
if(mode==5) ptr2disp = 21; //t
if(mode==6) ptr2disp = 22; //F
if(mode==7) ptr2disp = 18; //U
if(mode==8) ptr2disp = 13; //d
break;
case 1:
if(mode==0) ptr2disp = (num4digit % 1000) / 100;
if(mode==1) ptr2disp = 12; //o
if(mode==2) ptr2disp = 15; //r
if(mode==3) ptr2disp = 17; //-
if(mode==4) ptr2disp = 17; //-
if(mode==5) ptr2disp = 17; //-
if(mode==6) ptr2disp = 17; //-
if(mode==7) ptr2disp = 17; //-
if(mode==8) ptr2disp = 17; //-
break;
case 2:
if(mode==0) ptr2disp = (num4digit % 100) / 10;
if(mode==1) ptr2disp = 12; //o
if(mode==2) ptr2disp = 15; //r
if(mode==3) ptr2disp = 18; //U
if(mode==4) ptr2disp = 13; //d
if(mode==5) ptr2disp = (num4digit % 100) / 10;
if(mode==6) ptr2disp = (num4digit % 100) / 10;
if(mode==7) ptr2disp = (num4digit % 100) / 10;
if(mode==8) ptr2disp = (num4digit % 100) / 10;
break;
case 3:
if(mode==0) ptr2disp = num4digit % 10;
if(mode==1) ptr2disp = 13; //d
if(mode==2) ptr2disp = 10; //BLANK
if(mode==3) ptr2disp = 19; //P
if(mode==4) ptr2disp = 20; //n
if(mode==5) ptr2disp = ptr2disp = num4digit % 10;
if(mode==6) ptr2disp = ptr2disp = num4digit % 10;
if(mode==7) ptr2disp = ptr2disp = num4digit % 10;
if(mode==8) ptr2disp = ptr2disp = num4digit % 10;
break;
}
buff[i] = (num[ptr2disp]<<8) | seg[i];
}
}
void beep(uint8_t bil, uint16_t tempoh)
{ for(uint8_t i=0;i<bil;i++)
{ BUZ(1); delay(tempoh);
BUZ(0); delay(tempoh);
}
}
void pinSetup()
{ pinMode(8,OUTPUT); //DS
pinMode(7,OUTPUT); //SH
pinMode(4,OUTPUT); //ST
pinMode(3,OUTPUT); //BUZZ
pinMode(13,OUTPUT); //LED1
pinMode(12,OUTPUT); //LED2
pinMode(11,OUTPUT); //LED3
pinMode(10,OUTPUT); //LED4
pinMode(A1,INPUT); //PB1
pinMode(A2,INPUT); //PB2
pinMode(A3,INPUT); //PB3
timerSetup();
}
void timerSetup()
{ cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 15999;
TCCR1B |= (1 << WGM12);
TCCR1B |= (0 << CS12) | (0 << CS11) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
sei();
}
void setup()
{ pinSetup();
beep(3,50);
Serial.begin(9600);
BUZ(0); // INITIALLY OFF FOR BUZZER
}
uint8_t a=0;
void loop()
{
int an = analogRead(A0);
Serial.println(an);
if(an>=0)
{ mode=2; // ERROR
multiplexSegment(0000);
beep(1,20);
}
if(an==0)
{ mode=1; // GOOD
multiplexSegment(0000);
beep(2,50);
delay(2000);
setCounter();
}
}
int kira=0;
void setCounter()
{
mode=3; // c-UP
multiplexSegment(0000);
while(1)
{
if(getPB()==1)
{ kira++;
beep(1,50);
while(getPB()==1);
if(kira==3) kira=1; // RESET TO C-UP
if(kira==1) mode=4; // C-dn
if(kira==2) mode=3; // C-UP
multiplexSegment(0000);
delay(200);
}
if(getPB()==2) // NEXT PROCESS - SELECT TIMER VALUE
{ beep(2,50);
delay(200);
selectTimer();
}
}
}
uint16_t an;
void selectTimer()
{ mode=5;
multiplexSegment(0000);
while(1)
{ an = analogRead(A0);
Serial.println(an);
an = map(an,0,1023,1,99);
multiplexSegment(an);
if(getPB()==2) // NEXT PROCESS - SELECT FREQUENCY VALUE
{ beep(2,50);
delay(200);
selectFrequency();
}
}
}
uint8_t frekuensi=1;
void selectFrequency()
{
mode=6;
multiplexSegment(1); //F-01
while(1)
{
if(getPB()==1)
{ //falling edge
beep(1,50);
frekuensi++;
if(frekuensi==6)
frekuensi=1;
multiplexSegment(frekuensi);
while(getPB()==1);
//rising edge
delay(200);
}
if(getPB()==2) // NEXT PROCESS - SELECT FREQUENCY VALUE
{ beep(2,50);
delay(200);
startTimer();
}
}
}
uint16_t tempohMasa=0, counter=0;
void startTimer()
{
while(1)
{
if(kira==2) //C-UP
{ mode=7;
counter++;
}
if(kira==1) //C-dn
{ mode=8;
}
tempohMasa = 1000/frekuensi;
delay(tempohMasa);
multiplexSegment(counter);
if(counter==an)
while(1)
{
beep(1,50);
}
}
}
ISR(TIMER1_COMPA_vect)
{ displaySegment();
}
POT - A0
PB1 - A1
PB2 - A2
PB3 - A3
LED1 - 13
LED2 - 12
LED3 - 11
LED4 - 10
DS - 8
SH - 7
ST - 4
BUZZ - 3