{**************************************************************
* Project ..........: 3 Digit Seven Segment Display Example.
* File name ........: SSD_Counter.mpas
* File version .....: v1.0
* Date .............: 17/12/2019
* Author ...........: Indrit Bekteshi
* Build SW .........: mikroPascal PRO for AVR v6.1.1
* Description ......: Seven Segment Display Counter 0 to 999
* Configuration ....: -
* MCU .......: Atmega8
* Oscillator : Int. 8.0000 MHz
* Datashet ..: https://tinyurl.com/yccl8mzu
**************************************************************}Program
SSD_Counter;
Var
SSD_1_Dir : sBit At DDRC
.5
; Sfr;
Var
SSD_2_Dir : sBit At DDRC
.4
; Sfr;
Var
SSD_3_Dir : sBit At DDRC
.3
; Sfr;
Var
SSD_1 : sBit At PORTC
.5
; Sfr;
Var
SSD_2 : sBit At PORTC
.4
; Sfr;
Var
SSD_3 : sBit At PORTC
.3
; Sfr;
Var
SSD_Segments_Dir :
Byte
At DDRD; Sfr;
Var
SSD_Segments :
Byte
At PORTD; Sfr;
Const
INIT_TIMER0 :
Byte
= (
256
-
156
);
(* Common Anode Segments *)
Const
SEGMENT_DP :
Byte
=
$7F
;
Const
SSD_NUM_MASK :
Array
[
0..9
]
Of
Byte
= (
$C0
,
{ Number 0 }
$F9
,
{ Number 1 }
$A4
,
{ Number 2 }
$B0
,
{ Number 3 }
$99
,
{ Number 4 }
$92
,
{ Number 5 }
$82
,
{ Number 6 }
$F8
,
{ Number 7 }
$80
,
{ Number 8 }
$90
);
{ Number 9 }
Type
TSSD_Numeric =
Record
Digit :
Byte
;
Dp :
Boolean
;
End
;
Type
TCounter =
Record
SSD : TSSD_Numeric;
Counter :
Word
;
Timer_1 :
Byte
;
Timer_2 :
Byte
;
End
;
Var
Cnt : TCounter;
Procedure
SSD_Init();
Begin
(* PORT Configuration *)
SSD_Segments_Dir := %
11111111
;
SSD_Segments := %
00000000
;
SSD_1_Dir :=
1
;
SSD_2_Dir :=
1
;
SSD_3_Dir :=
1
;
SSD_1 :=
0
;
SSD_2 :=
0
;
SSD_3 :=
0
;
(* Switch on all segments for 1 sec. *)
Delay_Ms(
1000
);
(* Switch off segments for 200 ms. *)
//SSD_Segments := %11111111;
SSD_1 :=
1
;
SSD_2 :=
1
;
SSD_3 :=
1
;
Delay_Ms(
200
);
(* Variants / Declarations initialization *)
Cnt
.
SSD
.
Digit :=
0
;
Cnt
.
SSD
.
Dp :=
True
;
Cnt
.
Timer_1 :=
0
;
Cnt
.
Timer_2 :=
0
;
Cnt
.
Counter :=
0
;
(* Timer0 5ms Configuration *)
TCCR0 := %
00000100
;
TCNT0 := INIT_TIMER0;
(* Start Interrupts *)
ASM
SEI
END
;
(* Start the Timer0 *)
SetBit(TIMSK, TOIE0);
End
;
{
**************************************************************
* 3 Digit 7 Segment Display Multiplexing
* Procedure Display numbers from 0 to 999
**************************************************************}
Procedure
SSD_Display_Number(Number :
Word
);
Const
Fike =
1
; Ndeze =
0
;
Const
D1 =
0
; D2 =
1
; D3 =
2
;
Begin
//If (Number > 999) Then Number := 999;
Case
Cnt
.
SSD
.
Digit
Of
D1 :
Begin
(* Paraqit numrat tre shifrorë *)
SSD_3 := Fike;
SSD_Segments := SSD_NUM_MASK[(Number
Div
100
)
Mod
10
];
SSD_1 := Ndeze;
Cnt
.
SSD
.
Digit := D2;
End
;
D2 :
Begin
(* Paraqit numrat dy shifrorë *)
SSD_1 := Fike;
SSD_Segments := SSD_NUM_MASK[(Number
Div
10
)
Mod
10
];
SSD_2 := Ndeze;
Cnt
.
SSD
.
Digit := D3;
End
;
D3 :
Begin
(* Paraqit numrat një shifrorë *)
SSD_2 := Fike;
SSD_Segments := SSD_NUM_MASK[Number
Mod
10
];
If
(Cnt
.
SSD
.
Dp)
Then
SSD_Segments:= SSD_Segments
And
SEGMENT_DP;
SSD_3 := Ndeze;
Cnt
.
SSD
.
Digit := D1;
End
;
End
;
End
;
(* Timer0 Interrupt Rutine *)
Procedure
T0_OVF_ISR(); iv IVT_ADDR_TIMER0_OVF;
Begin
SSD_Display_Number(Cnt
.
Counter);
Inc(Cnt
.
Timer_1);
TCNT0 := INIT_TIMER0;
End
;
(* Main Program Rutine *)
Begin
SSD_Init();
Repeat
If
(Cnt
.
Timer_1 >=
100
)
Then
Begin
Cnt
.
Timer_1 :=
0
;
Inc(Cnt
.
Timer_2);
If
(Cnt
.
Timer_2 >=
2
)
Then
Begin
Inc(Cnt
.
Counter);
Cnt
.
Timer_2 :=
0
;
End
;
Cnt
.
SSD
.
Dp :=
Not
Cnt
.
SSD
.
Dp;
End
;
If
(Cnt
.
Counter >
999
)
Then
Cnt
.
Counter :=
0
;
Until
(
0
);
End
.