'****************************************************************
'*  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