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

;-------------------------------------------------------------------------------
;instellingen voor de schakelaar
;-------------------------------------------------------------------------------
alias   switch   is pin_A3
pin_A3_direction =  input
const byte sw_on[]  = "ON "
const byte sw_off[] = "OFF"
var byte sw_flags
var bit sw_vorige at sw_flags : 0
var bit sw_temp   at sw_flags : 1
var bit sw_output at sw_flags : 2
;schakelaar is laag-waar daarom uitgangspositie is high
sw_vorige = high
sw_temp = high
sw_output = off
;-------------------------------------------------------------------------------
;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

;en we zetten de tekst op het scherm na dit voor alle zekerheid eerst te
;wissen:
lcd_clear_screen()
print_string(lcd, World)
lcd_cursor_position(1,0)
print_string(lcd, sw_off)
;-------------------------------------------------------------------------------
forever loop
  sw_temp = switch
  ;eenvoudige debounce
  _usec_delay(20)
  if(sw_temp == switch)then
    ;stabiele toestand
    ;is de schakelaarstand gewijzigd tov vorige keer?
    if(sw_vorige != sw_temp)then
      ;ja!
      ;ingedrukt?
      if(!sw_temp)then
        ;ja - signaleer de wijziging
        lcd_cursor_position(1,0)
        sw_output = !sw_output
        if(sw_output)then
          print_string(lcd, sw_on)
        else
          print_string(lcd, sw_off)
        end if
      end if
      ;sla deze toestand op
      sw_vorige = sw_temp
    end if
  end if
end loop
;-------------------------------------------------------------------------------