'****************************************************************
'* Name : Dev_board_demo.BAS *
'* Author : Coenen Stijn [Stynus] *
'* Notice : Licenced under Creative Commons *
'* : Attribution-Noncommercial 2.0 Belgium Licence *
'* : http://creativecommons.org/licenses/by-nc/2.0/be/ *
'* Date : 23/12/2008 *
'* Version : 1.2 *
'* Voor meer info zie: *
'* http://www.schematheek.net/index.php?p=forum/topic&t=72 *
'****************************************************************
Device 16F877A
Config WDT_Off, PWRTE_ON, HS_OSC , LVP_off
Xtal 20
All_Digital = true
'****************************************************************
'Pinnen declareren.
'Leds
Symbol Led1 = PORTD.1 : TRISD.1 = 0
Symbol Led2 = PORTD.0 : TRISD.0 = 0
Symbol Led3 = PORTC.3 : TRISC.3 = 0
Symbol Led4 = PORTC.2 : TRISC.2 = 0
Symbol Led5 = PORTC.1 : TRISC.1 = 0
Symbol Led6 = PORTC.0 : TRISC.0 = 0
Symbol Led7 = PORTE.2 : TRISE.2 = 0
'Schakelaars
Symbol Switch1 = PORTA.0 : TRISA.0 = 1
Symbol Switch2 = PORTA.1 : TRISA.1 = 1
Symbol Switch3 = PORTA.2 : TRISA.2 = 1
Symbol Switch4 = PORTA.3 : TRISA.3 = 1
Symbol Switch5 = PORTA.4 : TRISA.4 = 1
Symbol Switch6 = PORTA.5 : TRISA.5 = 1
Symbol Switch7 = PORTE.0 : TRISE.0 = 1
Symbol Switch8 = PORTE.1 : TRISE.1 = 1
'7 segment displays
Symbol DigitSel = PORTB.0 : TRISB.0 = 0
Symbol Digita = PORTB.7 : TRISB.7 = 0
Symbol Digitb = PORTB.6 : TRISB.6 = 0
Symbol Digitc = PORTB.5 : TRISB.5 = 0
Symbol Digitd = PORTB.4 : TRISB.4 = 0
Symbol Digite = PORTB.3 : TRISB.3 = 0
Symbol Digitf = PORTB.2 : TRISB.2 = 0
Symbol Digitg = PORTB.1 : TRISB.1 = 0
'Lcd
Declare LCD_DTPin PORTD.4
Declare LCD_ENPin PORTD.2
Declare LCD_RSPin PORTD.3
Declare LCD_Interface 4
Declare LCD_Lines 2
'RS232
'Symbol TX = PORTC.6
'Symbol RX = PORTC.7
Hserial_Clear = On 'Zorgt ervoor dat de buffer automatisch
'leeg wordt gemaakt voordat er data wordt
'ontvangen
Declare Hserial_Baud 9600 'Snelheid op 9600 bits/seconde instellen
Hserial_RCSTA = %10010000 'Hardware seriële poort opzetten in
'continue mode
Hserial_TXSTA = %00100000 'Verzenden via uart opzetten in assynchrone
'mode
INTCON = %11000000 'Interrupt opzetten
On_Interrupt GoTo SeriIn 'Bij interrupt naar SeriIn springen
PIE1.5 = 1 'Interrupt voor usart opzetten
'I²C bus
'(Op deze aansluitingen is op het dev boardje niks aangesloten)
Symbol SDO = PORTC.5
Symbol SDI = PORTC.4
'****************************************************************
'Variabelen declareren
Dim KnightTel As Byte
Dim knightbit As Bit
Dim digit1 As Byte
Dim digit2 As Byte
Dim digitval As Byte
Dim digitbit As Bit
Dim vertraging As Byte
Dim serdata As Byte
'****************************************************************
Clear
GoSub SerUit
Cls
Print At 1,1, "SchemaTheek.Net"
Print At 2,1, "16F877 ontwikkelbord"
Print $FE, 2
'****************************************************************
Main:
If vertraging = 100 Then 'Als vertraging de waarde 100 heeft
GoSub Knightrider 'bereikt dan de subroutine knightrider
'uitvoeren
vertraging = 0 'Vertraging terug op 0 zetten
Else 'Als de waarde van 100 nog niet bereikt
Inc vertraging 'is dan vertraging +1 doen
EndIf
GoSub SwitchIn
GoSub Dispuit
GoTo Main
'****************************************************************
SerUit:
HSerOut ["***********************************", 13,10]
HSerOut ["* SchemaTheek.Net *", 13,10]
HSerOut ["* PIC16F877A ontwikkelbordje *", 13,10]
HSerOut ["* Demo programma V1.2 *", 13,10]
HSerOut ["* Laatste update: 23/12/2008 *", 13,10]
HSerOut ["***********************************", 13,10]
HSerOut ["Type hier uw tekst voor op het lcd:", 13,10]
Return
'****************************************************************
SeriIn: 'Interrupt routine
HSerIn [serdata] 'ontvangen data in serdata zetten
Print serdata 'ontvangen data op het lcd printen
HSerOut [serdata] 'Data terug naar pc sturen ter
'bevestiging
Context Restore 'Data herstellen en teruggaan
'****************************************************************
Dispaanst:
GoSub Dispuit
GoSub Dispuit
Return
'****************************************************************
SwitchIn:
digit1.3 = Switch4 +1
digit1.2 = Switch3 +1
digit1.1 = Switch2 +1
digit1.0 = Switch1 +1
digit2.3 = Switch8 +1
digit2.2 = Switch7 +1
digit2.1 = Switch6 +1
digit2.0 = Switch5 +1
Return
'****************************************************************
Dispuit: 'Subroutine begin
If digitbit = 0 Then 'Als de display selectiebit 0 is dan
Low DigitSel 'Het rechste display selecteren
digitval = digit1 'De waarde die op het rechtse display moet
'komen in digitval zetten
digitbit = 1 'De digit selectie bit op 1 zetten voor het
'linkse display bij de volgende keer dat deze
'subroutine wordt aangeroepen
Else 'Als de display selectiebit 1 is dan
High DigitSel 'Het linkse display selecteren
digitval = digit2 'De waarde die op het linkse display moet
'komen in digitval zetten
digitbit = 0 'De digit selectie bit op 0 zetten voor het
'rechtse display bij de volgende keer dat deze
'subroutine wordt aangeroepen
EndIf
Select digitval 'De uitgangen aansturen
'In digitval zit nu de waarde dat het display
'moet gaan weergeven. met de case structuur wordt nu
'het stukje code dat bij dat getal uitgevoerd
Case 0 'Bijvoorbeeld voor 0 wordt dit stukje uitgevoerd tot
High Digita 'aan de volgende case
High Digitb 'De displays zijn op de volgende manier opgebouwd:
High Digitc '
High Digitd ' a
High Digite ' #####
High Digitf ' # #
Low Digitg ' f # g # b
Case 1 ' #####
Low Digita ' # #
High Digitb ' e # d # c
High Digitc ' #####
Low Digitd
Low Digite
Low Digitf
Low Digitg
Case 2
High Digita
High Digitb
Low Digitc
High Digitd
High Digite
Low Digitf
High Digitg
Case 3
High Digita
High Digitb
High Digitc
High Digitd
Low Digite
Low Digitf
High Digitg
Case 4
Low Digita
High Digitb
High Digitc
Low Digitd
Low Digite
High Digitf
High Digitg
Case 5
High Digita
Low Digitb
High Digitc
High Digitd
Low Digite
High Digitf
High Digitg
Case 6
High Digita
Low Digitb
High Digitc
High Digitd
High Digite
High Digitf
High Digitg
Case 7
High Digita
High Digitb
High Digitc
Low Digitd
Low Digite
Low Digitf
Low Digitg
Case 8
High Digita
High Digitb
High Digitc
High Digitd
High Digite
High Digitf
High Digitg
Case 9
High Digita
High Digitb
High Digitc
High Digitd
Low Digite
High Digitf
High Digitg
Case 10 'A
High Digita
High Digitb
High Digitc
Low Digitd
High Digite
High Digitf
High Digitg
Case 11 'B
Low Digita
Low Digitb
High Digitc
High Digitd
High Digite
High Digitf
High Digitg
Case 12 'C
High Digita
Low Digitb
Low Digitc
High Digitd
High Digite
High Digitf
Low Digitg
Case 13 'D
Low Digita
High Digitb
High Digitc
High Digitd
High Digite
Low Digitf
High Digitg
Case 14 'E
High Digita
Low Digitb
Low Digitc
High Digitd
High Digite
High Digitf
High Digitg
Case 15 'F
High Digita
Low Digitb
Low Digitc
Low Digitd
High Digite
High Digitf
High Digitg
Case Else
Low Digita
Low Digitb
Low Digitc
Low Digitd
Low Digite
Low Digitf
High Digitg
EndSelect
DelayMS 1 '1 mS wachten met display opgelicht
Low Digita 'Alle segmenten terug uitzetten
Low Digitb
Low Digitc
Low Digitd
Low Digite
Low Digitf
Low Digitg
Return 'Terugkeren uit subroutine
'****************************************************************
Knightrider: 'Subroutine voor knightrider
If knightbit = 0 Then 'Leds naar links verplaatsen
Inc KnightTel 'Waarde knightrider +1 doen
If KnightTel = 7 Then 'Als de waarde 7 is (hoek) dan
knightbit = 1 'knightbit op 1 zetten zodat bij de volgende
EndIf 'cyclus de leds de andere kant opgaan
Else 'Leds naar rechts verplaatsen
Dec KnightTel 'Waarde knightrider -1 doen
If KnightTel = 1 Then 'Als de waarde 1 is (hoek) dan volgende
knightbit = 0 'cyclus de leds de andere kant opgaan
EndIf 'Leds naar rechts verplaatsen
EndIf
Select KnightTel 'De leds aansturen volgens de waarde van
'KnightTel
Case 1 'Bijvoorbeeld bij de waarde 1 wordt Led1
High Led1 'hoog gemaakt en de rest van de leds laag
Low Led2
Low Led3
Low Led4
Low Led5
Low Led6
Low Led7
Case 2
Low Led1
High Led2
Low Led3
Low Led4
Low Led5
Low Led6
Low Led7
Case 3
Low Led1
Low Led2
High Led3
Low Led4
Low Led5
Low Led6
Low Led7
Case 4
Low Led1
Low Led2
Low Led3
High Led4
Low Led5
Low Led6
Low Led7
Case 5
Low Led1
Low Led2
Low Led3
Low Led4
High Led5
Low Led6
Low Led7
Case 6
Low Led1
Low Led2
Low Led3
Low Led4
Low Led5
High Led6
Low Led7
Case 7
Low Led1
Low Led2
Low Led3
Low Led4
Low Led5
Low Led6
High Led7
Case Else
High Led1
High Led2
High Led3
High Led4
High Led5
High Led6
High Led7
EndSelect
Return 'Terugkeren naar waar de subroutine is
'opgeroepen
'****************************************************************
End