Otóż, mam licznik w assemblerze na LCD, kodzik poniżej, mam pytanie, jak zrobić by licznik przyspieszał i zwalniał po naciśnięciu przycisku?
Symulator edsim51, myślałem o zmienianiu w czasie rzeczywistym update frequency, tylko jak to zmienić? W assemblerze? Niestety nie mogę sobie klikać na update frequency pokazując program wykładowcy :)
Proszę o szybką pomoc, przeszukałem angielskie fora i nigdzie nie mam rozwiązania co do update frequency :)
MOV 30H, #' '
MOV 31H, #' '
MOV 32H, #' '
MOV 33H, #' '
MOV 34H, #' '
MOV 35H, #' '
MOV 36H, #' '
MOV 37H, #' '
MOV 38H, #' '
MOV 39H, #' '
MOV 3AH, #'0'
MOV 3BH, #'0'
MOV 3CH, #'0'
MOV 3DH, #'0'
MOV 3EH, #'0'
MOV 3FH, #'0'
CLR 40H ;znak konca linii dla algorytmu pozniej
MOV R2, #10
MOV R3, #10
MOV R4, #10
MOV R5, #10
MOV R6, #10
MOV R7, #10
; inicjalizacja LCD - zrodlo: przyklady z edsim51.com
CLR P1.3 ; poczatek wysylania instrukcji sterujacych do LCD (RS = 0)
CLR P1.7 ;0 ;ustawienie trybu 4 bitowego
CLR P1.6 ;0
SETB P1.5 ;1
CLR P1.4 ;0 ;koniec ustawiania trybu
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SETB P1.2 ;1 ;przelaczenie 'wajchy' konca 4 bitow komendy
CLR P1.2 ;0
CALL delay ;opoznienie zeby wyswietlacz mogl przetworzyc
SETB P1.2 ;1 ;przelaczenie 'wajchy' konca 4 bitow komendy bez zmiany wartosci
CLR P1.2 ;bo po przestawieniu trybu wysylamy komende do konca czyli to co dalej
SETB P1.7 ; druga czesc komendy rozni sie wlasnie ta jedynka aby ustawic na 2 linie LCD
SETB P1.2 ;1 ;przelaczenie 'wajchy' konca kolejnych4 bitow komendy
CLR P1.2
CALL delay
;//ustalenie inkrementacji pol pamieci i brak przsuniecia ekranu
CLR P1.7
CLR P1.6
CLR P1.5
CLR P1.4
SETB P1.2
CLR P1.2
SETB P1.6
SETB P1.5
SETB P1.2
CLR P1.2
CALL delay
;//wlaczenie wyswietlacza, wlaczenie kursora, wlaczenie 'mrugania'
CLR P1.7
CLR P1.6
CLR P1.5
CLR P1.4
SETB P1.2
CLR P1.2
SETB P1.7
SETB P1.6
SETB P1.5
SETB P1.4
SETB P1.2
CLR P1.2
CALL delay
duzapetla: ; poczatek glownej petli programu
; instrukcja sterujaca ustawiajaca "kursor"
; wyswietlacza do poczatku linii 1
; oczekiwanie musi byc potem na 1520 ->delay1
CLR P1.7
CLR P1.6
CLR P1.5
CLR P1.4
SETB P1.2
CLR P1.2
CLR P1.7
CLR P1.6
SETB P1.5
CLR P1.4
SETB P1.2
CLR P1.2
CALL delay1
; wysylanie danych(linia 1) do LCD
SETB P1.3 ; (RS = 1) LCD przyjmuje dane, nie instrukcje
MOV R1, #30H ; ustawia poczatek napisu w R1
malapetla1:
MOV A, @R1 ; R1 -> Akumulator
JZ end1 ; jump (do koniec) if (A) zero
CALL wyslijDane ; wysyla dane z A do LCD
INC R1 ; inkrementacja numeru komorki pamieci z napisem=nastepny znak z pamieci
JMP malapetla1 ; petla
end1:
INC 3FH ;zwieksza cyfre na ostanim miejscu
DEC R2 ;zmniejsza wartosc pomocnicza
CALL jednosci ;sprawdza czy juz ma uzupelnic
JMP end2 ;to w zasadzie niepotrzebne bo i tak powinien pojsc do end2 takze mozecie wywalic ;p
end2:
;;obsluga klawisza
CLR P0.0 ; clear row0
CALL Scan ; call column-scan subroutine
JB F0, end2 ;jesli jest 1 to znaczy ze nic nie jest wcisniete
;i zapetla sie do sprawdzania znow czy cos jest wcisniete
;a jesli jest 0 to idzie dalej bo klawisz jest wcisniety
CLR P1.3 ;ekran odbiera instrukcje
jmp duzapetla ; koniec glownej petli
; przesyl liter do LCD (zrodlo: przyklady edsim51.com)
wyslijDane:
MOV C, ACC.7 ;przesyla bit do CARRY-ja mysle ze to taki nosnik pomocniczy ;p
MOV P1.7, C
MOV C, ACC.6
MOV P1.6, C
MOV C, ACC.5
MOV P1.5, C
MOV C, ACC.4
MOV P1.4, C
SETB P1.2
CLR P1.2
MOV C, ACC.3
MOV P1.7, C
MOV C, ACC.2
MOV P1.6, C
MOV C, ACC.1
MOV P1.5, C
MOV C, ACC.0
MOV P1.4, C
SETB P1.2
CLR P1.2
CALL delay
RET ;tego nie bylo wczesniej a pozwala to ominac jedno opoznienie
delay: ; opoznienie
MOV R0, #37 ; 37 operacji - wedlug dokumentacji
DJNZ R0, $ ; dekrementuj i jump ($) if (R0) not zero czyli skacze do poczatku tej samej instrukcji
RET ; powrot tam skad opoznienie zostalo wywolane
delay1: ;wieksze opoznienie zlozone z kilku
MOV R0, #255
DJNZ R0, $
MOV R0, #255
DJNZ R0, $
MOV R0, #255
DJNZ R0, $
MOV R0, #255
DJNZ R0, $
MOV R0, #255
DJNZ R0, $
MOV R0, #255
DJNZ R0, $
MOV R0, #10
DJNZ R0, $
RET
Scan:
JNB P0.4, gotKey ; if col0 is cleared - key found ->
; kolumna ma same zera-przycisk wcisniety skocz do gotKey
SETB F0 ; otherwise set F0 -> jesli nie to ustaw F0 na '1'
RET ; return from subroutine - key not found ->
; powrot z podprogramu - przycisk nie wcisniety
gotKey:
CLR F0 ; key found - clr F0 -> przycisk wcisniety wyczysc F0
RET
jednosci:
MOV A, R2 ; wstaw R2 do A(kumulatora) w celu porownania
JNZ return ; jesli nie jest zerem-jeszcze nie minelo 10 cyfr-to wroc ze sprawdzania
MOV R2,#10 ; jesli jest zerem to ustaw R2 na 10 (cyfr)
MOV 3FH, #'0' ; wyzeruj 3FH-ostatnia cyfre
INC 3EH ; skoro przeskoczyly jednosci to zwieksz dziesiatki
DEC R3 ; zmniejsz wartosc pomocnicza dla dziesiatek
CALL dziesiatki ; wywolaj sprawdzanie czy nie trzeba juz uzupelnic dziesiatek
RET ; po wykonaniu poprzednich - powrot
dziesiatki:
MOV A, R3 ; wstaw R3 do A(kumulatora) w celu porownania
JNZ return ; jesli nie jest zerem-jeszcze nie minelo 10 cyfr-to wroc ze sprawdzania
MOV R3, #10 ; jesli jest zerem to ustaw R3 na 10 (cyfr)
MOV 3EH, #'0' ; wyzeruj 3EH-cyfre dziesiatek
INC 3DH
DEC R4
CALL setki
RET ; po wykonaniu poprzednich - powrot
setki:
MOV A,R4
JNZ return
MOV R4, #10
MOV 3DH, #'0'
INC 3CH
DEC R5
CALL tysiace
RET
tysiace:
MOV A, R5
JNZ return
MOV R5, #10
MOV 3CH, #'0'
INC 3BH
DEC R6
CALL tysiace1
RET
tysiace1:
MOV A, R6
JNZ return
MOV R6, #10
MOV 3BH, #'0'
INC 3AH
DEC R7
CALL tysiace2
RET
tysiace2:
MOV A,R7
JNZ return
MOV R7, #10
MOV 3AH, #'0'
return: ;pomocnicza funkcja powrotu
RET