Zestaw 1
Zadanie 1
CSEG AT 0
JMP start
CSEG At 100h
start:
MOV R6,#22h
MOV R7,#0DBh
;Load the second value into R4 and R5
MOV R4,#1Ah
MOV R5,#0F9h
;Call the 16-bit subtraction routine
LCALL SUBB16_16
SUBB16_16:
;Step 1 of the process
MOV A,R7 ;Move the low-byte into the accumulator
CLR C ;Always clear carry before first subtraction
SUBB A,R5 ;Subtract the second low-byte from the accumulator
MOV R3,A ;Move the answer to the low-byte of the result
;Step 2 of the process
MOV A,R6 ;Move the high-byte into the accumulator
SUBB A,R4 ;Subtract the second high-byte from the accumulator
MOV R2,A ;Move the answer to the low-byte of the result
;Return - answer now resides in R2, and R3.
RET
END
Zadanie 2
CSEG AT 0
JMP start
CSEG AT 100h
start:
mov r0,#5
MOV DPTR,#etykieta
MOV R1,#20h
loop:
MOVC A,@A+DPTR
MOV @R1,A
MOV a,#0
INC R1
INC DPTR
DJNZ r0,loop
CSEG AT 1000h
etykieta: db 11,21,4,18,8
END
Zadanie 3
Generator liczb pseudolosowych całkowitych w przedziale od 0 do 3
Dane EQU 20h
DaneEnd EQU 2Ah
Maska EQU 00000011B
Wskaznik1 EQU 1Eh
Wskaznik2 EQU 1Fh
CSEG AT 0
JMP start
CSEG AT 100h
start:
LCALL SRAND
losuj:
LCALL RAND
SJMP losuj
SRAND:
PUSH ACC
MOV Wskaznik1,#Dane
MOV A,Wskaznik1
ADD A,#3
MOV Wskaznik2,A
MOV A,#0
MOV R0,#10
MOV DPTR,#Fibonacci
MOV R1,#Dane
loop:
MOVC A,@A+DPTR
MOV @R1,A
MOV A,#0
INC R1
INC DPTR
DJNZ R0,loop
POP ACC
RET
RAND:
MOV R0,Wskaznik1
MOV R1,Wskaznik2
MOV A,@R0
MOV R2,A
MOV A,@R1
ADD A,R2
ANL A,#Maska
MOV R0,Wskaznik1
MOV @R0,A
PUSH ACC
MOV A,Wskaznik1
INC A
MOV Wskaznik1, A
CLR C
SUBB A,#DaneEnd
JNZ lab1
MOV Wskaznik1,#Dane
lab1:
MOV A,Wskaznik2
INC A
MOV Wskaznik2, A
CLR C
SUBB A,#DaneEnd
JNZ lab2
MOV Wskaznik2,#Dane
lab2:
POP ACC
RET
CSEG AT 1000h
Fibonacci: db 4,5,3,3,3,4,6,2,6,5
END
Zestaw 2
Zadanie 2
PROG SEGMENT CODE
LED BIT P2.0
SWITCH BIT P3.0
CSEG AT 0
JMP start
RSEG PROG
start:
CLR LED
loop:
JB SWITCH, loop
CPL LED
ACALL CZEKAJ ;opóźnienie konieczne, aby przełącznik działał stabilnie
SJMP loop
CZEKAJ:
MOV R0,#255
ODLICZAJ2:
MOV R1,#255
ODLICZAJ1:
NOP
NOP
DJNZ R1,ODLICZAJ1
DJNZ R0,ODLICZAJ2
RET
END
Zadanie 3
CSEG AT 0
JMP 100h
CSEG AT 100h
start:
MOV A,P3
loop:
CJNE A,P3,led
SJMP loop
led:
MOV R0,P3
MOV A,P2
XRL A,R0
CPL A
MOV P2,A
sjmp start
END
Zadanie 4
Listing 1 - zwiększanie/zmiejszanie czasu wyświetlania mrugających diod
Dane EQU 20h
DaneEnd EQU 2Ah
Maska EQU 00000011B
Wskaznik1 EQU 1Eh
Wskaznik2 EQU 1Fh
Step EQU 20
CSEG AT 0
JMP start
CSEG AT 100h
start:
LCALL SRAND
MOV R6,#55
MOV R7,#55
losuj:
MOV R5,#0
LCALL RAND
CJNE A,#0, next1
CLR P2.0
LJMP wait
next1:
CJNE A,#1,next2
CLR P2.1
LJMP wait
next2:
CJNE A,#2,next3
CLR P2.2
LJMP wait
next3:
CLR P2.3
wait:
LCALL CZEKAJ
MOV P2,#0FFh
LCALL CZEKAJ
CJNE R5,#1,test1
MOV A,R6
ADD A,#Step
MOV R6,A
MOV A,R7
ADD A,#Step
MOV R7,A
LJMP loop1
test1:
CJNE R5,#2,losuj
CLR C
MOV A,R6
SUBB A,#Step
MOV R6,A
CLR C
MOV A,R7
SUBB A,#Step
MOV R7,A
loop1:
LCALL SMALLLOOP
SJMP losuj
SRAND:
PUSH ACC
MOV Wskaznik1,#Dane
MOV A,Wskaznik1
ADD A,#3
MOV Wskaznik2,A
MOV A,#0
MOV R0,#10
MOV DPTR,#Fibonacci
MOV R1,#Dane
loop:
MOVC A,@A+DPTR
MOV @R1,A
MOV A,#0
INC R1
INC DPTR
DJNZ R0,loop
POP ACC
RET
RAND:
MOV R0,Wskaznik1
MOV R1,Wskaznik2
MOV A,@R0
MOV R2,A
MOV A,@R1
ADD A,R2
ANL A,#Maska
MOV R0,Wskaznik1
MOV @R0,A
PUSH ACC
MOV A,Wskaznik1
INC A
MOV Wskaznik1, A
CLR C
SUBB A,#DaneEnd
JNZ lab1
MOV Wskaznik1,#Dane
lab1:
MOV A,Wskaznik2
INC A
MOV Wskaznik2, A
CLR C
SUBB A,#DaneEnd
JNZ lab2
MOV Wskaznik2,#Dane
lab2:
POP ACC
RET
CZEKAJ:
MOV R0,07h
ODLICZAJ3:
MOV R1,06h
ODLICZAJ4:
JB P3.7, dalej1
MOV R5,#1
dalej1: JB P3.6, dalej2
MOV R5,#2
dalej2: NOP
NOP
DJNZ R1,ODLICZAJ4
DJNZ R0,ODLICZAJ3
RET
SMALLLOOP:
MOV R0,#255
ODLICZAJ1:
MOV R1,#255
ODLICZAJ2:
NOP
NOP
DJNZ R1,ODLICZAJ2
DJNZ R0,ODLICZAJ1
RET
CSEG AT 1000h
Fibonacci: db 4,5,3,3,3,4,6,2,6,5
END
Listing 2 Każde nieudane MaxHit prób zwiększa czas o STEP
Dane EQU 20h
DaneEnd EQU 2Ah
Maska EQU 00000011B
Wskaznik1 EQU 1Eh
Wskaznik2 EQU 1Fh
MaxHit EQU 5
Step EQU 50
CSEG AT 0
JMP start
CSEG AT 100h
start:
LCALL SRAND
MOV R5,#0
MOV R6,#100
MOV R7,#100
losuj:
LCALL RAND
CJNE A,#0, next1
CLR P2.0
LJMP wait
next1:
CJNE A,#1,next2
CLR P2.1
LJMP wait
next2:
CJNE A,#2,next3
CLR P2.2
LJMP wait
next3:
CLR P2.3
wait:
MOV R3,#4
LCALL CZEKAJ_NA_KLAWISZ
CJNE A,03h,KONTYNUUJ
SJMP KONIEC ;nacisnieto klawiszodpowiadajacy diodzie
KONTYNUUJ:
MOV P2,#0FFh ;gasze diode
LCALL CZEKAJ
CJNE R3,#4,KONTYNUUJ1 ;sprawdzam, czy nacisnieto jakis klawisz gdy dioda byla zapalona
SJMP losuj ;jesli nie to losowana nowa dioda
KONTYNUUJ1: ;nacisnieto jakis klawisz
INC R5
LCALL CZEKAJ
CJNE R5,#MaxHit,losuj
MOV R5,#0
MOV A,R6
ADD A,#STEP
MOV R6,A
MOV A,R7
ADD A,#STEP
MOV R7,A
SJMP losuj
KONIEC:
MOV P2,#0AAh
ACALL CZEKAJ
MOV P2,#055h
ACALL CZEKAJ
SJMP $
SRAND:
PUSH ACC
MOV Wskaznik1,#Dane
MOV A,Wskaznik1
ADD A,#3
MOV Wskaznik2,A
MOV A,#0
MOV R0,#10
MOV DPTR,#Fibonacci
MOV R1,#Dane
loop:
MOVC A,@A+DPTR
MOV @R1,A
MOV A,#0
INC R1
INC DPTR
DJNZ R0,loop
POP ACC
RET
RAND:
MOV R0,Wskaznik1
MOV R1,Wskaznik2
MOV A,@R0
MOV R2,A
MOV A,@R1
ADD A,R2
ANL A,#Maska
MOV R0,Wskaznik1
MOV @R0,A
PUSH ACC
MOV A,Wskaznik1
INC A
MOV Wskaznik1, A
CLR C
SUBB A,#DaneEnd
JNZ lab1
MOV Wskaznik1,#Dane
lab1:
MOV A,Wskaznik2
INC A
MOV Wskaznik2, A
CLR C
SUBB A,#DaneEnd
JNZ lab2
MOV Wskaznik2,#Dane
lab2:
POP ACC
RET
CZEKAJ:
MOV R0,#255
ODLICZAJ2:
MOV R1,#255
ODLICZAJ1:
NOP
NOP
DJNZ R1,ODLICZAJ1
DJNZ R0,ODLICZAJ2
RET
CZEKAJ_NA_KLAWISZ:
MOV R0,07h
ODLICZAJ3:
MOV R1,06h
ODLICZAJ4:
JB P3.0, dalej1
MOV R3,#0
dalej1:
JB P3.1, dalej2
MOV R3,#1
dalej2:
JB P3.2, dalej3
MOV R3,#2
dalej3:
JB P3.3, dalej4
MOV R3,#3
dalej4:
NOP
NOP
DJNZ R1,ODLICZAJ4
DJNZ R0,ODLICZAJ3
RET
CSEG AT 1000h
Fibonacci: db 4,5,3,3,3,4,6,2,6,5
END
Zestaw 3
Zadanie 1
LED EQU P2.6
CSEG AT 00h
LJMP Main
CSEG AT 30h
Main:
CLR LED
MOV TH0,#0
MOV TL0,#0
MOV TMOD,#1
SETB TR0
loop:
JNB TF0,$
CPL LED
CLR TF0
AJMP loop
END
Zadanie 2
SWITCH EQU P3.0
CSEG AT 00h
LJMP Main
CSEG AT 30h
Main:
MOV TH0,#76
MOV TL0,#01
MOV TMOD,#1
MOV R0,#0
MOV A,#0FEh
MOV P2,A
JB SWITCH,$ ;czekam na wcisniecie klawisza
SETB TR0
loop1:
JNB TF0,loop2 ;Jeżeli TF0 nie jest ustawione to nie ma przepełnienia, przebieg jałowy
MOV TH0,#76
MOV TL0,#01
CLR TF0
INC R0
CJNE R0,#20,loop2
MOV R0,#0
RL A
MOV P2,A
loop2:
JNB SWITCH,loop1
CLR TR0
AJMP Main
END
Zadanie 3
SWITCH EQU P3.4 ;wejscie T0
CSEG AT 00h
LJMP Main
CSEG AT 30h
Main:
MOV TMOD,#00010101B ;T1 - timer, T0 - licznik, oba 16-bitowe
JB SWITCH,$
MOV A,#20
MOV TH1,#76
MOV TL1,#01
SETB TR1 ;startujemy timer 0
SETB TR0
loop:
JNB TF1,$
MOV TH1,#76
MOV TL1,#01
CLR TF1
DJNZ ACC,loop
CLR TR1
;MOV A,TL0
; CJNE A,#1,next
; CLR P2.0
; AJMP koniec
;next:
; CJNE A,#2,next1
; CLR P2.1
; AJMP koniec
;next1:
; CJNE A,#3,next2
; CLR P2.2
; AJMP koniec
;next2:
; CJNE A,#4,koniec
; CLR P2.3
; AJMP koniec
;koniec:
MOV A,#FFh
MOV R0,TL0
CJNE R0,#0,next
AJMP koniec
next:
MOV R4,TL0
MOV A,#0FEh
roll:
DEC R4
CJNE R4,#0,next1
AJMP koniec
next1:
RL A
AJMP roll
koniec:
MOV P2,A
SJMP $
END
Zestaw 4
Zestaw 5
Zestaw 6
Zadanie 1
cseg at 0
jmp 100h
cseg at 100h
start:
JMP display0
MOV R0,#0
loop:
JB P3.0, $ ;czekam na nacisniecie klawisza
CALL CZEKAJ
INC R0
CJNE R0,#1,next2
JMP display1
next2:
CJNE R0,#2,next3
JMP display2
next3:
CJNE R0,#3,next4
JMP display3
next4:
CJNE R0,#4,next5
JMP display4
next5:
CJNE R0,#5,next6
JMP display5
next6:
CJNE R0,#6,next7
JMP display6
next7:
CJNE R0,#7,next8
JMP display7
next8:
CJNE R0,#8,next9
JMP display8
next9:
CJNE R0,#9,next10
JMP display9
next10:
MOV R0,#0
JMP display0
JMP loop
display0:
MOV P1,#0
SETB P1.0
MOV P2,#00111111B
JMP loop
display1:
MOV P1,#0
SETB P1.0
MOV P2,#00000110B
JMP loop
display2:
MOV P1,#0
SETB P1.0
MOV P2,#01011011B
JMP loop
display3:
MOV P1,#0
SETB P1.0
MOV P2,#01001111B
JMP loop
display4:
MOV P1,#0
SETB P1.0
MOV P2,#01100110B
JMP loop
display5:
MOV P1,#0
SETB P1.0
MOV P2,#01101101B
JMP loop
display6:
MOV P1,#0
SETB P1.0
MOV P2,#01111101B
JMP loop
display7:
MOV P1,#0
SETB P1.0
MOV P2,#00000111B
JMP loop
display8:
MOV P1,#0
SETB P1.0
MOV P2,#01111111B
JMP loop
display9:
MOV P1,#0
SETB P1.0
MOV P2,#01101111B
JMP loop
CZEKAJ:
MOV R2,#255
ODLICZAJ2:
MOV R1,#255
ODLICZAJ1:
NOP
NOP
DJNZ R1,ODLICZAJ1
DJNZ R2,ODLICZAJ2
RET
end