Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РПЗ_Часы ПЕЧАТЬ.doc
Скачиваний:
59
Добавлен:
13.03.2016
Размер:
1.16 Mб
Скачать

Приложение 1. Принципиальная схема устройства Приложение 2. Перечень элементов

Приложение 3. Текст программы

.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 ; сигнал

; *****************

; ***************** это макрос установки длительности

LoadTimer0macroDlitTi

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

ClrPik

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

SetBET1 ; разрешаем прерывание по таймеру1

Ups:

Mov A, Count5ms

CJNE A, #200, metka ; прошла 1 секунда

Mov Count5ms, #0

Dec R1

CJNE R1,#0,Ups

ClrET1 ; запрещаем прерывание по таймеру1

ClrPik; для отсутствия сигнала.

ClrStartTime; остановка, и отсутствие дальнейших вычислений

Clr First

Clr Second

Ret

;**************

;************** процедура прерывания по переполнению таймера 0

IntT0:

Push PSW

Push Acc

LoadTimer0 Tik

Inc Count5ms ; счет времени

JNB FirstUstan,Dalee

JBUstanovka,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

MovA,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

43