Загрузить архив: | |
Файл: ref-12714.zip (443kb [zip], Скачиваний: 361) скачать |
Суммирование без переноса
Rd = Rd + Rr
Z,C,N,V,H,S
1
ADC
Суммирование с переносом
Rd = Rd + Rr + C
Z,C,N,V,H,S
1
SUB
Вычитание без переноса
Rd = Rd - Rr
Z,C,N,V,H,S
1
SUBI
Вычитание константы
Rd = Rd - K8
Z,C,N,V,H,S
1
SBC
Вычитание с переносом
Rd = Rd - Rr - C
Z,C,N,V,H,S
1
SBCI
Вычитание константы с переносом
Rd = Rd - K8 - C
Z,C,N,V,H,S
1
AND
Логическое И
Rd = Rd · Rr
Z,N,V,S
1
ANDI
Логическое И с константой
Rd = Rd · K8
Z,N,V,S
1
OR
Логическое ИЛИ
Rd = Rd V Rr
Z,N,V,S
1
ORI
Логическое ИЛИ с константой
Rd = Rd V K8
Z,N,V,S
1
EOR
Логическое исключающее ИЛИ
Rd = Rd EOR Rr
Z,N,V,S
1
COM
Побитная Инверсия
Rd = $FF - Rd
Z,C,N,V,S
1
NEG
Изменение знака (Доп. код)
Rd = $00 - Rd
Z,C,N,V,H,S
1
SBR
Установить бит (биты) в регистре
Rd = Rd V K8
Z,C,N,V,S
1
CBR
Сбросить бит (биты) в регистре
Rd = Rd · ($FF - K8)
Z,C,N,V,S
1
INC
Инкрементировать значение регистра
Rd = Rd + 1
Z,N,V,S
1
DEC
Декрементировать значение регистра
Rd = Rd -1
Z,N,V,S
1
TST
Проверка на ноль либо отрицательность
Rd = Rd · Rd
Z,C,N,V,S
1
CLR
Очистить регистр
Rd = 0
Z,C,N,V,S
1
SER
Установить регистр
Rd = $FF
None
1
ADIW
Сложить константу и слово
Rdh:Rdl = Rdh:Rdl + K6
Z,C,N,V,S
2
SBIW
Вычесть константу из слова
Rdh:Rdl = Rdh:Rdl - K6
Z,C,N,V,S
2
MUL
Умножение чисел без знака
R1:R0 = Rd * Rr
Z,C
2
MULS
Умножение чисел со знаком
R1:R0 = Rd * Rr
Z,C
2
MULSU
Умножение числа со знаком с числом без знака
R1:R0 = Rd * Rr
Z,C
2
FMUL
Умножение дробных чисел без знака
R1:R0 = (Rd * Rr) << 1
Z,C
2
FMULS
Умножение дробных чисел со знаком
R1:R0 = (Rd *Rr) << 1
Z,C
2
FMULSU
Умножение дробного числа со знаком с числом без знака
R1:R0 = (Rd * Rr) << 1
Z,C
2
Относительный переход
PC = PC + k +1
None
2
IJMP
Нет
Косвенный переход на (Z)
PC = Z
None
2
EIJMP
Нет
Расширенный косвенный переход на (Z)
STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND
None
2
JMP
Переход
PC = k
None
3
RCALL
Относительный вызов подпрограммы
STACK = PC+1, PC = PC+k+1
None
3/4*
ICALL
Нет
Косвенный вызов (Z)
STACK = PC+1, PC = Z
None
3/4*
EICALL
Нет
Расширенный косвенный вызов (Z)
STACK = PC+1, PC(15:0) = Z, PC(21:16) =EIND
None
4*
CALL
Вызов подпрограммы
STACK = PC+2, PC = k
None
4/5*
RET
Нет
Возврат из подпрограммы
PC = STACK
None
4/5*
RETI
Нет
Возврат из прерывания
PC = STACK
I
4/5*
CPSE
Сравнить, пропустить если равны
if (Rd ==Rr) PC = PC 2 or 3
None
1/2/3
CP
Сравнить
Rd -Rr
Z,C,N,V,H,S
1
CPC
Сравнить с переносом
Rd - Rr - C
Z,C,N,V,H,S
1
CPI
Сравнить с константой
Rd - K
Z,C,N,V,H,S
1
SBRC
Пропустить если бит в регистре очищен
if(Rr(b)==0) PC = PC+2 or 3
None
1/2/3
SBRS
Пропустить если бит в регистре установлен
if(Rr(b)==1) PC = PC+2 or 3
None
1/2/3
SBIC
Пропустить если бит в порту очищен
if(I/O(P,b)==0) PC = PC+ or 3
None
1/2/3
SBIS
Пропустить если бит в порту установлен
if(I/O(P,b)==1) PC = PC+2 or 3
None
1/2/3
BRBC
Перейти если флаг в SREG очищен
if(SREG(s)==0) PC = PC+k+1
None
1/2
BRBS
Перейти если флаг в SREG установлен
if(SREG(s)==1) PC = PC+k+1
None
1/2
BREQ
Перейти если равно
if(Z==1) PC = PC + k + 1
None
1/2
BRNE
Перейти если не равно
if(Z==0) PC = PC + k + 1
None
1/2
BRCS
Перейти если перенос установлен
if(C==1) PC = PC + k + 1
None
1/2
BRCC
Перейти если перенос очищен
if(C==0) PC = PC + k + 1
None
1/2
BRSH
Перейти если равно или больше
if(C==0) PC = PC + k + 1
None
1/2
BRLO
Перейти если меньше
if(C==1) PC = PC + k + 1
None
1/2
BRMI
Перейти если минус
if(N==1) PC = PC + k + 1
None
1/2
BRPL
Перейти если плюс
if(N==0) PC = PC + k + 1
None
1/2
BRGE
Перейти если больше или равно (со знаком)
if(S==0) PC = PC + k + 1
None
1/2
BRLT
Перейти если меньше (со знаком)
if(S==1) PC = PC + k + 1
None
1/2
BRHS
Перейти если флаг внутреннего переноса установлен
if(H==1) PC = PC + k + 1
None
1/2
BRHC
Перейти если флаг внутреннего переноса очищен
if(H==0) PC = PC + k + 1
None
1/2
BRTS
Перейти если флаг T установлен
if(T==1) PC = PC + k + 1
None
1/2
BRTC
Перейти если флаг T очищен
if(T==0) PC = PC + k + 1
None
1/2
BRVS
Перейти если флаг переполнения установлен
if(V==1) PC = PC + k + 1
None
1/2
BRVC
Перейти если флаг переполнения очищен
if(V==0) PC = PC + k + 1
None
1/2
BRIE
Перейти если прерывания разрешены
if(I==1) PC = PC + k + 1
None
1/2
BRID
Перейти если прерывания запрещены
if(I==0) PC = PC + k + 1
None
1/2
* Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций CALL, ICALL, EICALL, RCALL, RET и RETI, необходимо добавить три цикла плюс по два цикла для каждого ожидания в контроллерах с PC меньшим 16 бит (128KB памяти программ). Для устройств с памятью программ свыше 128KB , добавьте пять циклов плюс по три цикла на каждое ожидание.
Скопировать регистр
Rd = Rr
None
1
MOVW
Скопировать пару регистров
Rd+1:Rd = Rr+1:Rr, r,d even
None
1
LDI
Загрузить константу
Rd = K
None
1
LDS
Прямая загрузка
Rd = (k)
None
2*
LD
Косвенная загрузка
Rd = (X)
None
2*
LD
Косвенная загрузка с пост-инкрементом
Rd = (X), X=X+1
None
2*
LD
Косвенная загрузка с пре-декрементом
X=X-1, Rd = (X)
None
2*
LD
Косвенная загрузка
Rd = (Y)
None
2*
LD
Косвенная загрузка с пост-инкрементом
Rd = (Y), Y=Y+1
None
2*
LD
Косвенная загрузка с пре-декрементом
Y=Y-1, Rd = (Y)
None
2*
LDD
Косвенная загрузка с замещением
Rd = (Y+q)
None
2*
LD
Косвенная загрузка
Rd = (Z)
None
2*
LD
Косвенная загрузка с пост-инкрементом
Rd = (Z), Z=Z+1
None
2*
LD
Косвенная загрузка с пре-декрементом
Z=Z-1, Rd = (Z)
None
2*
LDD
Косвенная загрузка с замещением
Rd = (Z+q)
None
2*
STS
k,Rr
Прямое сохранение
(k) = Rr
None
2*
ST
Косвенное сохранение
(X) = Rr
None
2*
ST
Косвенное сохранение с пост-инкрементом
(X) = Rr, X=X+1
None
2*
ST
Косвенное сохранение с пре-декрементом
X=X-1, (X)=Rr
None
2*
ST
Косвенное сохранение
(Y) = Rr
None
2*
ST
Косвенное сохранение с пост-инкрементом
(Y) = Rr, Y=Y+1
None
2
ST
Косвенное сохранение с пре-декрементом
Y=Y-1, (Y) = Rr
None
2
ST
Косвенное сохранение с замещением
(Y+q) = Rr
None
2
ST
Косвенное сохранение
(Z) = Rr
None
2
ST
Косвенное сохранение с пост-инкрементом
(Z) = Rr, Z=Z+1
None
2
ST
Косвенное сохранение с пре-декрементом
Z=Z-1, (Z) = Rr
None
2
ST
Косвенное сохранение с замещением
(Z+q) = Rr
None
2
LPM
Нет
Загрузка из программной памяти
R0 = (Z)
None
3
LPM
Загрузка из программной памяти
Rd = (Z)
None
3
LPM
Загрузка из программной памяти с пост-инкрементом
Rd = (Z), Z=Z+1
None
3
ELPM
Нет
Расширенная загрузка из программной памяти
R0 = (RAMPZ:Z)
None
3
ELPM
Расширенная загрузка из программной памяти
Rd = (RAMPZ:Z)
None
3
ELPM
Расширенная загрузка из программной памяти с пост-инкрементом
Rd = (RAMPZ:Z), Z = Z+1
None
3
SPM
Нет
Сохранение в программной памяти
(Z) = R1:R0
None
-
ESPM
Нет
Расширенное сохранение в программной памяти
(RAMPZ:Z) = R1:R0
None
-
IN
Чтение порта
Rd = P
None
1
OUT
Запись в порт
P = Rr
None
1
PUSH
Занесение регистра в стек
STACK = Rr
None
2
POP
Извлечение регистра из стека
Rd = STACK
None
2
* Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций LD, ST, LDD, STD, LDS, STS, PUSH и POP, необходимо добавить один цикл плюс по одному циклу для каждого ожидания.
Логический сдвиг влево
Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7)
Z,C,N,V,H,S
1
LSR
Логический сдвиг вправо
Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0)
Z,C,N,V,S
1
ROL
Циклический сдвиг влево через C
Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7)
Z,C,N,V,H,S
1
ROR
Циклический сдвиг вправо через C
Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0)
Z,C,N,V,S
1
ASR
Арифметический сдвиг вправо
Rd(n)=Rd(n+1), n=0,...,6
Z,C,N,V,S
1
SWAP
Перестановка тетрад
Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0)
None
1
BSET
Установка флага
SREG(s) = 1
SREG(s)
1
BCLR
Очистка флага
SREG(s) = 0
SREG(s)
1
SBI
Установить бит в порту
I/O(P,b) = 1
None
2
CBI
Очистить бит в порту
I/O(P,b) = 0
None
2
BST
Сохранить бит из регистра в T
T = Rr(b)
T
1
BLD
Загрузить бит из T в регистр
Rd(b) = T
None
1
SEC
Нет
Установить флаг переноса
C =1
C
1
CLC
Нет
Очистить флаг переноса
C = 0
C
1
SEN
Нет
Установить флаг отрицательного числа
N = 1
N
1
CLN
Нет
Очистить флаг отрицательного числа
N = 0
N
1
SEZ
Нет
Установить флаг нуля
Z = 1
Z
1
CLZ
Нет
Очистить флаг нуля
Z = 0
Z
1
SEI
Нет
Установить флаг прерываний
I = 1
I
1
CLI
Нет
Очистить флаг прерываний
I = 0
I
1
SES
Нет
Установить флаг числа со знаком
S = 1
S
1
CLN
Нет
Очистить флаг числа со знаком
S = 0
S
1
SEV
Нет
Установить флаг переполнения
V = 1
V
1
CLV
Нет
Очистить флаг переполнения
V = 0
V
1
SET
Нет
Установить флаг T
T = 1
T
1
CLT
Нет
Очистить флаг T
T = 0
T
1
SEH
Нет
Установить флаг внутреннего переноса
H = 1
H
1
CLH
Нет
Очистить флаг внутреннего переноса
H = 0
H
1
NOP
Нет
Нет операции
Нет
None
1
SLEEP
Нет
Спать (уменьшить энергопотребление)
Смотрите описание инструкции
None
1
WDR
Нет
Сброс сторожевого таймера
Смотрите описание инструкции
None
1
Ассемблер не различает регистр символов. Операнды могут быть таких видов:
§ Rdl: R24, R26, R28, R30. Для инструкций ADIW и SBIW
§
Адрес |
Название |
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
$3F |
SREG |
I |
T |
H |
S |
V |
N |
Z |
C |
$3E |
з а р е з е р в и р о в а н |
||||||||
$3D |
з а р е з е р в и р о в а н |
||||||||
$3C |
з а р е з е р в и р о в а н |
||||||||
$3B |
GIMSK |
- |
INT0 |
- |
- |
- |
- |
- |
- |
$3A |
з а р е з е р в и р о в а н |
||||||||
$39 |
TIMSK |
- |
- |
- |
- |
- |
- |
TOIE0 |
- |
$38 |
TIFR |
- |
- |
- |
- |
- |
- |
TOV0 |
- |
$37 |
з а р е з е р в и р о в а н |
||||||||
$36 |
з а р е з е р в и р о в а н |
||||||||
$35 |
MCUCR |
- |
- |
SE |
SM |
- |
- |
ISC01 |
ISC00 |
$34 |
з а р е з е р в и р о в а н |
||||||||
$33 |
TCCR0 |
- |
- |
- |
- |
- |
CS02 |
CS01 |
CS00 |
$32 |
TCNT0 |
Таймер / счетчик 0 (8 бит) |
|||||||
… |
з а р е з е р в и р о в а н |
||||||||
$21 |
WDTCR |
- |
- |
- |
- |
WDE |
WDP2 |
WDP1 |
WDP0 |
… |
з а р е з е р в и р о в а н |
||||||||
$1E |
EEAR |
Регистр адреса энергонезависимой памяти |
|||||||
$1D |
EEDR |
Регистр данных энергонезависимой памяти |
|||||||
$1C |
EECR |
- |
- |
- |
- |
- |
- |
EEWE |
EERE |
… |
з а р е з е р в и р о в а н |
||||||||
$18 |
PORTB |
PORTB7 |
PORTB6 |
PORTB5 |
PORTB4 |
PORTB3 |
PORTB2 |
PORTB1 |
PORTB0 |
$17 |
DDRB |
DDB7 |
DDB6 |
DDB5 |
DDB4 |
DDB3 |
DDB2 |
DDB1 |
DDB0 |
$16 |
PINB |
PINB7 |
PINB6 |
PINB5 |
PINB4 |
PINB3 |
PINB2 |
PINB1 |
PINB0 |
… |
з а р е з е р в и р о в а н |
||||||||
$12 |
PORTD |
- |
PORTD6 |
PORTD5 |
PORTD4 |
PORTD3 |
PORTD2 |
PORTD1 |
PORTD0 |
$11 |
DDRD |
- |
DDD6 |
DDD5 |
DDD4 |
DDD3 |
DDD2 |
DDD1 |
DDD0 |
$10 |
PIND |
- |
PIND6 |
PIND5 |
PIND4 |
PIND3 |
PIND2 |
PIND1 |
PIND0 |
… |
з а р е з е р в и р о в а н |
||||||||
$08 |
ACSR |
ACD |
- |
ACO |
ACI |
ACIE |
- |
ACIS1 |
ACIS0 |
… |
з а р е з е р в и р о в а н |
||||||||
$00 |
з а р е з е р в и р о в а н |
.include "8515def.inc"
.equ last_seg =4
.equ zero =0
.equ start_addr= 8
.def capture_l =r2
.def capture_h =r3
.def char =r5
.def char_pointer =r6
.def temp =r16
.def temp1 =r17
.def ZerRol =r18
.def char0 =r20
.def char1 =r21
.def char2 =r22
.def char3 =r23
.def char4 =r24
.def out_char0 =r8
.def out_char1 =r9
.def out_char2 =r10
.def out_char3 =r11
.def out_char4 =r12
.def out_counter =r13
.eseg ;EEPROM segment
.org 0
eetbl3:.db 0x3F,0x06
; ;0 1
.db 0x5B,0x4F
; ;2 3
.db 0x66,0x6D
; ;4 5
.db 0x7D,0x07
; ;6 7
.db 0x7F,0x6F
; ;8 9
.cseg
.org 0
rjmp reset
reti ;
reti ;
rjmp TIM1_CAPT
.org $006
rjmp TIM1_OVF
rjmp TIM0_OVF
;***********************************
;* Main Code
reset: ; Make Stack:
ldi temp, high(RAMEND)
out SPH, temp
ldi temp, low(RAMEND)
out SPL, temp
ldi temp, 0xC3 ;
out TCCR1B, temp ;
ldi temp, 0x8A ;
out TIMSK, temp
ldi temp, 0x3 ;
out TCCR0, temp
sei
ldi temp, zero
mov char_pointer, temp
ldi temp, 0xFF
out DDRA, temp
out DDRC, temp
ldi char0, 8
ldi char1, 8
ldi char2, 8
ldi char3, 8
ldi char4, 8
ldi ZH, 0
ldi ZL, start_addr
ldi ZerRol,0xFE
clt
clr out_counter
forever:
brtc forever
clt
mov dv16uL, capture_l ;tmp16a
mov dv16uH, capture_h ;tmp16b
ldi dd16uL, low(62500)
ldi dd16uH, high(62500)
; пробразование в Гц:
rcall div16u
; преобразование в десятичные цифры
ldi tmp16a, low(10000)
ldi tmp16b, high(10000)
rcall bin2ASCII_digit
mov tASCII4, cnt16a
ldi tmp16a, low(1000)
ldi tmp16b, high(1000)
rcall bin2ASCII_digit
mov tASCII3, cnt16a
ldi tmp16a, low(100)
ldi tmp16b, high(100)
rcall bin2ASCII_digit
mov tASCII2, cnt16a
ldi tmp16a, low(10)
ldi tmp16b, high(10)
rcall bin2ASCII_digit
rjmp forever
;* End Main Code
;************************************
;************************************
;* bin2ASCII_digit
.def fASCIIL =r24;r11
.def fASCIIH =r19;r12
.def tASCII0 =r24;r11
.def tASCII1 =r23;r16
.def tASCII2 =r22;r13
.def tASCII3 =r21;r14
.def tASCII4 =r20;r15
.def cnt16a =r23;r16
.def tmp16a =r16;r17
.def tmp16b =r17;r18
bin2ASCII_digit:
ldi cnt16a, -1
bin2ASCII_digit_loop:
inc cnt16a
sub fASCIIL, tmp16a
sbc fASCIIH, tmp16b
brsh bin2ASCII_digit_loop
add fASCIIL, tmp16a
adc fASCIIH, tmp16b
ret
;* End bin2ASCII_digit
;***********************************
;***********************************
;*div16u 16/16 Bit Unsigned Division ;* dd8uH:dd8uL / dv16uH:dv16uL =
;*dres16uH:dres16uL drem16uH:drem16uL
.def drem16uL =r14
.def drem16uH =r15
.def dres16uL =r24;=r16
.def dres16uH =r19;=r17
.def dd16uL =r24;=r16
.def dd16uH =r19;=r17
.def dv16uL =r27;=r18
.def dv16uH =r25;=r19
.def dcnt16u =r26;=r20
div16u: ;clear remainder Low byte:
clr drem16uL
;clear remainder High byte and carry:
sub drem16uH,drem16uH
;init loop counter:
ldi dcnt16u,17
d16u_1: ;shift left dividend:
rol dd16uL
rol dd16uH
;decrement counter:
dec dcnt16u
brne d16u_2 ;if done
ret ; return
d16u_2: ;shift dividend into
; remainder
rol drem16uL
rol drem16uH
;remainder = remainder - divisor
sub drem16uL,dv16uL sbc drem16uH,dv16uH ;
brcc d16u_3 ;if result
;negative restore remainder
add drem16uL,dv16uL
adc drem16uH,dv16uH
clc
;clear carry to be shifted into ;result
rjmp d16u_1 ;else
d16u_3: sec ;set carry to be
;shifted into result
rjmp d16u_1
;* End div16u
;************************************
;************************************;* Timer1 Capture Handler
TIM1_CAPT: in temp1, SREG
;in capture_l, ICR1L
;in capture_h, ICR1H
in capture_l, TCNT1L
in capture_h, TCNT1H
ldi temp, 0
out TCNT1H, temp
out TCNT1L, temp
ldi temp, 0xC3
out TCCR1B, temp
out SREG, temp1
set
reti
;* End Timer1 Capture Handler
;************************************
;************************************
;* Timer1 OverFlow Handler
TIM1_OVF: in temp1, SREG
ldi char0, 0
ldi char1, 0
ldi char2, 0
ldi char3, 0
ldi char4, 0
ldi temp, 0xC0
out TCCR1B, temp
ldi temp, 0
out TCNT1H, temp
out TCNT1L, temp
out SREG, temp1
reti
;* End Timer1 OverFlow Handler
;************************************
;************************************
;* Timer0 OverFlow Handler
TIM0_OVF: in temp1, SREG
tst out_counter
breq get_char
rjmp show_char
get_char: mov out_char0, char0
mov out_char1, char1
mov out_char2, char2
mov out_char3, char3
mov out_char4, char4
rjmp continue
show_char: ld char_pointer, Z+
ldi temp, eetbl3
add char_pointer, temp
out EEARL, char_pointer
;address EEPROM
ldi temp, 0
out EEARH, temp;address EEPROM
sbi EECR, EERE ;strobe EEPROM
in char, EEDR ;read code
out PORTA, ZerRol
out PORTC, char
sbrc ZerRol, last_seg;brcs carry
rjmp move_ZerRol
New_loop: ldi ZH, 0
ldi ZL, start_addr
ldi ZerRol,0xFE ;rol ZerRol
rjmp continue
move_ZerRol: sec
rol ZerRol
continue: inc out_counter
out SREG, temp1
reti
;* End Timer0 OverFlow Handler
;************************************
.include "1200def.inc"
;Port B pins
.equ ROW1 =3
.equ ROW2 =2
.equ ROW3 =1
.equ ROW4 =0
.equ COL1 =7
.equ COL2 =6
.equ COL3 =5
.equ COL4 =4
;Port D pins
.equ GREEN =1;green LED indicate
;keynumber
.equ RED =0;red LED
;initialization & zero keynumber
.equ INT =2 ;interrupt input
.equ max_count =21
.equ reset_btn =4
.equ psw_length =2
.def temp =r16 ;
.def key =r17 ;key code pointer
;for EEPROM
.def fine =r18 ;loop delay
;counters
.def medium =r19
.def coarse =r20
.def status =r21 ;preserve
;sreg here
.def rowid =r22
.def colid =r23
.def counter =r24
.def key_pr_count =r25
.eseg ;EEPROM segment
.org 0
eetbl1: .db 4,3,2,1,8,7 ,6,5,12,11,10,9,16,15,14,13
eetbl2: .db 3,1,2,4
.cseg ;CODE segment
.org 0
rjmp reset ;Reset handler
nop
nop ;unused timer interrupt
nop ;unused analogue
;interrupt
reset:
ldi temp,0x03 ;initialise port D as O/I
out DDRD,temp ;
out PORTD,temp ;
sbi ACSR,ACD ;shut down
;comparator to save power
cli ;disable global
;interrupts
ldi key_pr_count, 0
set ;T=1 - true password ;(default);T=0 - false password
ldi temp,2
rjmp red_flash ;flash LEDs
;for example usage
init_scan: clr counter
scan: ldi temp,0xff
out DDRB,temp
ldi temp, 0x0f
out PORTB, temp
ldi rowid,0xAA
;0xAA - значение по умолчанию
;кнопка не нежата
sbis PINB,ROW1 ;find row of
;keypress
ldi rowid,0 ;and set ROW pointer
sbis PINB,ROW2
ldi rowid,4
sbis PINB,ROW3
ldi rowid,8
sbis PINB,ROW4
ldi rowid,12
cpi rowid, 0xAA
breq init_scan ;Branch if equal //counter=0
inc counter
cpi counter, max_count;
brlo scan ;Branch if not
;equal
ldi temp,0xF0 ;change port B I/O to find column press
out PORTB,temp ;
rcall settle ;allow time for
;port to settle
ldi colid, 0xAA
;0xAA - значение по умолчанию кнопка не нежата
sbis PINB,COL1
;find column of keypress
ldi colid,0
;and set COL pointer
sbis PINB,COL2
ldi colid,1
sbis PINB,COL3
ldi colid,2
sbis PINB,COL4
ldi colid,3
cpi colid, 0xAA
breq init_scan
;Branch if equal //counter=0
add rowid,colid
;merge ROW and COL for pointer
mov key, rowid
rjmp clr_counter
misc_rst: rjmp reset
clr_counter: clr counter
ldi temp, 0xAA
key_up_wait: sbis PINB,COL1 ;;ожидание поднятия клавиши
ldi temp, 0xCC
;если бит=0 то temp=cc
sbis PINB,COL2
ldi temp, 0xCC
sbis PINB,COL3
ldi temp, 0xCC
sbis PINB,COL4
ldi temp, 0xCC
cpi temp, 0xCC
breq clr_counter
inc counter
cpi counter, max_count ;
brlo key_up_wait
;Branch if not equal
ldi temp,0x00 ;reinitialise port B as I/O
out DDRB,temp ;
out PORTB,temp ;
flash: ldi temp, eetbl1
add key, temp
out EEAR, key;address EEPROM
sbi EECR, EERE;strobe EEPROM
in key, EEDR
;read code of pressed button
cpi key, reset_btn
;if key pressed = reset button
breq misc_rst
;then goto reset
ldi temp, eetbl2
add temp, key_pr_count
out EEAR, temp
sbi EECR, EERE
in temp, EEDR
;read password code
inc key_pr_count
cp key, temp
;if pressed wrong key
brne not_equal
;then goto not equal
equal: rjmp continue
not_equal: clt
;T=0 - false password
continue: cpi key_pr_count, psw_length;if kpc > psw length
brge kpr_exceed
;then goto kpr_exceed
not_kpr_exceed: rjmp init_scan
kpr_exceed: brts psw_true
;if T=1 then password is true
ldi key_pr_count, psw_length
;else (T=0 password is false)
rjmp init_scan
psw_true: ldi temp, 3
green_flash:
cbi PORTD,GREEN ; rcall delay
sbi PORTD,GREEN
rcall delay
dec temp
brne green_flash
exit: rjmp reset ;scan ;ret
red_flash: sbi PORTD,RED
rcall delay
cbi PORTD,RED
rcall delay
dec temp
brne red_flash
rjmp init_scan
;****Time Delay Subroutine for ;****LED flash****
delay: ldi coarse,3;8 ;triple nested FOR loop
cagain: ldi medium,255 ;
magain: ldi fine,255 ;
fagain: dec fine
brne fagain
dec medium
brne magain
dec coarse
brne cagain
ret
;***Settling time delay for port ;***to stabilise****
settle:
cagain2: ldi medium,2 ;
magain2: ldi fine,255 ;
fagain2: dec fine
brne fagain2
dec medium
brne magain2
ret
AT90S |
1200 |
2313 |
4414 |
8515 |
2323 |
4433 |
Диапазон напряжений питания, В |
2,7 - 6,0 |
|||||
Тактовая частота, МГц *) |
0 - 16 |
0 - 20 |
0 - 16 |
0 - 20 |
||
Количество линий ввода/вывода (max) |
15 |
32 |
5 |
18 |
||
Количество инструкций |
89 |
120 |
||||
Объем Flash ROM, байт |
1K |
2K |
4K |
8K |
2K |
4K |
Объем EEPROM, байт |
64 |
128 |
256 |
512 |
128 |
256 |
Объем внутренней SRAM, байт |
- |
128 |
256 |
512 |
128 |
128 |
Объем внешней SRAM, байт (max) |
- |
- |
64K |
64K |
- |
- |
Объем регистрового файла, байт |
32 |
|||||
Количество таймеров/счетчиков |
1 |
2 |
2 |
2 |
1 |
2 |
ШИМ: Число каналов/разрядность |
- |
1/8-10 |
2/8-10 |
2/8-10 |
- |
2/8-10 |
Количество модулей захвата/сравнения |
- |
1 |
2 |
2 |
- |
2 |
Аналоговый компаратор |
+ |
+ |
+ |
+ |
- |
+ |
SPI (загрузка ROM и EEPROM) |
+ |
+ |
+ |
+ |
+ |
+ |
SPI интерфейс (Master/Slave port) |
- |
- |
+ |
+ |
- |
+ |
Сторожевой таймер |
+ |
+ |
+ |
+ |
+ |
+ |
Асинхронный последовательный порт |
- |
+ |
+ |
+ |
- |
+ |
Аналого - цифровой преобразователь |
- |
- |
- |
- |
- |
+ |
Количество битов защиты |
2 |
|||||
Число источников прерывания: внутренних/внешних |
2/1 |
8/2 |
10/2 |
10/2 |
2/1 |
11/2 |
Тип корпуса |
DIP20, SOIC20, SSOP20 |
DIP40, PLCC44, TQFP44 |
DIP8, SOIC8 |
DIP28, PLCC28 |