Cytat:Temat 4 — TIMERY!LICZNIKI — obsłtwa w trybie przełądania
Cel — poznanie zasad konfigurowania Timerów Liczników (CTC) i umiejętność wykorzystywania podstawowych fuiteji układów łiczników
Zadania: (Opracować i uruchomić)
1. Procedury odmierzania zadanych odcinków czasu: ił 65 ms i i2 65ms z wykorzystaniem liczników TO Tł
2. Procedury generowania (jednocześnie) N asyucłuoniczuycłf i periodyczuych syguałów, każdy o zadanej sekwencji czasów trwania „1” i „O”: TIIIGII(i), TLo(i) ; i 1, 2 N
3. Program pomiaru zadanej wielkości, np. a) czasu trwania impulsu HIGH lub okresu przebiegu periodycznego generowanego przez NE555 (ZD-537) lub b) czasu pomiędzy kolejnymi zwarciami przycisków klawiszy
Tak wygląda temat 4 z laborki.
Zadanie 1 i 2 działa.
Problest jest z zadaniem nr 3.
Zamieszam również archiwum w którym to jest.
Problem jest że obsługa wyśletlacza lcd jest chyba niedopracowana. Co tam zmienić?
$NOMOD51
$INCLUDE(REG517.INC)
$INCLUDE(BibLCD.inc)
CSEG AT 0
START:
; STALE ODPOWIADAJACE KOLEJNYM WIERSZA
WIERSZ1 EQU 07FH
MOV P5,#WIERSZ1
MOV A,P7
MOV R4,A
MOV A,R4 ;A<-R4
MOV R5,#02H ;R5 PRZECHOWYWUJE MASKE, KTORA WYLAPUJE JENDA 'JEDYNKE'
XRL A,#07BH ;FUNKCJA XOR ZERUJE WSZYSTKIE POZYCJE OPROCZ JEDNEJ 'JEDYNKI'
CJNE A,#080H,START
STCZAS:
MOV TMOD,#001H ;ustawienie trubu pracy nr 1 (16 bitowy licznik)
MOV TL0,#017H ;ustaw mlodsza czesc licnika T0 (8 bit)
MOV TH0,#0FCH ;ustaw starsza czesc licnika T0 (8 bit)
SETB TR0 ; startuj licznik
LOP:
JNB TF0,$ ;jesli 1 (przepelnienie T0) przerwij petle, jak zero to skok
CLR TF0 ;zeruj flage przniesienia T0
INC R3 ;
;/////////////////////////////////////////////////////////////
MOV P5,#WIERSZ1
MOV A,P7
MOV R4,A
MOV A,R4 ;A<-R4
MOV R5,#01H ;R5 PRZECHOWYWUJE MASKE, KTORA WYLAPUJE JENDA 'JEDYNKE'
XRL A,#077H ;FUNKCJA XOR ZERUJE WSZYSTKIE POZYCJE OPROCZ JEDNEJ 'JEDYNKI'
CJNE A,#080H,START3
LJMP LOP
;////////////////////////////////////////////////////////////
START3:
CLR TR0 ;zatrzymaj licznik
MOV P1,#055H ;zgaszenie diod
LCALL INITIATE_LCD
LCALL LCDClear
MOV A,R3
LCALL PutChar
MOV A,#'0'
LCALL PutChar
JMP $
ENDDołanczany plik:
lcdcode segment code
rseg lcdcode
;Podprogram czyszczacy LCD, kursor na poczatek
LCDClear:
zajetosc6:
MOV DPTR,#0FF2EH
MOVX A,@DPTR
JB ACC.7,zajetosc6
MOV DPTR,#0FF2CH ;DPTR <- adres wpisu rozkazow dla LCD
MOV A,#01H ;A <- kod rozkazu czysc LCD, kursor ustaw na poczatek
MOVX@DPTR,A ;komorka pamieci, ktorej adres w DPTR <- A
RET ;powrót z podprogramu
;Podprogram przesuwajacy kursor w prawo
MoveRight:
zajetosc4:
MOV DPTR,#0FF2EH
MOVX A,@DPTR
JB ACC.7,zajetosc4
MOV DPTR,#0FF2CH ;DPTR <- adres wpisu rozkazow dla LCD
MOV A,#20H ;A <- kod rozkazu przesun kursor w prawo
MOVX@DPTR,A ;komorka pamieci, ktorej adres w DPTR <- A
RET ;powrót z podprogramu
;Podprogram przesuwajacy kursor w lewo
MoveLeft:
zajetosc34:
MOV DPTR,#0FF2EH
MOVX A,@DPTR
JB ACC.7,zajetosc34
MOV DPTR,#0FF2CH ;DPTR <- adres wpisu rozkazow dla LCD
MOV A,#16H ;A <- kod rozkazu przesun kursor w lewo
MOVX@DPTR,A ;komorka pamieci, ktorej adres w DPTR <- A
RET ;powrót z podprogramu
;Podprogram wyswietlajacy na LCD znak, ktorego kod jest w akumulatorze
PutChar:
zajetosc3:
MOV DPTR,#0FF2EH
MOVX A,@DPTR
JB ACC.7,zajetosc3
MOV DPTR,#0FF2DH ;DPTR <- adres wpisu danych na LCD
MOVX@DPTR,A ;komorka pamieci, ktorej adres w DPTR <- A
RET ;powrót z podprogramu
;/////////////////////////////////////////////////////////
INITIATE_LCD:
MOV DPTR,#0FF2CH ;DPTR <- adres wpisu rozkazow dla LCD
MOV A,#38H ;A <- kod rozkazu resetuj LCD
MOVX@DPTR,A ;komorka pamieci, ktorej adres w DPTR <- A
zajetosc:
MOV DPTR,#0FF2EH
MOVX A,@DPTR
JB ACC.7,zajetosc
MOV DPTR,#0FF2DH ;DPTR <- adres wpisu danych na LCD
MOV A,#2AH ;A <- znak *, ktory bedzie wyswietlony na LCD mozna rowniez tak: MOV A,#'*'
MOVX@DPTR,A ;komorka pamieci, ktorej adres w DPTR <- A
zajetosc2:
MOV DPTR,#0FF2EH
MOVX A,@DPTR
JB ACC.7,zajetosc2
MOV DPTR,#0FF2DH ;DPTR <- adres wpisu danych na LCD
MOV A,#23H ;A <- znak *, ktory bedzie wyswietlony na LCD mozna rowniez tak: MOV A,#'*'
MOVX@DPTR,A ;komorka pamieci, ktorej adres w DPTR <- A
RET ;powrót z podprogramuDzieki i pozdrawiam.