http://www.eelkevisser.nl/szamota-nagy.htm
Ha valaki tudna segíteni, vagy kallódik egy mintakódja és azt bemásolja ide, azt megköszönöm!
Kód: Egész kijelölése
$regfile "m8def.dat"
Declare Sub Createtxt()
Declare Sub Displaytxt() 'text2s auf tid schreiben
Config Pind.7 = Output
Config Sda = Portd.6
Config Scl = Portb.0
Config I2cdelay = 48 '47
Wait 1
'Változók
'Szöveg előállításához
Dim Letters2s(8) As String * 1 , Parity_bit As String * 1
Dim Text2s As String * 8 , Bin2s(8) As String * 8
Dim Hex2s(8) As Byte , Count_parity As Byte
Dim Bitsofletter As String * 8
Dim A As Byte , B As Byte , C As Byte , D As Byte
'Egyéb változók
Dim Szam As Byte
Dim Wtime As Integer
'Üdvözlő üzenet
For A = 1 To 9
Text2s = "WELCOME "
Call Createtxt
Call Displaytxt
Next A
'Főprogram
Do
Incr Szam
If Szam > 5 Then Szam = 0
Text2s = "L/KM " + Str(szam) + ",6"
Call Createtxt
Call Displaytxt
Waitms 300
Loop
'Karakterek generálása
Sub Createtxt()
For A = 1 To 8
Count_parity = 0
Letters2s(a) = Mid(text2s , A , 1)
Hex2s(a) = Asc(letters2s(a))
Bin2s(a) = Bin(hex2s(a))
Bin2s(a) = Right(bin2s(a) , 7)
If Bin2s(a) = "0000000" Then
Bin2s(a) = "0100000"
End If
For B = 1 To 7 'anzahl der highs in wort zählen
Bitsofletter = Mid(bin2s(a) , B , 1)
If Bitsofletter = "1" Then
Incr Count_parity
End If
Next B
If Count_parity = 0 Or Count_parity = 2 Or Count_parity = 4 Or Count_parity = 6 Or Count_parity = 8 Then 'parität ermitteln
Parity_bit = "1"
Else
Parity_bit = "0"
End If
Bin2s(a) = Bin2s(a) + Parity_bit
Hex2s(a) = Binval(bin2s(a))
Next A
End Sub
'Karakterek kiírása i2c buszra
Sub Displaytxt()
Reset Portd.7 'pull mrq low
Waitus 2350 '2350 'mesured 2350
Set Portd.7
Waitus 103 '105 'let it got high again
I2cstart 'start condition
Waitus 65 '65
I2cwbyte &H94
Reset Portd.7
I2cwbyte &H01
I2cwbyte &H01
For C = 1 To 8
I2cwbyte Hex2s(c)
Next C
Set Portd.7
Waitus 250 '250
I2cstop
End Sub
EndKód: Egész kijelölése
;Versja 1.0 pierwsza i ostatnia
;aby uzywac tej biblioteki trzeba na początku wpisać dytektywe
;$lib "ice.lib" 'a pod spodem takie coś
;$external Wait_sda
;$external Czekaj
;$external Takt
;$external I2c_start
;$external Tid_ende
;$external I2c_send
;$external Pisz_tid 'do wyswietlania uzywa się tylko tej procki ale pozostale są potrzebne do działania tej
;Miłej zabawy: Darek R. s_ice 5.12.2004
;wykorzystywane porty
;Scl Alias P1.0
;Sda Alias P1.1
;Mrq Alias P1.2
;procedura opuzniająca parametry podaje się w R0 i R1 (czas opuznienia)
;wywolanie
;mov r0,#255 : mov r1,#255 : lcall czekaj
[CZEKAJ]
Czekaj:
Loop0:
push r0
Loop1:
djnz r0,loop1
pop r0
djnz r1,loop0
ret
[END]
;PROCKI DO OBSLUGI LCD NA I2C OPLA ASTRY UWAGA SCL,SDA,MRQ SĄ PISANE NA STALE JEŚLI SIĘ COŚ ZMIENI TO W PROCEDURACH TERZ TRZEBA POZMIENIAĆ
;SCL=P1.0
;SDA=P1.1
;MRQ=P1.2
[WAIT_SDA]
Wait_sda:
clr P1.2 ;mrq ustaw na 0
;opuznij o 910us
mov r0,#223 ;JAKBY NIE DZIALALO TO PRUBUJ Z #230
mov r1,#2
lcall Czekaj
setb P1.2 ;mrq ustaw na 1
;opuznij o 910us
mov r0,#223
mov r1,#2
lcall Czekaj
mov r0,#223 ;opuznij o 910us jak bedzie wiecej to chyba nie zaszkodzi a może polepszyc
mov r1,#2
lcall Czekaj
ret
[END]
[TAKT]
takt:
;jak czasy za krotkie to nic nie widac
mov r0,#195 ;202us 95
mov r1,#1
lcall czekaj
setb P1.0 ;scl=1
mov r0,#145 ;102us 45
mov r1,#1
lcall czekaj
clr P1.0 ;scl=0
mov r0,#11 ;34us 11
mov r1,#1
lcall czekaj
ret
[END]
[I2C_START]
I2c_start:
;startuje ze stanów wysokich i potem i2c start
;to moze byc zbedne
;P1 = 7 od razu ustawia te bity 00000111b
;ustaw 0 na SDA gdy na scl jest 1 (warunek startu)
clr P1.1
mov r0,#90 ;192us
mov r1,#1
lcall czekaj
clr P1.0 ;SCL=0
mov r0,#90 ;192us
mov r1,#1
lcall czekaj
ret
[END]
[TID_ENDE]
Tid_ende:
;opuznij o 71us
mov r0,#90 ;72us
mov r1,#1
lcall czekaj
setb P1.2 ;mrq=1
mov r0,#60 ;132us
mov r1,#1
lcall czekaj
setb P1.0 ;scl=1
mov r0,#55 ;122us
mov r1,#1
lcall czekaj
setb P1.1 ;sda=1
ret
[END]
[I2C_SEND]
;R2 JEST PARAMETREM PROCEDURY I ZAWIERA ZNAK DO WYSLANIA
I2c_send:
;mov r2,{znak}'wywolanie
clr c ;zeruj carry flag
mov acc,r2 ;{znak} ;zapisz liczbe do obrubki
rlc acc ;przesun w lewo o jeden bit
MOV C,{psw.0} ;ustaw carry flag tak jak bit parzystosci
jc dalej1 ;jesli carry jest = 1 znaczy że liczba jest nieparzysta wiec nic nie rob z ta liczba Wyswietlacz opla ma kontrole parzystosci nieparzystą
setb acc.0 ;ustawia bit aby byla nieparzysta liczba jedynek
Dalej1:
;acc zawiera daną do wyslania
;mov {znak},acc ;przepisz z acc do znak
mov b,#8 ;powtóż 8 razy wysylanie bitu
Petla:
push acc ;zapisz acc
push b ;zapisz b
;przesuwanie bitow w celu wyodrebnienia jednego do wyslania
djnz b,shifting
sjmp noshifting
Shifting:
rrc a
djnz b,shifting
Noshifting:
anl a,#00000001b
;wysylanie bitu
jnz setsda
clr P1.1 ;Sda=0
sjmp opusc_ustawianie
Setsda:
setb P1.1 ;Sda=1
Opusc_ustawianie:
;$end Asm : Decr B : Sda = Znak.b : Incr B : $asm 'ustaw bit na sda dlatego jest decr b bo petla w asm wylacza sie jak b=0 i ten bit opuszczal, wiec petla zlicza od osmiu ,ale numeracja bitów jest od 7 do 0 , i po to to jest [ZASTĄPIONE ASEMBLEREM PATRZ WYŻEJ TAM GDZIE WYSYLANIE 8BITÓW]
pop b
pop acc
push b
lcall takt
pop b
djnz b,petla
clr P1.1 ;SDA=0 ack po wyslanym bajcie Sda i Mrq muszą byc na 0 inaczej nie bedzie dzialac
lcall takt
;opuznij o 42us AMENDE
mov r0,#15 ;52us
mov r1,#1
lcall czekaj
ret
[END]
[PISZ_TID]
;R0 jest parametrem wywolanie [mov r0,#{tekst}] - adres do zmiennej tekst potem lcall pisz
; Zmienna Tekst To Dim Tekst As String * 8
Pisz_TID:
orl P1,#&B00000111 ;wszystkie linie na stan wysoki SCL,SDA i MRQ
push r0 ;zapisz R0 z adresem do ciagu znakow
lCall Wait_sda
lCall I2c_start
mov r2,#74
lCall I2c_send ;(74) w siedmiobitowym wychodzi 0x94 Adres wyswietlacza
clr p1.2 ;Mrq = 0 tu na stale bylo zerowane SCL,MRQ i SDA Mrq jest ustawione na 1 tylko podczas wysylania adresu do LCD
mov r0,#7 ;26us
mov r1,#1
lcall czekaj
mov r2,#0 ;ikonki1
lCall I2c_send
mov r2,#0 ;ikonki2
lCall I2c_send
; - - - - - - - - - - - - - - - - - - - - - - - - - -
pop R0 ;odtwóż adres zmiennej
mov R1,#0 ;flaga jesli 0 to wyzylaj znaki ciagu, jesli 1 to znak pusty (127)
mov b,#8
Wysylaj:
mov a,@r0 ;czytaj znak z ciągu
push b ;trzeba zapisac bo i2csend zmienia B
push r0 ;trzeba zapisac bo procka czekaj uzywa r0 i r1 jak by zmienic na r3 i r4 to nie trzeba bedzie zapisywac i kod mniej zajmie
jz ustaw_flage ;jesli (acc)znak=0 reszta ciągu ma mieć 127(pusty znak) skocz i ustaw flage
sjmp dalej3 ;jesli nie to nie rob nic i skocz dalej
Ustaw_flage:
mov r1,#1
Dalej3:
cjne r1,#0,pusty_znak ;jesli r1<>0 to pisz pusty znak
mov r2,a ;znak ciągu
sjmp dalej4
Pusty_znak:
mov r2,#127 ;pusty znak ,jak spacja, po to żeby śmieci nie zostawaly jak ciąg jest krótszy
Dalej4:
push r1 ;zapisz flage
lcall I2c_send
pop r1 ;przywroc flage
pop r0
pop b
inc r0
djnz b,wysylaj
lcall Tid_ende
orl P1,#&B00000111 ;wszystkie linie na stan wysoki SCL,SDA i MRQ
ret
[END]Köszi csak az a baj hogy nem értek a Bascom hoz, ha arduinóval tudnám megoldani az lenne a jó.broland írta:hello
találtam egy ilyet: http://www.mikrocontroller.net/attachme ... el_tid.zip
Bascom + egyebek a zippben.
üDv Roland