Читайте также: |
|
.list on
; ******** именуем константы и внешние выводы
Tik equ 5000; длительность импульса в мкс
RazmerIndicachii equ 5; количество индикаторов
KnopkaPlus reg P3.3; кнопки
KnopkaMinus reg P3.2
Igra reg P3.0
Ustanovka reg P3.1
Pik reg P3.7; сигнал
; *****************
; ***************** это макрос установки длительности
LoadTimer0 macro DlitTi
Clr TF0
Clr TR0
Mov TH0, #>(-DlitTi)
Mov TL0, #<(-DlitTi)
SetB TR0
.endm
; *****************
; ***************** макрос для таймера1
LoadTimer1 macro DlitT
Clr TF1
Clr TR1
Mov TH1, #>(-DlitT)
Mov TL1, #<(-DlitT)
SetB TR1
.endm
; *****************
.ABSOLUTE
.DATA; распределяем ячеки ОЗУ
.ORG 20h
Flags ds 1; 1 байт под битовые переменные
First reg Flags.0; первый игрок
Second reg Flags.1; второй игрок
StartTime reg Flags.2; начало счёта
FirstUstan reg Flags.3;первая установка для обнуления,вместо прерывания
Count5ms ds 1; для счета времени по 5 мс
CountZn ds 1; знакоместо. от 0 до 5
t11 ds 1
t12 ds 1
t13 ds 1
t21 ds 1;цифры счёта
t22 ds 1
t23 ds 1
Digites ds 6; цифры индикации
EndVarBeginStack ds 1; последняя ячейка, дальше стек.
.RELATIVE
.CODE
.ORG 0
;************** векторы прерываний
Jmp Start
.ORG 3; внешнее прерывание 0
Jmp ProcInt0
.ORG 0bh; прерывание по таймеру 0
Jmp IntT0
.ORG 13h; внешнее прерывание 1
Jmp ProcInt1
.ORG 1bh; прерывание по таймеру 1
Jmp IntT1
.ORG 23h; прерывание по посл. порту
RetI
;**************
.ORG 40h
;************** начало программы
Start:
Mov SP, #(EndVarBeginStack); начальный указатель стека
Mov Count5ms, #0
Mov CountZn, #0
Mov Digites, #0
Mov t11, #0
Mov t12, #0
Mov t13, #0
Mov t21, #0
Mov t22, #0
Mov t23, #0
Clr First
Clr Second
Clr StartTime
Clr Pik
SetB Ustanovka; чтобы было определено заранее
SetB FirstUstan
Mov TMod, #00010001b;оба таймера на 16 бит.
LoadTimer0 Tik
LoadTimer1 TikForPik; заносим в таймер1 значение соот-щее 500Гц
SEtB IT0; разрешение прерывания по перепаду
SetB ET0; разрешить прерывание от таймера0
SetB EA; разрешить работу контроллера прерываний
;************** основной цикл программы
mainloop:
; всё важное происходит здесь
JNB Ustanovka,mainloop; не считаем при установке
JNB StartTime,mainloop; не запущены часы
Mov A, Count5ms
CJNE A, #200, metka; прошла одна секунда
Mov Count5ms, #0
JB First,Perviy
JB Second,Vtoroy
Jmp metka
Perviy:
CALL FirstSchet
Jmp Vnesenie
Vtoroy:
CALL SecondSchet
Jmp Vnesenie
Vnesenie:
;внесение значений в индикацию
Mov A,t13
Mov Digites,A
Mov A,t12
Mov (Digites+1),A
Mov A,t11
Mov (Digites+2),A
Mov A,t23
Mov (Digites+3),A
Mov A,t22
Mov (Digites+4),A
Mov A,t21
Mov (Digites+5),A
metka:
Jmp mainloop
;**************
;************** счёт на пнрвом индикаторе
FirstSchet:
Mov A,t11
CJNE A,#0,Umensh11
Mov A,t12;Mov A,#9 Mov t11,A
CJNE A,#0,Umensh12
Mov A,t13
CJNE A,#0,Umensh13
CALL Signalisation; звуки
Jmp ExitFS
Umensh13:
Dec t13
Mov A,#9
Mov t12,A
Mov A,#9
Mov t11,A
Jmp ExitFS
Umensh12:
Dec t12
Mov A,#9
Mov t11,A
Jmp ExitFS
Umensh11:
Dec t11
ExitFS:
Ret
;**************
;************** счёт на втором индикаторе
SecondSchet:
Mov A,t21
CJNE A,#0,Umensh21
Mov A,t22;Mov A,#9 Mov t21,A
CJNE A,#0,Umensh22
Mov A,t23
CJNE A,#0,Umensh23
CALL Signalisation; звуки
Jmp ExitSS
Umensh23:
Dec t23
Mov A,#9
Mov t22,A
Mov A,#9
Mov t21,A
Jmp ExitSS
Umensh22:
Dec t22
Mov A,#9
Mov t21,A
Jmp ExitSS
Umensh21:
Dec t21
ExitSS:
Ret
;**************
;************** сигнал динамика
Signalisation:
Mov R1,#5
SetB ET1; разрешаем прерывание по таймеру1
Ups:
Mov A, Count5ms
CJNE A, #200, metka; прошла 1 секунда
Mov Count5ms, #0
Dec R1
CJNE R1,#0,Ups
Clr ET1; запрещаем прерывание по таймеру1
Clr Pik; для отсутствия сигнала.
Clr StartTime; остановка, и отсутствие дальнейших вычислений
Clr First
Clr Second
Ret
;**************
;************** процедура прерывания по переполнению таймера 0
IntT0:
Push PSW
Push Acc
LoadTimer0 Tik
Inc Count5ms; счет времени
JNB FirstUstan,Dalee
JB Ustanovka,Dalee; режим установки и при первом запуске
Call Prerivanie
Dalee:
Call DinamicIndication
Pop Acc
Pop PSW
RetI
;**************
;************** процедура прерывания по переполнению таймера 1
IntT1:
Push PSW
Push Acc
LoadTimer1 TikForPik
Cpl Pik; подаём сигналы
Pop Acc
Pop PSW
RetI
;**************
;************** процедура внешнего прерывания 0 (кнопка минус/первый ходил)
ProcInt0:
Push PSW
Push Acc
JNB Ustanovka,Minusik
JNB Igra,Perehod
Minusik:
Mov A,t12
SUBB A,#6
JNC Zaem; если в разряде цифра меньше 6
Mov t12,A
JMP ExitPr0
Zaem:; в разряде цифра меньше 6
Mov A,t12
Add A,#4; вычитание цифры 6
Mov t12,A
Mov A,t13
CJNE A,#0,Sbros; меньше нельзя
Dec A
Mov t13,A
JMP ExitPr0
Sbros:
Mov A,t12
Mov A,#6
Mov t12,A
JMP ExitPr0
Perehod:
SetB StartTime
SetB Second
SetB FirstUstan; что бы при изменении пошел обнуление
Clr First
JMP ExitPrInd0
ExitPr0:
Mov A,t12; на двуx индикатораx вместе
Mov t22,A
Mov A,t13
Mov t23,A
ExitPrInd0:
Pop Acc
Pop PSW
REtI
;**************
;************** процедура внешнего прерывания 1 (кнопка плюс/второй ходил)
ProcInt1:
Push PSW
Push Acc
JNB Ustanovka,Plusik
JNB Igra,Perehod1
Plusik:
Mov A,t12
Add A,#6
SUBB A,#9;проверка принадлежности 0-9
JNC Tot;не больше 9
Dec A
Mov t12,A
Mov A,t13; так как вычитаем 9
Add A,#1
CJNE A,#10,Norm;следит за непереполнением cтаршего разряда индикации
Mov t13,#9
Mov t12,#6
JMP ExitPr1
Norm:
Mov t13,A
JMP ExitPr1
Tot:;не больше 9
Mov A,t12
Add A,#6
Mov t12,A
JMP ExitPr1
Perehod1:
SetB StartTime
SetB First
SetB FirstUstan
Clr Second
JMP ExitPrInd1
ExitPr1:
Mov A,t12
Mov t22,A
Mov A,t13
Mov t23,A
ExitPrInd1:
Pop Acc
Pop PSW
REtI
;**************
;************** динамическая индикация
DinamicIndication:
Mov A, CountZn
Add A,#Digites
Mov R0, A
Mov A, @R0
Swap A
ORL A, CountZn
Swap A
Mov P1, A
Inc CountZn
Mov A,CountZn
CJNE A,#RazmerIndicachii, ExitInd
Mov CountZn,#0
ExitInd:
Ret
;**************
;*******************псевдо прерывание обнуления
Prerivanie:
Mov t11, #0
Mov t12, #0
Mov t13, #0
Mov t21, #0
Mov t22, #0
Mov t23, #0
Clr StartTime
Clr First
Clr Second
Clr FirstUstan
Ret
;*******************
END
Дата добавления: 2015-07-16; просмотров: 36 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Алгоритм работы подпрограммы изменения состояния индикаторов | | | Страны Балтии. |