program central2
dim shifter, portd_index,servo1,servo2 as byte
digit, number as word
portd_array as byte[4]
sub function mask(dim num as Word) as Word
select case num
case 0
result= $88
case 1
result= $DB
case 2
result= $94
case 3
result= $91
case 4
result= $C3
case 5
result= $A1
case 6
result= $A0
case 7
result= $9B
case 8
result= $80
case 9
result= $81
end select
end sub
sub procedure interrupt
if PIR1.TMR1IF = 1 then
PIR1.TMR1IF = 0 ' clear TMR1IF
TMR1H = 200
TMR1L = 200
PORTE = 0 ' turn off all 7seg displays
PORTD = portd_array[portd_index] ' bring appropriate value to PORTD
PORTE = shifter ' turn on appropriate 7seg. display
' move shifter to next digit
shifter= shifter << 1
if (shifter > 8) then
shifter = 1
end if
' increment portd_index
Inc(portd_index)
if (portd_index > 3) then
portd_index = 0 ' turn on 1st, turn off 2nd 7seg.
end if ' reset TIMER0 value
end if
if INTCON.INT0IF = 0 then
TMR0L = 178
INTCON = $20 ' set T0IE, clear T0IF
PORTB = not PORTB
end if
end sub
main:
INTCON = $E0
T0CON = 0xC7 ' set TMR0 in 8bit mode, assign prescaler to TMR0
TRISB = 200 ' PORTB is output
TRISD = 200
PORTB = $FF ' initialize PORTB
TMR0L = 178 ' timer0 initial value
' timer0 initial value
' enable TMRO interrupt
' initialize cnt
servo1 = 182
servo2 = 182 ' Enable TMRO interrupt
T1CON = %00000001 ' timer1 settings
PIR1.TMR1IF = 0 ' clear TMR1IF
TMR1H = 0 ' initialize Timer1 register
TMR1L = 0
PIE1.TMR1IE = 1 ' enable Timer1 interrupt
' set GIE, PEIE
TRISA=0
digit = 0
portd_index = 0
shifter = 1
PORTE = 0
TRISE = 0 ' set PORTA as output
TRISB = %00000000
TRISD = 0
PORTD = 0
' set PORTD as output
number = 0 ' some initial value
while TRUE
digit = number / 1000 ' extract thousands digit
portd_array[3] = mask(digit)
' and store it to PORTD array
digit = (number / 100) mod 10 ' extract hundreds digit
portd_array[2] = mask(digit)
' and store it to PORTD array
digit = (number / 10) mod 10 ' extract tens digit
portd_array[1] = mask(digit)
' and store it to PORTD array
digit = number mod 10 ' extract ones digit
portd_array[0] = mask(digit) ' and store it to PORTD array
' one second delay
number = PORTC ' increment number
if (number > 999) then
number = 0
end if
if TMR0L <= servo1 then
PORTD.5 = 1
else
PORTD.5 = 0
end if
if TMR0L <= servo2 then
PORTD.6 = 1
else
PORTD.6 = 0
end if
wend ' endless loop
end.