PIC 16F684 van knipperlicht naar... (pagina 6)
Digitale input
Naast analoge input is er natuurlijk ook nog digitale input.
Een heel eenvoudig programma om dit te demonstreren. Een drukknop is via een pull-up weerstand aangesloten op pen RA3. Op het display komt de melding "OFF". Tijdens het indrukken van de schakelaar komt de melding "ON". Heel eenvoudig.
;------------------------------------------------------------------------------- ;instellingen voor de schakelaar ;------------------------------------------------------------------------------- alias switch is pin_A3 pin_A3_direction = input const byte sw_on[] = "ON " const byte sw_off[] = "OFF" |
De instellingen hoeven niet veel uitleg: pin A3 wordt als ingang geconfigureerd en twee constante strings worden gedefiniëerd voor de tekst "ON/OFF"
Pin A3 als input... Pin A3 kan alleen maar als input dienen. Het is één van de 'speciale' aansluitpennen van de PIC. Pin A3 is de resetpin van de chip en moet via een pull-up weerstand met de positieve voedingsspanning verbonden zijn.
Op die manier is pin A3 echter voor niets anders meer te gebruiken. Wanneer we die pin wel willen gebruiken, moeten we de processor laten weten dat hij zelf (intern) zijn reset moet behandelen en dat doen we tijdens de configuratie-instellingen van de processor:
pragma target MCLR internal ;reset internally |
De MainLoop spreekt voor zichzelf: de toestand van de schakelaar wordt bekeken en afhankelijk van die toestand komt ON/OFF op het scherm.
;------------------------------------------------------------------------------- forever loop lcd_cursor_position(1,0) ;switch is laag-waar if(!switch)then print_string(lcd, sw_on) else print_string(lcd, sw_off) end if end loop ;------------------------------------------------------------------------------- |
De aangepaste MainLoop (nu ook met een eenvoudige debounce):
;------------------------------------------------------------------------------- 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 ;------------------------------------------------------------------------------- |
(pagina 4) ...PIC 16F684 van knipperlicht naar... (pagina 7)
Links