c-control LED-Display
Postat: 15 november 2009, 12:36:11
Hej!
jag har lyckats få alla segment att lysa på min led display utom punkten! kan någon hjälpa mig?
program:
tyvärr är instruktionerna på tyska!
Jag håller alltså på och försöker få fram värdet från temperaturmodulen till en LED-disp.
värden utan decimaler är inga problem! men nnär dom "halva" graderna ska in kör jag fast!
lite delar ur koden:
Kod:
det hela programeras i WORKBENCH++ (basic) och körs på conrads C-Control II
led disp driver:http://www.nxp.com/acrobat_download/dat ... _CNV_2.pdf
temp modul och display:http://www2.produktinfo.conrad.com/date ... _Modul.pdf
_________________
//Wiktor Ahlander wiktorsbyggen.se "Det omöjliga gör vi medan du väntar... MIRAKEL tar något längre tid"
Lade till code-taggar. /strombom
jag har lyckats få alla segment att lysa på min led display utom punkten! kan någon hjälpa mig?
program:
tyvärr är instruktionerna på tyska!
Kod: Markera allt
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'II BASIC++ DEMO ZUM BASIC-COMPUTER UNIT M 1.2/2.0 (by DIE HARD) II
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'--------------------------------------------------------------------
' Beispiel zum BASIC-COMPUTER mit dem Programmer/Application-Board
'--------------------------------------------------------------------
' ANWENDUNG: IIC-BUS COMMUNICATIONS MODULE
' 4 DIGIT LED-DISPLAY 198344 (TREIBER SAA1064)
'--------------------------------------------------------------------
' Dieses Beispiel zeigt die Vorgehensweise für die Benutzung des
' IIC-BUS OBJECTS im OS. Einer der vielen erhältlichen Bausteine mit IIC-Bus
' Interface ist der 4 DIGIT LED DISPLAY TREIBER SAA1064. Er ist der Baustein
' der die 4 DIGIT 7 SEGMENTANZEIGE der LED-Anzeige ansteuert.
' Er hat ein verhältnismässig einfaches Protokoll das mit der IIC-Bus
' Unterstützung des Betriebsystems recht einfach in die Treibersoftware
' für diesn Baustein umgesetzt werden kann.
'
' <START><ADDRESS><INSTRUCTION><CONTROL><DIGIT1><DIGIT2><DIGIT3>DIGIT<4><STOP>
'
' Die Adresse besteht aus einem festen, nicht veränderbaren Anteil und
' einem vom Benutzer wählbaren Teil (zwei Bits). Das letzte Bit
' legt fest ob eine READ (Eingabe) oder WRITE (Ausgabe) über den SAA1064
' erfolgt
' In diesem Beispiel hat der SAA1064 die Adresse 3 (alle Bits auf HI),
' alle Jumper abgezogen.
' Allerdings ist beim diesem Baustein die interne Adressdecodierung
' etwas anders als üblich. Das Modul hat deshalb 4 Jumper die dem
' Modul die Adresse 0 bis 3 zuweisen.
' Es darf jeweils nur ein Jumper gesteckt sein.
' J1 A0=0, A1=0
' J2 A0=1, A1=0
' J3 A0=0, A1=1
' J4 A0=1, A1=1
' Damit ergibt sich für eine READ-Operation folgender Wert:
'
' 0 1 1 1 0 x x 1 READ-Operation
' I------I-----I-I
' FIX ADR ADR R/W
'
' Für eine WRITE-Operation ist das letzte Bit LO und es ergibt sich
' folgender Wert:
'
' 0 1 1 1 0 x x 0 WRITE-Operation
' I------I-----I-I
' FIX ADR ADR R/W
'
' x sind die mit Jumper auf 0 setzbaren Adressbits.
' In diesem Beispiel wird angenommen, dass kein Jumper gesteckt ist. Die
' Adresse ist damit 118= $76 = 01110110
' Das INSTRUCTION-BYTE legt fest mit welches der internen Register
' zuerst beschriebnen wird. In unserem Beispiel ist das INSTRUCTION BYTE
' Null, das bedeutet dass nach dem INSTRUCTION BYTE das KONTROLLREGISTER
' und danach die DATENREGISTER der vier Digits beschrieben werden.
' Das KONTROLLREGISTER legt den LED Modus (hier Multiplex)und die LED
' Helligkeit fest.
'
' Die Zuweisung der Segmente zum jeweiligen Bit sind so:
' a
' f b xgfedcba (a=bit0)
' g
' e c
' d
'
' Eine 1 wird durch die Segmente bc dargestellt und die entsprechenden Bits sind
' log 1, die anderen 0 -> 00000110 =&H06
'
' Um Ihnen die Arbeit mit dem Treiber zu vereinfachen
' brauchen Sie sich aber um diese Angelegenheiten nicht zu kümmern,
' da enstprechende Unterprogramme im Treiber vorhanden sind.
'-----------------------------------------------------------------------
' SCHNITTSTELLE ZUM TREIBER
' Ihre Schnittstelle zum LED Treiber ist die Variable BRIGHTNES der Sie
' die vordefinierten Werte BRIGHT0 bis BRIGHT7 zuweisen könnnen
' und die Variablen DIGIT1 bis DIGIT4, die alle zusammen an die
' FUNCTION SENDBUF übergeben werden. Diese FUNCTION sendet den
' Buffer zum LCD.
'
' DECODE und SPLIT_DIGITS
' SPLIT_DIGITS spaltet einen Zahl in Ihre einzelnen Stellen auf
' ( also nach Zehner, Hunderter usw..)
' Bevor diese Stellen dann an das Display übertragen werden, müssen
' sie in den 7-Segment Code umgewandelt werden.
' Dies übernimmt die FUNCTION DECODE
'
'-----------------------------------------------------------------------
'Der IIC-Bus liegt an PORT 9 (SDA) und PORT 10 (SCL)
'---------------------------------------------------------------------
' Die Zeit zur Anzeige eines Zählerstandes, wie hier im Beispiel benötigt
' etwa 5ms.
'------------------------------------------------------------------------
' BEISPIEL
' Das Beispiel zeigt einen laufenden Zähler bis 9999 und rdy nach Ablauf
' des Programms
'----------------------------------------------------------------------
' ACHTUNG:
' Achten Sie unbedingt darauf, dass das LCD initialisiert ist, wenn es
' angesteckt ist (auch wenn sie es nicht benutzen).
' Es teilt sich einen Teil seines Busses mit dem IIC-BUS
' print"#ON_LCD#";
' print"#INIT#";
' print"#OFF#";
'----------------------------------------------------------------------
' ACHTUNG:
' Das LED-Display benötigt bei max. Helligkeit sehr viel Strom
' Die Kühlung des Spannungsreglers auf dem Application-Board ist
' dafür nicht ausreichend. Betreiben Sie das Display mit BRIGHT2,
' wenn keine zusätzliche Kühlung für den Spannungsregler auf dem
' Application-Board vorgesehen ist.
'-----------------------------------------------------------------------
'--------------------------
'------ I/O PORTS ---------
'--------------------------
define LIGHT port[16]
'--------------------------
'---- SYSTEM MEMORY -------
'--------------------------
define TAUSENDER as byte
define HUNDERTER as byte
define ZEHNER as byte
define EINER as byte
'-------------------------
'-------------------------
'----- LED HELLIGKEIT -----
const BRIGHT0 =07h
const BRIGHT1 =17h
const BRIGHT2 =27h
const BRIGHT3 =37h
const BRIGHT4 =47h
const BRIGHT5 =57h
const BRIGHT6 =67h
const BRIGHT7 =77h
'-------------------------
const PUN=86
const MINUS=40h
const A=77h
const B=7Fh
const C=39h
const d=5Eh
const E=79h
const F=71h
const G=7Dh
const H=76h
const I=06h
const J=0Fh
const L=38h
const n=54h
const x=5Ch
const P=73h
const r=50h
const S=6Dh
const t=78h
const U=3Eh
const y=6Eh
'-----------------------------------------------------
' 7 SEGMENT DECODER
'-----------------------------------------------------
FUNCTION DECODE (CODE as byte)
SELECT CASE CODE
CASE 0
CODE=3Fh
CASE 1
CODE=06h
CASE 2
CODE=5Bh
CASE 3
CODE=4Fh
CASE 4
CODE=66h
CASE 5
CODE=6Dh
CASE 6
CODE=7Dh
CASE 7
CODE=07h
CASE 8
CODE=7Fh
CASE 9
CODE=6Fh
END SELECT
RETURN CODE
END FUNCTION
'------------------------------------------------------
'-----------------------------------------------------
'-- IIC SEND BUFFER TO SAA1064 ----
'-----------------------------------------------------
FUNCTION SENDBUF(BRIGHT as byte,DIGIT1 as byte,DIGIT2 as byte,DIGIT3 as byte,DIGIT4 as byte)
IIC.INIT
IIC.START
IIC.SEND 118 'WRITE ADDRESS
IIC.SEND 0
IIC.SEND BRIGHT
IIC.SEND DIGIT1
IIC.SEND DIGIT2
IIC.SEND DIGIT3
IIC.SEND DIGIT4
IIC.STOP
IIC.OFF
END FUNCTION
'----------------------------------------------------
' SPLIT VALUE INTO DIGITS
'----------------------------------------------------
FUNCTION SPLIT_DIGITS(VALUE as word)
TAUSENDER=VALUE/1000
HUNDERTER=(VALUE-(TAUSENDER*1000))/100
ZEHNER=(VALUE-(TAUSENDER*1000)-(HUNDERTER*100))/10
EINER=VALUE-TAUSENDER*1000-HUNDERTER*100-ZEHNER*10
END FUNCTION
'----------------------------------------------------
'---------------------------------------------------------
FUNCTION SHOW_BLANK()
SENDBUF(BRIGHT1,0,0,0,0)
END FUNCTION
'--------------------------------------------------------
FUNCTION SHOW_IDLE()
SENDBUF(BRIGHT1,E,L,d,I)
END FUNCTION
'--------------------------------------------------------
FUNCTION SHOW_IN()
SENDBUF(BRIGHT1,0,0,n,I)
END FUNCTION
'--------------------------------------------------------
FUNCTION SHOW_OUT()
SENDBUF (BRIGHT1,0,t,U,x)'------------o
END FUNCTION
'--------------------------------------------------------
FUNCTION SHOW_CLEAR()
SENDBUF(BRIGHT1,0,r,L,C)
END FUNCTION
'--------------------------------------------------------
FUNCTION SHOW_READY()
SENDBUF(BRIGHT1,0,y,D,r)
END FUNCTION
'--------------------------------------------------------
FUNCTION SHOW_ERROR()
SENDBUF(BRIGHT1,0,r,r,E)
END FUNCTION
'-------------------------------------------------------
FUNCTION SHOW_ON()
SENDBUF(BRIGHT1,0,0,n,x)
END FUNCTION
'-------------------------------------------------------
FUNCTION SHOW_OFF()
SENDBUF(BRIGHT1,0,F,F,x)
END FUNCTION
'-------------------------------------------------------
FUNCTION SHOW_TEST()
SENDBUF(BRIGHT1,255,255,255,255)
END FUNCTION
'-------------------------------------------------------
FUNCTION SHOW_LOL()
SENDBUF(BRIGHT1,0,MINUS,PUN,6)
END FUNCTION
'-------------------------------------------------------
värden utan decimaler är inga problem! men nnär dom "halva" graderna ska in kör jag fast!
lite delar ur koden:
Kod:
Kod: Markera allt
'-----------------------------------------------------
'-- IIC SEND BUFFER TO SAA1064 ----
'-----------------------------------------------------
FUNCTION SENDBUF(BRIGHT as byte,DIGIT1 as byte,DIGIT2 as byte,DIGIT3 as byte,DIGIT4 as byte)
IIC.INIT
IIC.START
IIC.SEND 118 'WRITE ADDRESS
IIC.SEND 0
IIC.SEND BRIGHT
IIC.SEND DIGIT1
IIC.SEND DIGIT2
IIC.SEND DIGIT3
IIC.SEND DIGIT4
IIC.STOP
IIC.OFF
END FUNCTION
'----------------------------------------------------
' SPLIT VALUE INTO DIGITS
'----------------------------------------------------
FUNCTION SPLIT_DIGITS(VALUE as word)
TAUSENDER=VALUE/1000
HUNDERTER=(VALUE-(TAUSENDER*1000))/100
ZEHNER=(VALUE-(TAUSENDER*1000)-(HUNDERTER*100))/10
EINER=VALUE-TAUSENDER*1000-HUNDERTER*100-ZEHNER*10
END FUNCTION
i "split value into digits" måste man ju kunn ta bort "tausender" och "hunderter" och istället lägga till decimalerna efter "einer" på något sätt...
här är koden som läser temp och sedan skickar till LED-Disp.
Kod:
define TEMP as word
DS1631RESET(DS1631)
DS1631SET_STATUS(DS1631,1)
'-------------------------------------------------------------
'----- LOOP READING TEMPERATURE ---
'-------------------------------------------------------------
#LOOP
pause 5
DS1631CONVERT(DS1631)
DS1631WAIT_READY(DS1631)
TEMP=DS1631GET_TEMP(DS1631)
TEMP=TEMP SHR 7
if (TEMP and 0100h) = 0100h then TEMP=(TEMP or FE00h)
SPLIT_DIGITS(temp/2)
SENDBUF(BRIGHT1,DECODE(EINER),DECODE(ZEHNER),0,0)
lcd.init switchonly
lcd.clear
LCD.PRINT "TEMP: " & TEMP/2 & "." & (TEMP and 1)*5 & " C "
LCD.OFF
goto LOOP
led disp driver:http://www.nxp.com/acrobat_download/dat ... _CNV_2.pdf
temp modul och display:http://www2.produktinfo.conrad.com/date ... _Modul.pdf
_________________
//Wiktor Ahlander wiktorsbyggen.se "Det omöjliga gör vi medan du väntar... MIRAKEL tar något längre tid"
Lade till code-taggar. /strombom