// Programmer : Ts. Abd Rahim Bin Kasiman
// Date : 28 January 2025
// This is a template program for Arduino Multi Learning Sheild
// 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
// NUM: 0 1 2 3 4 5 6 7 8 9 BLNK E L C - F
const uint8_t num[17] = {0xC0,0XF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0x86,0xC7,0xC6,0xBF,0x8E};
// INDEX: 14 15
// NUM: - F
const uint8_t seg[4] = {0xF1,0xF2,0xF4,0xF8};
uint16_t ptr2disp;
uint16_t buff[4];
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;
}
uint8_t pilihan=0;
void multiplexSegment(uint16_t num4digit)
{ for(uint8_t i=0;i<4;i++)
{ switch(i)
{ case 0:
if(pilihan==0)ptr2disp = num4digit / 1000;
if(pilihan==1)ptr2disp = 14; //-
break;
case 1:
if(pilihan==0)ptr2disp = (num4digit % 1000) / 100;
if(pilihan==1)ptr2disp = 15; //F
break;
case 2:
if(pilihan==0)ptr2disp = (num4digit % 100) / 10;
if(pilihan==1)ptr2disp = 1; // 1
break;
case 3:
if(pilihan==0)ptr2disp = num4digit % 10;
if(pilihan==1)ptr2disp = 14; //-
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(0); delay(tempoh);
BUZ(1); 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);
}
uint8_t a=0;
void loop()
{
pilihan=1;
multiplexSegment(0000);
displaySegment();
delay(2000);
pilihan=0;
while(1)
{
multiplexSegment(a++);
displaySegment();
delay(500);
}
}
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