• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Asembler zadanie z klawiatura i wyswietlaczem 7_segmentowym

VPS Starter Arubacloud
0 głosów
418 wizyt
pytanie zadane 8 grudnia 2019 w Assembler przez Vlad Nowicjusz (120 p.)

Kto moze pomoc zmodyfikować program dla dsm 8051 tak, żeby jeżeli naciskam na klawiaturze dsm przycisk w dol to licznik na wyświetlaczu 7_segmentowym zmniejsza o ''1'' jeżeli przycisk w gore to zwieksza o "1", a jeżeli "enter" to zatrzyma lub wznowią liczenie. Mam teraz cos takiego:

;
;	zegar na DSM51
;

CSDS equ 30H 	;bufor wyboru wskaźnika 7-segmentowego
CSDB equ 38H 	;bufor segmentow wskaźnika 7-segmentowego
ww7s bit P1.6	;wylacznik wyświetlacza 7-segmentowego
KEYB bit P3.5 	;bit informujacy o nacisnieciu klawisza
KEYS equ 72h			;tablica przechowujaca 4 stany klawiatury (obecny i 3 poprzednie)
LS 	equ 76h     ;licznik sekund
LM  equ 77h     ;licznik minut
LG  equ 78h     ;licznik godzin
CZAS equ 79h	;tablica przechowywująca wskazanie zegara

org 0
	ljmp start

org 0Bh	;procedura obsługi przerwanie od TIMER0
	mov TH0, #226	;w trybie0 generuje 960 przerwań na sekundę
	setb F0         ;informuję pętlę zliczającą o wystąpieniu przerwania
;	cpl P1.7
;	cpl P1.5
	reti            ;wracam z przerwania


org 100h
start:     ;USTAWIAMY ŚRODOWISKO
				;12:58:34
	mov LG, #12
	mov LM, #58
	mov LS, #34
	mov DPTR, #WZORY    ;adres wzorow cyfr na stałe do DPTR
	acall convertCZAS

	clr ww7s
	mov R0, #CZAS		;R0 to wskaznik na tablice czas

	mov R7, #00000001b	;bit wybierający wyświetlacz

	mov IE, #0	;blokada wszystkich przerwań
	mov TMOD, #01110000b	;blokujemy TIMER1, ustawiamy TIMER0 w trybie 16bitowym
	mov TCON, #00010000b	;zgoda na zliczanie przez TIMER0
	setb ET0	;zgoda na obsługę przerwania od TIMER0
	setb EA     ;ogólna zgoda na obsługę przerwań
	mov TH0, #226	;w trybie0 generuje 960 przerwań na sekundę

	mov R2, #4 		;ustawiam liczniki aby zliczyć do 960
	mov R3, #192

dispLoop:          ;============ petla główna

	jnb F0, dispLoop	;czekam na rzerwanie zegarowe
	clr F0              ;zapominam o przerwaniu zegarowym

	acall pokazCZAS     ;TUTAJ JESTEM 960 RAZY NA SEKUNDĘ

	djnz R3, dispLoop  ;zliczam przerwania do 960
	djnz R2, dispLoop
	mov R2, #4 		;ustawiam liczniki aby zliczyć do 960
	mov R3, #192

	acall aktualizujCZAS  ;TUTAJ JESTEM 1 RAZ NA SEKUNDĘ
	cpl P1.7            ;żeby coś było widać

	sjmp dispLoop      ;wracam na poczatek pętli zliczającej

WZORY:    ;========== wzory cyfr
	db 00111111b, 00000110b, 01011011b, 01001111b	;0..3
	db 01100110b, 01101101b, 01111101b, 00000111b   ;0..7
	db 01111111b, 01101111b                         ;8..9
pokazCZAS: ;=========OBSLUGA WYSWIETLACZA 7SEG
	mov R1, #CSDB	;decyduje, które segmenty będą świecić
	mov A, @R0      ;wartosc z odpowiedniej cyfry z tablicy czasow do ACC
;	movc A, @A+DPTR ;zamieniam cyfre na odpowiadajacy jej wzorek
	inc R0          ;nastepna cyfra na potrzeby nastepnego obrotu petli
	setb ww7s       ;wyłączam wyświetlacze żeby nie było duchów
	movx @R1, A     ;wysyłam wzorek do zatrzasku

	mov R1, #CSDS	;decyduje, które wyświetlacze będą się świecić
	mov A, R7       ;wybieram wyświetlacz do ACC
	movx @R1, A     ;wybieram wyswietlacz
	jnb KEYB, noKEY       ;jeżeli jest nacisniety klawisz
	orl KEYS, A     ;to maksa z ACC(R7) mowi nam ktory to klawisz
noKEY:
	clr ww7s        ;włączam wyswietlacze
	rl A;           ;przesówam wybrany wyswietlacz w lewo na potrzeby nastepnego
	jnb ACC.7, nbACC7 ;sprawdzam czy nie minąłem wyświetlaczy
	mov A,#00000001b  ;jeżeli tak to wracam na najmłowdszy wyświtlacz
	mov R0, #CZAS     ;i wracam na cyfre jednostki sekund w tablicy CZas
	mov CZAS+6, KEYS
	acall keySERV
	mov KEYS+3, KEYS+2
	mov KEYS+2, KEYS+1
	mov KEYS+1, KEYS
	mov KEYS, #0
nbACC7:
	mov R7, A         ;zapamietuje nastepny wybrany wyświtlacz
	ret
keySERV:
	push ACC
	mov A, KEYS
	jz wracaj  ;nie ma zadnego klawisza - nie ma nic do roboty
	cjne A, KEYS+1, wracaj ;niestabilna klawiatura nie bedziemy obsługiwać
	cjne A, KEYS+2, wracaj
	cjne A, KEYS+3, obsluz ; stabilna klawiatura jeszcze nie obsluzona
	sjmp resetC
obsluz:
	cjne A, #4,niePrawo ; nie jest nacisniety klawisz "w prawo"
	acall aktualizujCZAS
	sjmp resetC
niePrawo:
	cjne A, #16, nieDol
	acall aktualizujMinuty
	sjmp resetC
nieDol:
	cjne A, #32, wracaj
	acall aktualizujGodziny
resetC:
	mov R2, #4 		;ustawiam liczniki aby zliczyć do 960
	mov R3, #192
wracaj:

	pop ACC
	ret
convertCZAS:
	mov A, LS
	mov B, #10
	div AB
	movc A, @A+DPTR
	mov CZAS+1, A  ;dziesiatki sekund
	mov A, B
	movc A, @A+DPTR
	mov CZAS, 	A	;sekundy

	mov A, LM
	mov B, #10
	div AB
	movc A, @A+DPTR
	mov CZAS+3, 	A	;sekundy
	mov A, B
	movc A, @A+DPTR
	mov CZAS+2, A  ;dziesiatki sekund

	mov A, LG
	mov B, #10
	div AB
	movc A, @A+DPTR
	mov CZAS+5, 	A	;sekundy
	mov A, B
	movc A, @A+DPTR
	mov CZAS+4, A  ;dziesiatki sekund
	ret
aktualizujCZAS:
	inc LS
	mov A, LS
	cjne A, #60, nie60
	mov LS, #0
aktualizujMinuty:
	inc LM
	mov A, LM
	cjne A, #60, nie60
	mov LM, #0
aktualizujGodziny:
	inc LG
	mov A, LG
	cjne A, #24, nie60
	mov LG, #0
nie60:
	acall convertCZAS
	mov R2, #4          ;odnaiwam licznika aby ponownie
	mov R3, #192        ;zliczyć do 960
	ret
end

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 34 wizyt
pytanie zadane 1 grudnia 2023 w Assembler przez hutsalo1998 Użytkownik (520 p.)
0 głosów
1 odpowiedź 491 wizyt
pytanie zadane 12 maja 2020 w Assembler przez evela Nowicjusz (120 p.)
+1 głos
2 odpowiedzi 606 wizyt
pytanie zadane 6 lutego 2018 w Assembler przez Paweł Piech Użytkownik (720 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...