hi,
ich benutze die RN-Digi Schaltung zur Darstellung 1-4 stelliger Zahlen auf den 4 Siebensegmentanzeigen. Nun möchte ich bei beispielsweise bei 2- oder 3-stelligen Zahlen die vordersten Siebensegmentanzeigen abschalten. Ich bin aus dem Datenblatt des SAA1064 nicht ganz schlau geworden. Anscheinend kann man mit Controlbit 1 und 2 jeweils zwei Elemente lahmlegen. Aber wie kann ich einzelne ausschalten?
Hier noch mein bisher verwendeter Code und im Anhang das Datenblatt des SAA1064:
Code:
Declare Sub Led_display_init()
Declare Sub Led_display(byval Ziffer As Byte , Byval Zahl As Byte)
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000 'Quarzfrequenz
$baud = 9600
Const Rn_digi_slave_write = &H70
Const Rn_digi_slave_read = &H71
Const Dezimalpunktziffer = 0 'Segment wo Dezimalpunkt leuchten soll (0=keinen)
Const Timervorgabe = 3036
Dim Segmente As Byte
Dim Z As Byte
Dim Beiner As Byte
Dim Bzehner As Byte
Dim Bhunderter As Byte
Dim Btausender As Byte
Dim Einer As Word
Dim Zehner As Word
Dim Hunderter As Word
Dim Tausender As Word
Dim A As Word
Dim Zaehlerirq0 As Long
Dim Impulseprosekunde As Long
Dim Impulseprominute As Long
Dim Umdrehungenprominute As Integer
Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1
Config Int0 = Falling
Config Timer1 = Timer , Prescale = 256
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
Config Lcdbus = 4
Zaehlerirq0 = 0
On Int0 Irq0
Enable Int0
On Timer1 Timer_irq
Enable Timer1
Enable Interrupts
I2cinit
Led_display_init
Sound Portd.7 , 400 , 450 'BEEP
Sound Portd.7 , 400 , 250 'BEEP
Sound Portd.7 , 400 , 450 'BEEP
Cls
Locate 1 , 1
Lcd "Upm="
'Locate 2 , 1
'Lcd "Ips="
Bhunderter = 0
Btausender = 0
Beiner = 0
Bzehner = 0
Do
Umdrehungenprominute = Impulseprosekunde * 26
Umdrehungenprominute = Umdrehungenprominute / 15
Locate 1 , 5
Lcd Umdrehungenprominute
'Locate 2 , 5
'Lcd Impulseprosekunde
A = Umdrehungenprominute
Einer = A Mod 10
A = A - Einer
A = A / 10
Zehner = A Mod 10
A = A - Zehner
A = A / 10
Hunderter = A Mod 10
A = A - Hunderter
A = A / 10
Tausender = A Mod 10
If Btausender = Tausender Then
Else
Btausender = Tausender
Led_display 2 , Btausender
End If
If Bhunderter = Hunderter Then
Else
Btausender = Tausender
Led_display 1 , Bhunderter
End If
If Bzehner = Zehner Then
Else
Bzehner = Zehner
Led_display 4 , Bzehner
End If
If Beiner = Einer Then
Else
Beiner = Einer
Led_display 3 , Beiner
End If
Bhunderter = Hunderter
Btausender = Tausender
Beiner = Einer
Bzehner = Zehner
Loop
End
Sub Led_display_init()
I2cstart
I2cwbyte Rn_digi_slave_write
I2cwbyte 0 'Control Byte
'Dynamic Alternative Mode und Helligkeit
'Die oberen 3 Bits bestimmen die Helligkeit
'Wenn es dunkler sein soll dann z.b. &B0110111
I2cwbyte &B0110111 '&B1110111
I2cstop
'Alle Ziffern auf 0
For Z = 1 To 4
Led_display Z , 0
Next Z
End Sub
Sub Led_display(ziffer An Byte , Zahl As Byte)
I2cstart
I2cwbyte Rn_digi_slave_write
I2cwbyte Ziffer
Select Case Zahl
Case 0:
Segmente = &H3F '00111111
Case 1:
Segmente = &H06 '00000110
Case 2:
Segmente = &H5B '01011011
Case 3:
Segmente = &H4F
Case 4:
Segmente = &H66
Case 5:
Segmente = &H6D
Case 6:
Segmente = &H7D
Case 7:
Segmente = &H07
Case 8:
Segmente = &H7F
Case 9:
Segmente = &H67
Case Else :
Segmente = &H80 'Ansonsten Dezimalpunkt
End Select
If Dezimalpunktziffer = Ziffer Then Segmente = Segmente Or &H80
I2cwbyte Segmente
I2cstop
End Sub
'Pro Impuls (Markierung auf Scheibe) ein Aufruf
Irq0:
Incr Zaehlerirq0
Return
'Pro Sekunde ein Aufruf
Timer_irq:
Timer1 = Timervorgabe
Impulseprosekunde = Zaehlerirq0
Zaehlerirq0 = 0
Return
Gruß
Daniel
Lesezeichen