Artikel: [code] Teller met geheugen.

Dit is een teller die van 0 tot 999 of van 0 tot 99 kan tellen. Er zitten 4 knoppen op: +1, -1, +10, -10 en reset. Als de spanning wegvalt dan onthoud de pic de tel waarde in zijn eeprom. Bij de 0-99 versie vervalt het linkse display.

Schema:

Code:
0-999 teller:

'****************************************************************
'* Author : Coenen Stijn [Stynus] *
'* Notice : Copyright (c) 2008 ElektronicaStynus.be *
'* : All Rights Reserved *
'* Date : 20/07/2008 *
'* Version : 1.8 *
'* Notes : Teller *
'****************************************************************
Device 16F628A
Config WDT_OFF, PWRTE_OFF, MCLRE_OFF, INTRC_OSC_NOCLKOUT, LVP_OFF, BODEN_ON
ALL_DIGITAL = true
'****************************************************************
Symbol Cu = PORTA.0
Symbol Cd = PORTA.1

Symbol Cu10 = PORTA.2
Symbol Cd10 = PORTA.3
Symbol noPower = PORTA.4
Symbol reset = PORTA.5
Symbol digit2 = PORTA.6

Symbol digit3 = PORTA.7
Symbol digita = PORTB.0
Symbol display = PORTB
Symbol digit1 = PORTB.7
'****************************************************************
TRISA = %00111111
TRISB = %00000000

'****************************************************************
Dim CuBit As Bit
Dim CdBit As Bit
Dim Cu10Bit As Bit
Dim Cd10Bit As Bit
Dim index As Byte
Dim waarde As Byte
Dim waarde100 As Byte
Dim waarde10 As Byte
Dim waarde1 As Byte

'****************************************************************
'Init
Clear
DelayMS 1000
'Oude tellerstand terug inlezen
waarde1 = ERead 0
waarde10 = ERead 1
waarde100 = ERead 2

DelayMS 1000
'****************************************************************
While 1 = 1
'************************************************************
'Knoppen inlezen
'Count up
If Cu = 0 And CuBit = 0 Then
Inc waarde1
If waarde1 = 10 Then
waarde1 = 0
Inc waarde10
If waarde10 = 10 Then
waarde10 = 0
Inc waarde100
If waarde100 = 10 Then
waarde100 = 0
EndIf
EndIf
EndIf
CuBit = 1
EndIf
If Cu = 1 And CuBit = 1 Then
CuBit = 0
EndIf
GoSub spanningweg
'Count down
If Cd = 0 And CdBit = 0 Then
Dec waarde1
If waarde1 = 255 Then
waarde1 = 9
Dec waarde10
If waarde10 = 255 Then
waarde10 = 9
Dec waarde100
If waarde100 = 255 Then
waarde100 = 9
EndIf
EndIf
EndIf
CdBit = 1
EndIf
If Cd = 1 And CdBit = 1 Then
CdBit = 0
EndIf
GoSub spanningweg
'Count up + 10
If Cu10 = 0 And Cu10Bit = 0 Then
Inc waarde10
If waarde10 = 10 Then
waarde10 = 0
Inc waarde100
If waarde100 = 10 Then
waarde100 = 0
EndIf
EndIf
Cu10Bit = 1
EndIf
If Cu10 = 1 And Cu10Bit = 1 Then
Cu10Bit = 0
EndIf
GoSub spanningweg
'Count down - 10
If Cd10 = 0 And Cd10Bit = 0 Then
Dec waarde10
If waarde10 = 255 Then
waarde10 = 9
Dec waarde100
If waarde100 = 255 Then
waarde100 = 9
EndIf
EndIf
Cd10Bit = 1
EndIf
If Cd10 = 1 And Cd10Bit = 1 Then
Cd10Bit = 0
EndIf
GoSub spanningweg
'Controleren op reset
If reset = 0 Then
waarde1 = 0
waarde10 = 0
waarde100 = 0
EndIf
'************************************************************
GoSub dispuit

Wend
'****************************************************************
'Subroutines
dispuit:
For index = 0 To 2
Select index
Case 0
waarde = waarde1
Case 1
waarde = waarde10
Case 2
waarde = waarde100
EndSelect
Select Case waarde
Case 0 'gfedcba
display = %00111111
Case 1 'gfedcba
display = %00000110
Case 2 'gfedcba
display = %01011011
Case 3 'gfedcba
display = %01001111
Case 4 'gfedcba
display = %01100110
Case 5 'gfedcba
display = %01101101
Case 6 'gfedcba
display = %01111101
Case 7 'gfedcba
display = %00000111
Case 8 'gfedcba
display = %01111111
Case 9 'gfedcba
display = %01101111
'Bij fout
Case Else 'gfedcba
display = %01111001
EndSelect
Select index
Case 0
High digit1
Case 1
High digit2
Case 2
High digit3
EndSelect
DelayMS 1
GoSub spanningweg
Low digit1
Low digit2
Low digit3
Next
Return

spanningweg:
'Controleren op voedingsspanning
If noPower = 1 Then
EWrite 0 , [waarde1]
DelayMS 20
EWrite 1 , [waarde10]
DelayMS 20
EWrite 2 , [waarde100]
While noPower = 1
DelayMS 1000
Wend
EndIf
Return

'****************************************************************
End

0-99 teller:

'****************************************************************
'* Author : Coenen Stijn [Stynus] *
'* Notice : Copyright (c) 2008 ElektronicaStynus.be *
'* : All Rights Reserved *
'* Date : 20/07/2008 *
'* Version : 1.8 *
'* Notes : Teller *
'****************************************************************
Device 16F628A
Config WDT_OFF, PWRTE_OFF, MCLRE_OFF, INTRC_OSC_NOCLKOUT, LVP_OFF, BODEN_ON
ALL_DIGITAL = true
'****************************************************************
Symbol Cu = PORTA.0
Symbol Cd = PORTA.1

Symbol Cu10 = PORTA.2
Symbol Cd10 = PORTA.3
Symbol noPower = PORTA.4
Symbol reset = PORTA.5
Symbol digit2 = PORTA.6

Symbol digita = PORTB.0
Symbol display = PORTB
Symbol digit1 = PORTB.7
'****************************************************************
TRISA = %00111111
TRISB = %00000000
'****************************************************************

Dim CuBit As Bit
Dim CdBit As Bit
Dim Cu10Bit As Bit
Dim Cd10Bit As Bit
Dim index As Byte
Dim waarde As Byte
Dim waarde10 As Byte
Dim waarde1 As Byte

'****************************************************************
'Init
Clear
Low PORTA.7
DelayMS 1000
'Oude tellerstand terug inlezen
waarde1 = ERead 0
waarde10 = ERead 1

DelayMS 1000
'****************************************************************
While 1 = 1

'************************************************************
'Knoppen inlezen
'Count up
If Cu = 0 And CuBit = 0 Then
Inc waarde1
If waarde1 = 10 Then
waarde1 = 0
Inc waarde10
If waarde10 = 10 Then
waarde10 = 0
EndIf
EndIf
CuBit = 1
EndIf
If Cu = 1 And CuBit = 1 Then
CuBit = 0
EndIf
GoSub spanningweg
'Count down
If Cd = 0 And CdBit = 0 Then
Dec waarde1
If waarde1 = 255 Then
waarde1 = 9
Dec waarde10
If waarde10 = 255 Then
waarde10 = 9
EndIf
EndIf
CdBit = 1
EndIf
If Cd = 1 And CdBit = 1 Then
CdBit = 0
EndIf
GoSub spanningweg
'Count up + 10
If Cu10 = 0 And Cu10Bit = 0 Then
Inc waarde10
If waarde10 = 10 Then
waarde10 = 0
EndIf
Cu10Bit = 1
EndIf
If Cu10 = 1 And Cu10Bit = 1 Then
Cu10Bit = 0
EndIf
GoSub spanningweg
'Count down - 10
If Cd10 = 0 And Cd10Bit = 0 Then
Dec waarde10
If waarde10 = 255 Then
waarde10 = 9
EndIf
Cd10Bit = 1
EndIf
If Cd10 = 1 And Cd10Bit = 1 Then
Cd10Bit = 0
EndIf
GoSub spanningweg
'Controleren op reset
If reset = 0 Then
waarde1 = 0
waarde10 = 0
EndIf
'************************************************************
GoSub dispuit

Wend
'****************************************************************
'Subroutines
dispuit:
For index = 0 To 1
Select index
Case 0
waarde = waarde1
Case 1
waarde = waarde10
EndSelect
Select Case waarde
Case 0 'gfedcba
display = %00111111
Case 1 'gfedcba
display = %00000110
Case 2 'gfedcba
display = %01011011
Case 3 'gfedcba
display = %01001111
Case 4 'gfedcba
display = %01100110
Case 5 'gfedcba
display = %01101101
Case 6 'gfedcba
display = %01111101
Case 7 'gfedcba
display = %00000111
Case 8 'gfedcba
display = %01111111
Case 9 'gfedcba
display = %01101111
'Bij fout
Case Else 'gfedcba
display = %01111001
EndSelect
Select index
Case 0
High digit1
Case 1
High digit2
EndSelect
DelayMS 1
GoSub spanningweg
Low digit1
Low digit2
Next
Return

spanningweg:
'Controleren op voedingsspanning
If noPower = 1 Then
EWrite 0 , [waarde1]
DelayMS 20
EWrite 1 , [waarde10]
While noPower = 1
DelayMS 1000
Wend
EndIf
Return
'****************************************************************
End

Een reactie achterlaten

Your email address will not be published.