Давайте разберем оба варианта. Ваш скан код и мой. Берем матрицу 8x8. 64 кнопы, 64 бита в вашем случае, 2 байта в моем случае. Формируем таблицу скан-код ASCII. В вашем случае 8 байтов на каждую кнопу+ASCII. В моем случае 2 байта на каждую кнопу+1 байт код кнопы. Код тоже понятен.
LDIX SCAN_COD_BUF
LDIZ TABLE_SCAN_COD
set
SHIFTLWZ
Cycle:
ld r16,X+
lpm r17,Z+
cp r16,r17
ld r16,X+
lpm r17,Z+
cpc r16,r17
ld r16,X+
lpm r17,Z+
cpc r16,r17
ld r16,X+
lpm r17,Z+
cpc r16,r17
ld r16,X+
lpm r17,Z+
cpс r16,r17
ld r16,X+
lpm r17,Z+
cpc r16,r17
ld r16,X+
lpm r17,Z+
cpc r16,r17
ld r16,X+
lpm r17,Z+
cpc r16,r17
breq SCAN_TABLE_EQUAL
lpm r17,Z+
rjmp Cycle
SCAN_TABLE_EQUAL:
lpm r16,Z
sts KEYS_COD,r16
clt
ret
TABLE_SCAN_COD:
64 бита+байт код кнопы
и так на каждую кнопу.
И то как компилятор си код выплюнет.
В моем же случае все очевидно. Как минимум в 4 раза меньший код.
ld r16,X+
lpm r17,Z+
cpc r16,r17
ld r16,X+
lpm r17,Z+
cpc r16,r17
breq SCAN_TABLE_EQUAL
С таблицей и того проще:
#if (SELECT_SIZE_SCAN_COD==SCAN_BYTES_1)
#define FUNC(x) (x)
#elif (SELECT_SIZE_SCAN_COD==SCAN_BYTES_2)
#define FUNC(x) Low(x),High(x)
#endif
Table_Keys_Cod:
.db FUNC(Scan_Cod_Enter), Enter_Cod
.db FUNC(Scan_Cod_Esc), Esc_Cod
.db FUNC(Scan_Cod_Plus), Plus_Cod
.db FUNC(Scan_Cod_Minus), Minus_Cod
.db 0xFF,0xFF
Это на 4 кнопы.
.equ Scan_Cod_Enter = 0x0E
.equ Scan_Cod_Esc = 0x0D
.equ Scan_Cod_Plus = 0x0B
.equ Scan_Cod_Minus = 0x07
; .equ Shift_Enter = 0x
; .equ Shift_Esc = 0x
; .equ Shift_Plus = 0x
; .equ Shift_Minus = 0x
;==============================================================================
.equ Keys_Cod_Size = 4
.equ Enter_Cod = 0
.equ Esc_Cod = 1
.equ Plus_Cod = 2
.equ Minus_Cod = 3
;==============================================================================