ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
29 июня
219965 Топик полностью
mazur (05.11.2010 02:53 - 02:58, просмотров: 177) ответил mazur на Я достаточно много времени потратил на эту тему. Не только на сахаре задавал вопросы. Например на ирк-канале #ru_embedded. Так там один рассказывал мне что на КАЖДУЮ кнопу вешать таймер. А если их 100?! это по минимуму 200 байт SRAM. На хрена
Давайте разберем оба варианта. Ваш скан код и мой. Берем матрицу 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 ;==============================================================================