Hallo zusammen!
Nachdem mir Grandpa freundlicherweise einer der
Adafruit I2C 4-fach 7-Segment LED-Anzeigen zum Testen zur Verfügung gestellt hat, möchte ich hier mal kurz ein kleines Beispielprogramm einstellen.
Anfänglich habe ich etwas mit der Inbetriebnahme gekämpft, obwohl das INIT von den Werten her richtig war......
Dirk hat mich dann aber darauf hingewiesen, dass jede einzelne INIT-Anweisung auch EINZELN an den HT16K33 übertragen werden MUSS!
Man kann das INIT, bestehend aus vier Bytes, also NICHT am Stück zum Chip senden!
Nachdem diese Hürde genommen war, funktionierte die Anzeige auch sofort problemlos.
Nun noch ein kurzer Hinweis zum nachfolgenden Programm:
Das Programm ist lediglich ein Beispielprogramm und soll verschiedene Möglichkeiten aufzeigen, wie man die LED-Anzeige via I2C ansteuern kann!
Das folgende Programm enthält:
Die wichtigsten Funktionen habe ich in separate Subroutinen geschrieben.
So kann jeder schauen, was er gebrauchen kann..... oder modifizieren möchte.
Ach so....
Die Zeichentabelle habe ich absichtlich mit 31 "Leerstellen" gefüllt!
Man kann das natürlich auch entfernen und in der zugehörigen Sub einfach ein "-32" verwenden!
Das kann aber jeder machen, wie er es mag.
Nun aber genug der vielen Worte.....
Hier mal das Beispielprogramm:
Viel Spaß damit,
Cassio
Nachdem mir Grandpa freundlicherweise einer der
Adafruit I2C 4-fach 7-Segment LED-Anzeigen zum Testen zur Verfügung gestellt hat, möchte ich hier mal kurz ein kleines Beispielprogramm einstellen.
Anfänglich habe ich etwas mit der Inbetriebnahme gekämpft, obwohl das INIT von den Werten her richtig war......
Dirk hat mich dann aber darauf hingewiesen, dass jede einzelne INIT-Anweisung auch EINZELN an den HT16K33 übertragen werden MUSS!
Man kann das INIT, bestehend aus vier Bytes, also NICHT am Stück zum Chip senden!
Nachdem diese Hürde genommen war, funktionierte die Anzeige auch sofort problemlos.
Nun noch ein kurzer Hinweis zum nachfolgenden Programm:
Das Programm ist lediglich ein Beispielprogramm und soll verschiedene Möglichkeiten aufzeigen, wie man die LED-Anzeige via I2C ansteuern kann!
Das folgende Programm enthält:
- Daten im String verarbeiten
- Senden einzelner Bytes an ein definiertes Digit
- Einstellen der Dimmfunktion
- Display Ein/Aus schalten
- Die drei Blinkfrequenzen einstellen
- Den HT16K33 in den StandBy-Mode schalten und zurück holen
Die wichtigsten Funktionen habe ich in separate Subroutinen geschrieben.
So kann jeder schauen, was er gebrauchen kann..... oder modifizieren möchte.
Ach so....
Die Zeichentabelle habe ich absichtlich mit 31 "Leerstellen" gefüllt!
Man kann das natürlich auch entfernen und in der zugehörigen Sub einfach ein "-32" verwenden!
Das kann aber jeder machen, wie er es mag.
Nun aber genug der vielen Worte.....
Hier mal das Beispielprogramm:
Code:
'
'Adafruit I2C 7-Segment LED-Anzeige
'CASSIO by AVR-Praxis.de
'Beispielprogramm zur Ansteuerung
'
'
$regfile = "m8adef.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 128
$framesize = 128
'$baud = 38400
' ATMega8
' +---v---+
' (RESET) PC6 |1 28| PC5 (SCL)
' (RXD) PD0 |2 27| PC4 (SDA)
' (TXD) PD1 |3 26| PC3
' (INT0) PD2 |4 25| PC2
' (INT1) PD3 |5 24| PC1
' (XCK/T0) PD4 |6 23| PC0
' VCC |7 22| GND
' GND |8 21| AREF
' (XTAL1) PB6 |9 20| AVCC
' (XTAL2) PB7 |10 19| PB5 (SCK)
' PD5 |11 18| PB4 (MISO)
' PD6 |12 17| PB3 (MOSI/OC2)
' PD7 |13 16| PB2
' PB0 |14 15| PB1
' +-------+
'( CASSIOs AVR32pin Modul
----------------------------
-----AVR32pinMSL-Modul------
----------------------------
o--PD5 | PD4--o
o--PD6 | INT1/PD3--o
o--PD7 | INT0/PD2--o
o--PB0-------| TxD/PD1--o
o--PB1/OC1A |----RxD/PD0--o
o--PB2/OC1B | SCL/PC5--o SCL
o--PB3/MOSI | SDA/PC4--o SDA
o--PB4/MISO | PC3--o
o--PB5/SCK | PC2--o
o--PB6/XTAL1 | PC1--o
o--PB7/XTAL2-|--------PC0--o
o--Vcc 8/16MHz ADC7--o
o--Vcc Resonator Aref--o
o--GND | ADC6--o
----------------------------
')
Ddrd = &B_000000_10
Portd = &B111111_01
Ddrc = &B_11_0000
Portc = &B00_1111
Ddrb = &B_000
Portb = &B111
' #############################################################################
' I2C-Config
Config Scl = Portc.5 'I2C SCL
Config Sda = Portc.4 'I2C SDA
$lib "i2c_twi.lbx"
Config Twi = 400000 'BUS-Takt,
Const 16k33 = &HE0 'Standardadresse des LED-Moduls
' HT16K33/28pin
' ___
' Vss -o|1 |o- Vdd
' COM0/AD -o| |o- SDA
' COM1/KS0 -o| |o- SCL
' COM2/KS1 -o| |o- ROW0/A2
' COM3/KS2 -o| |o- ROW1/A1
' COM4 -o| |o- ROW2/A0
' COM5 -o| |o- ROW3
' COM6 -o| |o- ROW4
' COM7 -o| |o- ROW5
'ROW15/INT -o| |o- ROW6
' ROW14 -o| |o- ROW7
' ROW13 -o| |o- ROW8
' ROW12 -o| |o- ROW9
' ROW11 -o|_15|o- ROW10
' #############################################################################
Dim Segmente(11) As Byte 'Segmente-Speicher
Dim Text As String * 5 'Textstring
Dim Ascii(5) As Byte At Text Overlay 'ASCII-Werte des Teststrings
Dim Z As Byte 'Ziffernzähler für den String
Dim I As Byte , J As Byte 'interne Zählvariablen
Declare Sub Led_cmd(byval Command As Byte) 'Sub zum Senden von Kommandos
Declare Sub Led_(byval Ram_addr As Byte , Byval Anzeige As String * 5) 'Sub für Strings
Declare Sub Led_bin(byval Addr As Byte , Byval Wert As Byte) 'Sub für binäre Werte
Const Blink05 = &H83 'Blinken 0,5Hz
Const Blink1 = &H85 'Blinken 1Hz
Const Blink2 = &H87 'Blinken 2Hz
Const Display_on = &H81 'Display ein / Blinken aus
Const Display_off = &H80 'Display aus
Const Standy_mode = &H20 'Standby Mode aktivieren
Const Run_mode = &H21 'Standby Mode beenden
' #############################################################################
Dim Temp As Byte 'Temporäre Variable für das Programm
Dim Zaehler As Byte 'Zählervariable für Dimmeranzeige
' #############################################################################
Gosub Led_init 'Zu Beginn erst mal ein INIT ausführen!
Wait 1
Do
Led_ 1 , "12:34" 'String 12:34 anzeigen
Wait 2
Led_ 1 , "56 78" 'String 56 78 anzeigen
Wait 2
Led_bin 1 , &H80 'DP an Digit 1 hinzufügen!
Wait 1
Led_bin 2 , &H80 'DP an Digit 2 hinzufügen!
Wait 1
Led_bin 4 , &H80 'DP an Digit 4 hinzufügen!
Wait 1
Led_bin 5 , &H80 'DP an Digit 5 hinzufügen!
Wait 1
Led_bin 3 , &H02 'Doppelpunkte (Digit 3) einschalten
Wait 1
' automatischer Dimmer
Zaehler = 15 'Zähler für Dimmstufe zur Anzeige
Led_ 1 , "D- " 'D- als Info für Dimmerfunktion
For Temp = 239 To 224 Step -1 'Dimmestufe &HEF bis &HE0 durchlaufen
Text = Str(zaehler) : Text = Format(text , "00") 'Formatieren der Zähleranzeige
Led_ 4 , Text 'Dimmer-Zählwert anzeigen
Led_cmd Temp 'Dimmstufe als Kommando senden
Waitms 500
Decr Zaehler
Next Temp
Wait 1
Led_ 1 , "B- 05" 'Blinken 0,5Hz
Led_cmd Blink05
Wait 3
Led_ 1 , "B- 1" 'Blinken 1Hz
Led_cmd Blink1
Wait 3
Led_ 1 , "B- 2" 'Blinken 2Hz
Led_cmd Blink2
Wait 4
Led_cmd Display_on 'Blinken aus, Display ein
Led_ 1 , "00 00"
Waitms 500
Led_cmd Display_off 'Display aus
Wait 1
Led_ 1 , "FF:FF"
Led_cmd Display_on 'Display ein
Wait 1
Led_ 1 , " " 'Anzeige "löschen"
Wait 1
Led_cmd &HEF 'Display/Dimmer volle Helligkeit
Loop
End 'end program
' #############################################################################
Led_init:
Temp = &H21
I2csend 16k33 , Temp , 1
Waitms 1
Temp = &HA0
I2csend 16k33 , Temp , 1
Waitms 1
Temp = &HEF
I2csend 16k33 , Temp , 1
Waitms 1
Temp = &H81
I2csend 16k33 , Temp , 1
Waitms 1
For I = 1 To 11
Segmente(i) = &H00
Next I
I2csend 16k33 , Segmente(1) , 11
Return
' #############################################################################
Sub Led_cmd(byval Command As Byte)
I2csend 16k33 , Command , 1
End Sub
' #############################################################################
Sub Led_(byval Ram_addr As Byte , Byval Anzeige As String * 5)
Text = Anzeige
Z = Len(text)
J = Ram_addr
J = J + J
Segmente(1) = &H00
For I = 1 To Z
Segmente(j) = Lookup(ascii(i) , Tabelle)
Incr J
Incr J
Next I
I2csend 16k33 , Segmente(1) , 11
End Sub
' #############################################################################
Sub Led_bin(byval Addr As Byte , Byval Wert As Byte)
J = Addr
J = J + J
Segmente(j) = Segmente(j) + Wert
I2csend 16k33 , Segmente(1) , 11
End Sub
' #############################################################################
' #############################################################################
Tabelle:
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00
Data &H00 'Space (32)
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H40 '- (45)
Data &H00 'Leer
Data &H00 'Leer
' Ziffern
Data &H3F '0 (48)
Data &H06 '1
Data &H5B '2
Data &H4F '3
Data &H66 '4
Data &H6D '5
Data &H7D '6
Data &H07 '7
Data &H7F '8
Data &H6F '9
' Symbol
Data &H02 ':
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
Data &H00 'Leer
' Buchstaben
Data &H77 'A (65)
Data &H7C 'B
Data &H39 'C
Data &H5E 'D
Data &H79 'E
Data &H71 'F
Viel Spaß damit,
Cassio