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:
Gruß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
Daniel
Lesezeichen