Код:
.ORG 0X01
; ; 4 такта на переход в прерывание
IN ZL,PINB ; 1 READ HIGH BYTE OF PORT ADDRESS 5
IN TMPSR,SREG ; 1 SAVE STATUS REGISTER 6
; MOV TMPI,ZL ; 1 COPY SCAN CODE TO TMPI 7
; Нет необходимости вводить переменную TMPI
ANDI ZL,0B00111111 ; 2 PREPARING 8
; ADD ZL,CONST5F ; 2 INTERNAL RAM 9
; ADC ZH,ZERO ; 2 ADDRESS 10
; Поскольку ZL после маскировки старших битов < 64,
; то переноса быть не может, только ZH надо всегда иметь = 0
; Лучше написать так:
SUBI ZL,-0x60 ; Буфер скан-кодов с адреса 0x60
LD BUFI,Z ; 3 LOAD CURRENT PORT DATA 12
; SBRC TMPI,7 ; 4 *
SBIS PINB,7
AND BUFI,COLOMN7 ; 4 DATA * 14
; SBRC TMPI,6 ; 4 CORRECTION -
SBIS PINB,6
AND BUFI,COLOMN6 ; 4 - 16
OUT PORTD,BUFI ; 5 OUT CURRENT 17 ;10
OUT DDRD,CONSTFF ; 5 PORT DATA 18 ;11
; Сейчас на шине данных выставлен байт данных от порта клавиатуры
NOP ; 5 NOP1 19 ;12
; Надо бы подсчитать время, что бы быть уверенным, что цикл
; чтения порта клавиатуры уже закончен
OUT PORTD,ZERO ; 6 RETURN PORTD DATA 20 ;13
; Порт данных переведен в режим чтения
; Не слишком ли короткий получается период выдачи данных
; порта клавиатуры?
; 2 такта при 42 МГц это порядка 48 нсек :)
OUT DDRD,DIRD ; 6 AND MAIN DIRECTION PORTD 21 ;14
; CLR ZH ; 7 RESET ZH 22
; Обнулить ZH надо при инициализации программы
OUT SREG,TMPSR ; 7 RETURN STATUS 23
RETI ; 8 RETURN 24