Ладно. Пока хватит этого. Может со временем ещё что-то в голову придёт.
Всем кто участвовал
Код: Выделить всё
;----------
bank0 EQU 00000000B ;определение банков данных
bank1 EQU 00001000B
ktdi EQU 60550 ;коэффициент пересчета счетчика
;----------
;
bseg
org 0
bufT: Dbit 1
flag : Dbit 1
DSEG ;
ORG 25H
timsec: DS 1 ;
;
ORG 30H
timdop: DS 1 ; 1/200 секунды
tim: DS 4 ; значение времени
tim1: ds 4 ;
nomR: DS 1 ;номер активного индикатора
freq: ds 1 ;
ksec: ds 1 ;кол-во секунд в минуте
kmin: ds 1 ;макс значение 3 разряда
k4: ds 1 ;макс значение 2 разряда
k2: ds 1 ;макс значение 1 разряда
ORG 60H ;
stack: DS 20H ; стека
;##########################################################
;## переопр-ие векторов irq ##
;##########################################################
CSEG
ORG 0000H ;
jmp init ;
ORG 0003H ;
reti ;
ORG 000BH ;
jmp dnind ;
ORG 0013H ;
reti ;
ORG 001BH ;
reti ;
ORG 0023H ;
reti ;
; ----------
ORG 0030H
init: mov sp,#(stack-1) ; начальные значения времени
mov tim,#0 ; и коэффициентов пересчета
mov tim+1,#0 ;
mov tim+2,#0
mov tim+3,#0
mov nomR, #0
mov freq, #200d
mov ksec, #60d
mov kmin, #6d
mov k4, #4d
mov k2,#2d
clr flag ;разрешение увеличения счетчика времени
; ---------- Значение счетчика, маски прерываний, режим работы счетчика
mov TMOD,#00000001B ;
mov TH0,#(high ktdi) ;
mov TL0,#(low ktdi) ;
mov IE,#10000010B ;
mov IP,#00000010B ;
mov TCON,#00010000B ;
main: ; проверка нажатия клавши установки минут
aa: setb p3.4 ;
mov c, p3.4 ;
jnc smin ;
setb p3.5 ; проверка нажатия клавши установки часов
mov c, p3.5 ;
jnc shour ;
setb p3.7 ; проверка нажатия клавши перехода в режим секундомера
mov c,p3.7
jnc tmode
jmp aa
smin: mov timsec, #59
mov timdop, #199 ;+ минута
call dnind
mov timsec, #0
mov timdop, #0
a1: setb p3.4
mov c, p3.4 ; ждем, когда пользователь уберет руки с кнопки
jnc a1
jmp aa
shour:
push tim+3
push tim+2
mov tim+3, #9
mov tim+2, #5
mov timsec, #59 ; + час
mov timdop, #199
call dnind
pop tim+2 ;восстановление значения времени
pop tim+3
a2: setb p3.5
mov c, p3.5 ; ждем, когда пользователь уберет руки с кнопки
jnc a2
jmp aa
tmode: mov tim1, tim ;режим секундомера
mov tim1+1, tim+1 ;сохранение текущего времени
mov tim1+2, tim+2 ;
mov tim1+3, tim+3
mov tim,#0 ;
mov tim+1,#0 ; обнуление счетчиков
mov tim+2,#0 ;
mov tim+3,#0 ;
;----------
tmode1: mov ksec, #1
mov timsec, #0 ;коэффициент пересчета времени для секундомера(он же считает сотые)
mov kmin, #10
mov freq, #2
mov k4, #9
mov k2, #9
st2: setb p3.5 ;остановка секундомера с обнулением
mov c, p3.5
jc st1
setb flag ; запрет увеличения значений секундомера
mov tim,#0
mov tim+1,#0
mov tim+2,#0
mov tim+3,#0
jmp st2
st1: setb p3.5
setb p3.4 ; остановка без обнуления
mov c, p3.4
jc st5
st55:
setb flag ; запрет увеличения значений секундомера
setb p3.5
jmp st1
st5:
;----------
clr flag ; остаемся в режиме секундомера
setb p3.7 ; пока нажата кнопка
mov c, p3.7 ;
jnc tmode1 ;
mov freq, #200 ;возврат к режиму часов
mov ksec,#60
mov kmin, #6
mov k4, #4
mov k2, #2
mov tim, tim1 ; и восстановление на дисплее текущего времени
mov tim+1,tim1+1 ;
mov tim+2,tim1+2
mov tim+3,tim1+3
jmp aa
dnind: push ACC ;сохранения acc и psw
push PSW
mov PSW,#bank1 ; банк номер 1
mov TH0,#(high ktdi) ;
mov TL0,#(low ktdi) ;
; ---------- ;вывод на индикаторы
mov a,nomR ;
; rrc a
; mov p1, #0 ; подаем на выводы p3.0, p3.1 значений
; mov p3.0,c ; текущего индикатора
; rrc a ;
; mov p3.1,c ;
mov p3, nomR
; Вывод точки
mov a,nomR
cjne a,#1,dn1 ; Проверка номера разряда
mov c,timsec.0 ; Мерцание точки
jmp dn2
dn1: setb c ; Точку выключаем
dn2: mov bufT,c ; Помещаем результат в буфер точки
; Вывод символа
add a,#tim ; Вычисляем адрес в буфере
mov r0,a
mov a,@r0 ; Чтение кода символа из буфера
call prind ; вывод на индикатор
inc nomR ; Увеличение номера текущего разряда
mov a,nomR
cjne a,#4,dn3 ; Это последний разряд?
mov nomR,#0 ; Если да, то перейти на первый
dn3:
;---------- Делитель на 200
jb flag, dnif
inc timdop
mov a,timdop
cjne a,freq,dniF
mov timdop,#0
;---------- секунд
inc timsec
mov a,timsec
cjne a,ksec,dniF
mov timsec,#0
;---------- Счет основного таймера
inc tim+3 ; Единицы минут
mov a,tim+3
cjne a,#10d,dniF
mov tim+3,#0
inc tim+2 ; Десятки минут
mov a,tim+2
cjne a,kmin,dniF
mov tim+2,#0
inc tim+1 ; Единицы часов
mov a,tim+1
cjne a,k4,dn4
mov a,tim
cjne a,k2,dniF
mov tim,#0
mov tim+1,#0
jmp dniF
dn4: cjne a,#10,dniF
mov tim+1,#0
inc tim ; Десятки часов
;---------- Завершающие команды
dniF: pop PSW
pop ACC
reti
;###########################################
;## процедура вывода числа на дисплей ##
;###########################################
prind: push psw ; Сохранение регистра PSW в стеке
push DPH ; Сохранение регистра DPTR в стеке (старш.)
push DPL ; (младш. Половина)
mov DPTR,#zg ; Загрузка начала таблицы знакогенератора
movc a,@a+DPTR ; Считывание кода цифры в аккумулятор
mov c,bufT ; Считывание буфера точки
mov acc.7,c ; Запись значения тоски в старший разряд
mov p1,a ; Вывод полученного кода в порт P1
pop DPL ; Восстановление регистра DPTR (младш.)
pop DPH ; (старш. Половина)
pop psw ; Восстановление регистра psw
ret ; Выход из подпрограммы
;----------
; таблица соответствия чисел коду, который надо подавать на индикатор
;----------
ORG 0700H ; поближе к концу
;----------
zg: DB 11000000B ; число 0
DB 11111001B ; число 1
DB 10100100B ; число 2
DB 10110000B ; число 3
DB 10011001B ; число 4
DB 10010010B ; число 5
DB 10000010B ; число 6
DB 11111000B ; число 7
DB 10000000B ; число 8
DB 10010000B ; число 9
end

Теперь всё ясно.
Код: Выделить всё
.macro set_bit
SET
BLD @0,@1
.endmacro
.macro clear_bit
CLT
BLD @0,@1
.endmacro
.macro go_if_set
BST @0,@1
BRTS @2
.endmacro
.macro go_if_clear
BST @0,@1
BRTC @2
.endmacro
Я уж тут велосипед стал изобретать, с масками и сравнениями ploop, а у меня как раз этих команд в справочнике почему то не былоЯ уж тут велосипед стал изобретать, с масками и сравнениями
![]()
Проще забыть про использование флага T и пользоваться макросами.
Да нет, для ATmega8 они прекрасно есть. Интересно, что SBR совпадает с ANDI, а CBR имеет такой же код, но константа инвертируется компилятором, ведь обнуляются биты, соответствующие единицам константы.ploop писал(а):А, возможно их добавили для новых версий AVR - 48-88-168. Я говорю же, то их код совпадает, что и операций ANDI и ORI