;-------------------------------------------------------------------------------
;16F684
;
;Led knipperlicht
;
; interne oscillator op 4MHz
; interne MCLR
;-------------------------------------------------------------------------------
include 16f684
pragma target clock 4_000_000 ;oscillator frequency
pragma target OSC XT ;4MHz xTal
pragma target WDT disabled ;no watchdog
pragma target MCLR internal ;reset internally
enable_digital_io() ;alle pinnen digitale IO
;LED is via voorschakelweerstand aangesloten op pin A0
alias led is pin_A0
pin_A0_direction = output
led = off
;-------------------------------------------------------------------------------
;instellingen voor Timer2
;Prescaler= 16
;PostScaler = 5
;PR2 = 250 - 1 voor herlaadtijd
;Freq = 50 Hz
;Tijd = 0.02 seconden
;-------------------------------------------------------------------------------
T2CON_TOUTPS = 0b0100 ;postscaler
T2CON_T2CKPS = 0b11
PR2 = 249 ;herlaadwaarde
PIE1_TMR2IE = high ;Timer2 interrupt enable
INTCON_PEIE = high ;perifierie interrupt enable
PIR1_TMR2IF = low ;wis interrupt vlag
const byte TimerCounterReload = 50
var byte TimerCounter = TimerCounterReload
var volatile byte TimePassed = 0
const byte BlinkTimerReload = 20
var byte BlinkTimer = BlinkTimerReload
var volatile byte Blink = 0
var byte TextOn = 0
;-------------------------------------------------------------------------------
;LCD declaratie en initialisatie
;-------------------------------------------------------------------------------
;Volgende constanten moeten gedeclareerd worden:
const byte LCD_ROWS = 2 -- 1, 2 or 4 lines
const byte LCD_CHARS = 20 -- 8, 16 or 20 chars per line
;Alisassen voor de handshake-lijnen:
alias lcd_rs is pin_c5 -- cmd/data select
alias lcd_en is pin_c4 -- trigger
pin_C5_direction = output
pin_C4_direction = output
;Aliassen voor de vier datalijnen:
alias lcd_dataport is portC_low -- 4 databits
pin_C0_direction = output
pin_C1_direction = output
pin_C2_direction = output
pin_C3_direction = output
var byte World[11] = "Hello World"
var byte ClearText[11] = " "
;laad de eigenlijke bibliotheek
include lcd_hd44780_4
;en ionitialiseer het display
lcd_init() -- init the lcd controller
;We laden meteen een andere interessante bibliotheek om eenvoudig tekst
;op het display te krijgen
include print
;Om het scherm toch iets nuttig te laten zien, tonen we de verlopen seconden
var dword dwSeconds = 0
;en we zetten de tekst op het scherm na dit voor alle zekerheid eerst te
;wissen:
lcd_clear_screen()
print_string(lcd, World)
;Instellingen voor frequentieteller
alias Test is pin_A2
pin_A2_direction = output
Test = off
;-------------------------------------------------------------------------------
;INTERRUPT PROCEDURE
;-------------------------------------------------------------------------------
procedure TimerInterrupt is
pragma interrupt
if(PIR1_TMR2IF)then
PIR1_TMR2IF = low
;20ms
Test = !Test
;laat dit 50 keer gebeuren voor 1 seconde
TimerCounter = TimerCounter - 1
if(TimerCounter == 0)then
TimerCounter = TimerCounterReload ;herlaad de teller
TimePassed = 1 ;tijd is verstreken
end if
;laat dit x keer gebeuren om te knipperen
BlinkTimer = BlinkTimer - 1
if(BlinkTimer == 0)then
BlinkTimer = BlinkTimerReload
Blink = 1
end if
end if
end procedure
;-------------------------------------------------------------------------------
;variabelen voor de tijd
;-------------------------------------------------------------------------------
var byte Seconds = 59
var byte Minutes = 59
var byte Hours = 23
;-------------------------------------------------------------------------------
;procedure om te tijd weer te geven
;-------------------------------------------------------------------------------
procedure ShowTime is
;zet de tijd op het display
lcd_cursor_position(1,0)
if(Hours < 10)then
lcd_write_char("0")
end if
print_byte_dec(lcd, Hours)
lcd_write_char(":")
if(Minutes < 10)then
lcd_write_char("0")
end if
print_byte_dec(lcd, Minutes)
lcd_write_char(":")
if(Seconds < 10)then
lcd_write_char("0")
end if
print_byte_dec(lcd, Seconds)
end procedure
;-------------------------------------------------------------------------------
T2CON_TMR2ON = high ;turn timer2 on;
INTCON_GIE = high ;enable interrupts
;-------------------------------------------------------------------------------
forever loop
if(TimePassed > 0)then
;1 seconde is verstreken
TimePassed = 0 ;wis de vlag
Led = !Led ;zet de led aan of uit
;Tijd aanpassen en weergeven
Seconds = Seconds + 1
if(Seconds > 59)then
Seconds = 0
Minutes = Minutes + 1
if(Minutes > 59)then
Minutes = 0
Hours = Hours + 1
if(Hours > 23)then
Hours = 0
end if
end if
end if
;Zet de tijd op de LCD
ShowTime
end if
;Knipper 'Hello World'
if(Blink > 0)then
Blink = 0
lcd_cursor_position(0,0)
if(TextOn > 0)then
TextOn = 0
print_string(lcd, World)
else
TextOn = 1
print_string(lcd, ClearText)
end if
end if
end loop
;-------------------------------------------------------------------------------