PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RN-Digi Elemente einzeln abschalten



daneil86
21.11.2010, 09:05
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:




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