problem mój polega na nieprawidłowym wyswietlaniu cyfr . o ile w zakresie 0-99 wszystko jest ok., to powyżej 100 ma same zera :
wyswietlacz ma 3 cyfry led-7-segmentowe i w założeniach ma liczyć czas od 0 do 999 sek
pełny kod:
problem tkwi w tym podprogramie :
proszę o jakieś sugestie ....
wyswietlacz ma 3 cyfry led-7-segmentowe i w założeniach ma liczyć czas od 0 do 999 sek
pełny kod:
'$sim
$regfile = "m8def.dat" 'informuje kompilator o pliku
$crystal = 8000000 'informuje kompilator o
Config Portd = Output 'port D jako wyjściowy
Config Pinc.5 = Output 'linia PB1 jako wyjściowa
Config Pinc.4 = Output 'linia PB2 jako wyjściowa
Config Pinc.3 = Output 'linia PB3 jako wyjściowa
Config Pinc.2 = Output 'linia led jako wyjściowa
Config Pinb.0 = Output 'linia pu jako wyjściowa
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Timer0 = Timer , Prescale = 256 'konfiguracja Timer0 jako
Declare Sub Pobr_znaku(cyfra As Byte) 'deklaracja procedury
On Timer0 Mult_wysw 'przerwanie od przepełnienia
Dim A As Byte , B As Byte , C As Byte , Z As Byte 'definicje zmiennych A, B, C,
Dim Nr_wysw As Byte 'zmienna określająca numer
Dim D As Byte
Dim E As Byte
Config Timer1 = Timer , Prescale = 256
On Timer1 Odmierz_1s 'przerwanie od przepełnienia
Dim Sekundy As Integer
Dim U As Integer
Dim Dana As Integer
W1 Alias Portc.3 'przypisanie linii PB0 nazwy W1
W2 Alias Portc.4 'przypisanie linii PB1 nazwy W2
W3 Alias Portc.5 'przypisanie linii PB2 nazwy W3
Pu Alias Pinb.0 'wyjscie na Pu
Plus Alias Pinb.1 'dodaj warosc
Minus Alias Pinb.2 'odejmnij wartosc
Go Alias Pinb.3 'przycisk startu
Leda Alias Pinc.2 'sygnalizacja
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
Portc.2 = 1 'zgas led
Portb.0 = 1 'wylacz pu
Portd = &B11111111 'wygas wyswietlacz
Waitms 1
Enable Interrupts 'odblokowanie globalnego
Enable Timer0 'odblokowanie przerwania od
Load Timer0 , 125 '125 'załadowanie do licznika
'wartości początkowej 131, bo
'256 - 125 = 131
Enable Timer1
Counter1 = 34286
Stop Timer1
Start Timer0
'A = 3
'B = 2
'C = 1
'123 sposób wyświetlania
A = 0
B = 0
C = 0
U = 0
Dana = 95
D = 5 'czekaj
E = 25 'czekaj2
'A = 0
'B = 0
'C = 0
Sekundy = 0
Do 'początek nieskończonej pętli
'Portc.2 = 1 'zgas led
If Plus = 0 And Minus = 1 Then
Gosub Czekaj2
If Plus = 0 And Minus = 1 Then
Gosub Czekaj
Incr U
Incr Dana
If Dana > 999 Then Dana = 999
Gosub Czekaj
Gosub Wyswietl
Bitwait Plus , Set
End If : End If
If Minus = 0 And Plus = 1 Then
Gosub Czekaj2
If Minus = 0 And Plus = 1 Then
Gosub Czekaj
Decr U
Decr Dana
if dana<0 then dana=0
Gosub Czekaj
Gosub Wyswietl
Bitwait Minus , Set
End If : End If
If Go = 0 Then
Gosub Czekaj2
If Go = 0 Then
Bitwait Go , Set
Gosub Start_stop
End If : End If
Loop 'koniec pętli nieskończonej
End
'==========
'tu mi cos nie działa
Wyswietl:
Dana = Dana Mod 100
C = Dana / 100
'Dana = Dana Mod 10
'B = Dana Mod 10
B = Dana / 10
A = Dana Mod 10
Return
Start_stop:
Enable Timer1
Counter1 = 34286
Start Timer1
Portc.2 = 0 'zapal led
Portb.0 = 0 'wyl pu
Return
'koniec programu
Czekaj:
Waitms D
Return
Czekaj2:
Waitms E
Return
Sub Pobr_znaku(cyfra As Byte) 'definicja procedury
'Pobr_znaku
If Cyfra < 10 Then 'jeżeli wartość otrzymanej do
'wyświetlenia cyfry < od 10,
Portd = Lookup(cyfra , Kody7seg ) 'to wpisanie do portu D
'wartość kodu z tablicy
'stałych Kody7seg
Else 'w przeciwnym razie
Portd = 0 'wpisanie do portu D wartości
'0 która wygasza wyświetlacz
End If 'koniec warunku If...Then
End Sub 'koniec procedury
Mult_wysw: 'podprogramu obsługi
'przerwania od przepełnienia
'Timer0 w którym odbywa się
'multipleksowanie
Load Timer0 , 125 'załadowanie do licznika
'wartości początkowej
Set W1 'wygaszenie wyświetlacza 1
Set W2 'wygaszenie wyświetlacza 2
Set W3 'wygaszenie wyświetlacza 3
Select Case Nr_wysw 'w zależności od wartości
'Nr_wysw, wykonaj:
Case 0: 'gdy Nr_wysw = 0, to
Call Pobr_znaku(a) 'wywołanie procedury
'pobierającej z tablicy kod
'znaku dla wartości A
Reset W1 'włączenie wyświetlacza 1
Case 1: 'gdy Nr_wysw = 1, to
Call Pobr_znaku(b) 'wywołanie procedury
'pobierającej z tablicy kod
'znaku dla wartości B
Reset W2 'włączenie wyświetlacza 2
Case 2: 'gdy Nr_wysw = 2, to
Call Pobr_znaku(c) 'wywołanie procedury
'pobierającej z tablicy kod
'znaku dla wartości C
'
Reset W3 'włączenie wyświetlacza 3
End Select 'koniec instrukcji wyboru
Incr Nr_wysw 'zwiększenie o jeden wartości
'Nr_wysw
If Nr_wysw = 3 Then 'jeśli wartość Nr_wysw
'osiągnie 3, to
Nr_wysw = 0 'zeruj wartość Nr_wysw
End If
Return 'powrót z podprogramu
'przerwania
Odmierz_1s: 'podprogramu obsługi przerwania
'przepełnienia od Timer1
Counter1 = Counter1 + 34286 'wpisanie wartości początkowej
'licznika
Incr Sekundy 'zwiększenie o 1 wartości
'Sekundy
If Sekundy = U Then
Portb.0 = 1
Portc.2 = 1 'zgasled
Stop Timer1
Disable Timer1
End If
Return
Kody7seg: 'tablica stałych Kody7seg
'przechowująca kody
'wyświetlanych cyfr
'Kody cyfr
Data &B10000010 , &B10111011 , &B10000101 , &B10010001 , &B10111000
Data &B11010000 , &B11000000 , &B10011011 , &B10000000 , &B10010000
problem tkwi w tym podprogramie :
'==========
'tu mi cos nie działa
Wyswietl:
Dana = Dana Mod 100
C = Dana / 100
'Dana = Dana Mod 10
'B = Dana Mod 10
B = Dana / 10
A = Dana Mod 10
Return
proszę o jakieś sugestie ....
