;-------------------------------------------------------------------------------
;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
;-------------------------------------------------------------------------------