Mam Taki zegarek na LCD oparty o Timer1:
$regfile = "m16def.dat"
$crystal = 16000000
Config Portb = Output
Config Lcdbus = 4
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pb.2 , Db5 = Pb.3 , Db6 = Pb.4 , Db7 = Pb.5 , E = Pb.1 , Rs = Pb.0
Cursor Off
Cls
Config Timer1 = Timer , Prescale = 256
Declare Sub Wysw_czas
On Timer1 Odmierz_1s
Dim S As Byte : Dim M As Byte : Dim G As Byte
Dim Nowa_w As Bit
Dim Wart_bcd As Byte
'Dim X As Byte
'Dim Wart As Byte
S1 Alias Pind.6
S2 Alias Pind.7
Enable Interrupts
Enable Timer1
Counter1 = 3036
Set Nowa_w
Set Portd.6
Set Portd.7
Do
Call Wysw_czas
If S1 = 0 Then
Waitms 25
If S1 = 0 Then
Incr M
S = 0
If M = 60 Then
M = 0
End If
Set Nowa_w
Call Wysw_czas
Waitms 200
End If
End If
If S2 = 0 Then
Waitms 25
If S2 = 0 Then
Incr G
If G = 24 Then
G = 0
End If
Set Nowa_w
Call Wysw_czas
Waitms 200
End If
End If
Loop
End
Sub Wysw_czas
If Nowa_w = 1 Then
Wart_bcd = Makebcd(g)
Locate 1 , 1
Lcd Bcd(wart_bcd) ; ":"
Wart_bcd = Makebcd(m)
Locate 1 , 4
Lcd Bcd(wart_bcd) ; ":"
'end program
Wart_bcd = Makebcd(s)
Locate 1 , 7
Lcd Bcd(wart_bcd) ;
Reset Nowa_w
End If
End Sub
Odmierz_1s:
Counter1 = Counter1 + 3036
Incr S
Set Nowa_w
If S = 60 Then
S = 0
Incr M
If M = 60 Then
M = 0
Incr G
If G = 24 Then
G = 0
End If
End If
End If
Return
Oraz program sterujący wyświetlaczami
$regfile = "m16def.dat"
$crystal = 16000000
Config Portc = Output
Config Pina.1 = Output
Config Pina.2 = Output
Config Pina.3 = Output
Config Pina.4 = Output
Config Timer0 = Timer , Prescale = 256
Declare Sub Pobr_znaku(cyfra As Byte)
On Timer0 Mult_wysw
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
'Dim X As Byte
'Dim Wart As Byte
Dim Nr_wysw As Byte
W1 Alias Porta.4
W2 Alias Porta.3
W3 Alias Porta.2
W4 Alias Porta.1
Enable Interrupts
Enable Timer0
Load Timer0 , 125
A = 1
B = 9
C = 8
D = 3
Do
Loop
End
Sub Pobr_znaku(cyfra As Byte)
Portc = Lookup(cyfra , Kody7seg)
End Sub
Mult_wysw:
Load Timer0 , 150
Set W1
Set W2
Set W3
Set W4
Select Case Nr_wysw
Case 0:
Call Pobr_znaku(a)
Reset W1
Case 1:
Call Pobr_znaku(b)
Reset W2
Case 2:
Call Pobr_znaku(c)
Reset W3
Case 3:
Call Pobr_znaku(d)
Reset W4
End Select
Incr Nr_wysw
If Nr_wysw = 4 Then
Nr_wysw = 0
End If
Return
Kody7seg:
Data &B00000011 , &B10011111 , &B00100101 , &B00001101 , &B10011001 ,
Data &B01001001 , &B01000001 , &B00011111 , &B00000001 , &B00001001 ,
Są to dwa oddzielne programy teraz jak te dwa programy zmieszać razem i zrobić z tego jeden.
Trzeba jeszcze zmodyfikować program zegarka tak aby podstawiał odpowiednie liczby pod zmienne A,B,C,D.
W programie do obsługi wys led zmienne A,B,C,D są teraz stałe tymczasowo.
Dodano po 1 [godziny] 17 [minuty]: Udało mi się prubowałem zrobić tak żeby jednocześnie wyświetlał na LCD i na LED o tyle o ile na LED już działa o co mi chodziło to o tyle na LCD po zmieszaniu tych obu programów jest jeden błąd.
Mianowicie na LCD wyświetla jest godzina np. 05:10:45 po czym wskakuje na 2 sek. 00:00:00
i nastepnie pokazuje 05:10:48 czym jest spowodowany ten błąd i jak go naprawić?
$regfile = "m16def.dat"
$crystal = 16000000
Config Portb = Output
Config Lcdbus = 4
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pb.2 , Db5 = Pb.3 , Db6 = Pb.4 , Db7 = Pb.5 , E = Pb.1 , Rs = Pb.0
Cursor Off
Cls
Config Portc = Output
Config Pina.1 = Output
Config Pina.2 = Output
Config Pina.3 = Output
Config Pina.4 = Output
Config Timer0 = Timer , Prescale = 256
Declare Sub Pobr_znaku(cyfra As Byte)
Config Timer1 = Timer , Prescale = 256
Declare Sub Wysw_czas
On Timer0 Mult_wysw
On Timer1 Odmierz_1s
Dim S As Byte : Dim M As Byte : Dim G As Byte
Dim Nowa_w As Bit
Dim Wart_bcd As Byte
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
'Dim X As Byte
'Dim Wart As Byte
Dim Nr_wysw As Byte
W1 Alias Porta.4
W2 Alias Porta.3
W3 Alias Porta.2
W4 Alias Porta.1
S1 Alias Pind.6
S2 Alias Pind.7
Enable Interrupts
Enable Timer0
Load Timer0 , 125
Enable Timer1
Counter1 = 3036
Set Nowa_w
Set Portd.6
Set Portd.7
Do
Call Wysw_czas
If S1 = 0 Then
Waitms 25
If S1 = 0 Then
Incr M
S = 0
If M = 60 Then
M = 0
End If
Set Nowa_w
Call Wysw_czas
Waitms 200
End If
End If
If S2 = 0 Then
Waitms 25
If S2 = 0 Then
Incr G
If G = 24 Then
G = 0
End If
Set Nowa_w
Call Wysw_czas
Waitms 200
End If
End If
A = G / 10
B = G Mod 10
C = M / 10
D = M Mod 10
Loop
End
Sub Wysw_czas
If Nowa_w = 1 Then
Wart_bcd = Makebcd(g)
Locate 1 , 1
Lcd Bcd(wart_bcd) ; ":"
Wart_bcd = Makebcd(m)
Locate 1 , 4
Lcd Bcd(wart_bcd) ; ":"
'end program
Wart_bcd = Makebcd(s)
Locate 1 , 7
Lcd Bcd(wart_bcd) ;
Reset Nowa_w
End If
End Sub
Odmierz_1s:
Counter1 = Counter1 + 3036
Incr S
Set Nowa_w
If S = 60 Then
S = 0
Incr M
If M = 60 Then
M = 0
Incr G
If G = 24 Then
G = 0
End If
End If
End If
Return
Sub Pobr_znaku(cyfra As Byte)
Portc = Lookup(cyfra , Kody7seg)
End Sub
Mult_wysw:
Load Timer0 , 150
Set W1
Set W2
Set W3
Set W4
Select Case Nr_wysw
Case 0:
Call Pobr_znaku(a)
Reset W1
Case 1:
Call Pobr_znaku(b)
Reset W2
Case 2:
Call Pobr_znaku(c)
Reset W3
Case 3:
Call Pobr_znaku(d)
Reset W4
End Select
Incr Nr_wysw
If Nr_wysw = 4 Then
Nr_wysw = 0
End If
Return
Kody7seg:
Data &B00000011 , &B10011111 , &B00100101 , &B00001101 , &B10011001 ,
Data &B01001001 , &B01000001 , &B00011111 , &B00000001 , &B00001001 ,
Za pomoc z góry dzięki