Site Loader

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для опроса ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ 4×4 ΠΈ 3Ρ…4

Написал ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для опроса ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ модуля:

— простая интСграция с Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ

— ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° всСх ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² сСмСйства mega

— Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования с Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… компиляторов CodeVision, IAR, GCC

— ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ 4Ρ…4 ΠΈ 3Ρ…4

— ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° ΠΎΠ±Ρ‰Π΅ΠΉ шинС

— Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ»ΠΈ двумя ΠΏΠΎΡ€Ρ‚Π°ΠΌΠΈ

— программная антидрСбСзговая Π·Π°Ρ‰ΠΈΡ‚Π°

— Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ установки ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ΄ΠΎΠ² ΠΊΠ½ΠΎΠΏΠΎΠΊ

— скачиваСм архив с ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ
— пСрСписываСм Ρ„Π°ΠΉΠ»Ρ‹ keyboard.h ΠΈ keyboard.c Π² ΠΏΠ°ΠΏΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

— ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ keyboard.c ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Π²Π½ΡƒΡ‚Ρ€ΠΈ срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

— Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ keyboard.h Π² Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ main.c

— настраиваСм ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π² Ρ„Π°ΠΉΠ»Π΅ keyboard.h

— прописываСм Π² свой ΠΊΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Β 

Настройка ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя нСсколько шагов.

Β 

Установка Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΠΎΠΉ частоты ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°

Β 

#define F_CPU 16000000

Β 

Β  Β ΠŸΡ€ΠΈ высокой Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΠΎΠΉ частотС ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° логичСскиС сигналы, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ, ΠΈΠ·-Π·Π° ΠΏΠ°Ρ€Π°Π·ΠΈΡ‚Π½Ρ‹Ρ… СмкостСй Β«Π½Π΅ ΡƒΡΠΏΠ΅Π²Π°ΡŽΡ‚Β» ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ уровня. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… мСстах ΠΊΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ программная Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°, для вычислСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ трСбуСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΠΎΠΉ частоты.

Установка Ρ‚ΠΈΠΏΠ° ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ – 4Ρ…4 ΠΈΠ»ΠΈ 3Ρ…4

Β 

#define KEYBOARD_4X4

Β 

Β   Если Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ установлСна ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° 3Ρ…4.Β 

Π’ΠΈΠΏ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ сообщаСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π² процСссС сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π΅ ΡƒΠ΄ΠΈΠ²Π»ΡΠΉΡ‚Π΅ΡΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΡŽ Π² ΠΎΠΊΠ½Π΅ Messages.Β 

Β 

Установка Ρ‚ΠΈΠΏΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹Β 

Β 

#define COMMON_BUS

Β 

Β   Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ±Ρ‰ΡƒΡŽ ΡˆΠΈΠ½Ρƒ, Ρ‡Ρ‚ΠΎ позволяСт ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄Ρ‹ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°. Если это ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ способом.

Β  Β Π’ этом случаС Π²Ρ‹Π²ΠΎΠ΄Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ лишь Π½Π° врСмя Π΅Π΅ опроса. А ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ опроса состояниС Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ² восстанавливаСтся. Β 

Β  Β Π—Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π² ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ нСсколько Π±Π°ΠΉΡ‚ Ρ„Π»Π΅Ρˆ памяти.

Β 

Установка Β ΠΏΠΎΡ€Ρ‚ΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ строки ΠΈ столбцы ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

Β 

//ΠΏΠΎΡ€Ρ‚, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ строки

#define PORTX_ROW PORTA

#define PINX_ROW Β PINA

#define DDRX_ROW Β DDRA

Β 

//ΠΏΠΎΡ€Ρ‚, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ столбцы

#define PORTX_COL PORTB

#define PINX_COL Β PINB

#define DDRX_COL Β DDRB

Β 

Β   ВсС строки ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ€Ρ‚Ρƒ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°. Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½Π΅ позволяСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ΄Π½Ρƒ строку ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ B, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ Π‘. Π­Ρ‚ΠΎ ΠΆΠ΅ относится ΠΈ ΠΊ столбцам ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹.Β 

Β  Β ΠŸΡ€ΠΈ этом Π³Ρ€ΡƒΠΏΠΏΠ° строк ΠΈΠ»ΠΈ столбцов ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΊΠ°ΠΊ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ, Ρ‚Π°ΠΊ ΠΈ ΠΊ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΠΎΡ€Ρ‚Π°ΠΌ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°.Β 

Β 

Установка Β Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ строки ΠΈ столбцы ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

Β 

//Π²Ρ‹Π²ΠΎΠ΄Ρ‹, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ строки 

#define PIN_ROW1 4

#define PIN_ROW2 5

#define PIN_ROW3 6

#define PIN_ROW4 7

Β 

//Π²Ρ‹Π²ΠΎΠ΄Ρ‹, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ столбцы

#define PIN_COL1 0

#define PIN_COL2 1

#define PIN_COL3 2

#define PIN_COL4 3

Β 

Β  Β Π’Ρ‹Π²ΠΎΠ΄Ρ‹ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΊ строкам ΠΈ столбцам ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ собой. Π­Ρ‚ΠΎ трСбования Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΊ Π΄Π²ΡƒΠΌ ΠΏΠΎΡ€Ρ‚Π°ΠΌ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°.

Β 

Установка ΠΊΠΎΠ΄ΠΎΠ² ΠΊΠ½ΠΎΠΏΠΎΠΊ

Β 

//ΠΊΠΎΠ΄Ρ‹ ΠΊΠ½ΠΎΠΏΠΎΠΊ

#define EVENT_NULL 0

#define EVENT_KEY0 ‘0’

#define EVENT_KEY1 ‘1’

#define EVENT_KEY2 ‘2’

#define EVENT_KEY3 ‘3’

#define EVENT_KEY4 ‘4’

#define EVENT_KEY5 ‘5’

#define EVENT_KEY6 ‘6’

#define EVENT_KEY7 ‘7’

#define EVENT_KEY8 ‘8’

#define EVENT_KEY9 ‘9’

#define EVENT_KEYA ‘A’

#define EVENT_KEYB ‘B’

#define EVENT_KEYC ‘C’

#define EVENT_KEYD ‘D’

#define EVENT_KEYZ ‘*’

#define EVENT_KEYR ‘#’

Β 

Β  Β Π—Π΄Π΅ΡΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ Π½Π΅Ρ‚. ΠšΠΎΠ΄Ρ‹ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅. МоТно Π·Π°Π΄Π°Ρ‚ΡŒ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ значСния, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, ΠΊΠ°ΠΊ это сдСлано ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. А ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² событийной систСмС.Β 

Β  Β Π’ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Ρ‚Ρ€ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Β 

void KEYB_Init(void) – функция ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

void KEYB_ScanKeyboard(void) – функция сканирования ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

unsigned char KEYB_GetKey(void) – функция ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π±ΡƒΡ„Π΅Ρ€Π°

Β 

KEYB_Init() Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ использованиСм Π΄Π²ΡƒΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это дСлаСтся Β Π² Π½Π°Ρ‡Π°Π»Π΅ main`a.

Β 

KEYB_ScanKeyboard() – это основная функция, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π°Ρ всю Ρ€Π°Π±ΠΎΡ‚Ρƒ модуля. Она Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ пСриодичСского запуска. МоТно Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π΅ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ прСрывания Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°, Π° ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π΅ ΠΈΠ· основного Ρ†ΠΈΠΊΠ»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ Π΅Π³ΠΎ сигналу. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π±ΠΎΠ»Π΅Π΅ расточитСлСн Π² ΠΏΠ»Π°Π½Π΅ рСсурсов ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°.Β 

Β 

KEYB_GetKey() – эта функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ keyboard.h. Если ΠΊΠ½ΠΎΠΏΠΎΡ‡Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ пуст – функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Β EVENT_NULL. Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‚Π°ΠΌ, Π³Π΄Π΅ собираСмся ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ наТатия ΠΊΠ½ΠΎΠΏΠΎΠΊ.Β 

Β   Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΡ€ΠΈΠ»Π°Π³Π°ΡŽ тСстовыС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ для Ρ‚Ρ€Π΅Ρ… компиляторов. ВсС ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² ΠΆΠ΅Π»Π΅Π·Π΅. Π‘Ρ…Π΅ΠΌΠ° Π½Π° рисункС Π½ΠΈΠΆΠ΅.
Для Π»ΡŽΠ±ΠΈΡ‚Π΅Π»Π΅ΠΉ симуляций — ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ для ΠŸΡ€ΠΎΡ‚Π΅ΡƒΡΠ°. Π‘Π΄Π΅Π»Π°Π½ Π½Π° ΡΠΊΠΎΡ€ΡƒΡŽ Ρ€ΡƒΠΊΡƒ, поэтому отличаСтся ΠΎΡ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ схСмы.

Β 

Π‘ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с 1-Wire устройствами

Β   Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с устройствами, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ 1-Wire ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΡƒΠΆΠ΅ Π΄Π°Π²Π½Ρ‹ΠΌ-Π΄Π°Π²Π½ΠΎ написаны Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π΅Ρ‚ смысла ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°Ρ‚ΡŒ вСлосипСд (Π»ΠΈΡ‡Π½ΠΎ я это ΡƒΠΆΠ΅ Π΄Π΅Π»Π°Π», ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π» Β Π½Π° ассСмблСрС) ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ своС. На сайтС Ρ„ΠΈΡ€ΠΌΡ‹ ATMEL Π΅ΡΡ‚ΡŒ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ application noteΒ AVR318: Dallas 1-Wire, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ рассмотрСны Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ 1-Wire ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π½Π° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ… AVR – программная ΠΈ аппаратная. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Π°Ρ рСализация позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π½Π° Π»ΡŽΠ±Ρ‹Ρ… ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ…. Аппаратная – Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ‚Π΅Ρ…, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ UART. Аппаратной ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ 1-Wire ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Β«Π² чистом Π²ΠΈΠ΄Π΅Β» ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ AVR Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ UART Π½Π΅ΠΊΠΈΠΌ Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, эту ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ. К application note ΠΈΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Π― взял ΠΈΠ· этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° исходныС Ρ„Π°ΠΉΠ»Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π΄ΠΎΠ±Π°Π²ΠΈΠ», ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ написал Ρ„Π°ΠΉΠ» compilers.h, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту Π»ΠΈΠ±Ρƒ ΡΒ Π»ΡŽΠ±Ρ‹ΠΌ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… компиляторов – IAR AVR, GNU GCC (WINAVR), CodeVision.

Β Β  Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° состоит ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ²

Β 

OWISWBitFunction.h

OWISWBitFunction.c

OWIUARTBitFunction.c

Β 

OWIHighLevelFunction.h

OWIHighLevelFunction.c

Β 

OWIPolled.h

compilers.h

Β 

OWIdefs.h

OWIdevicespecific.h

OWIcrc.h

OWIcrc.c

ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ 1-Wire Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: — пСрСписываСм Ρ„Π°ΠΉΠ»Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² ΠΏΠ°ΠΏΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

— ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΡΠΈΡˆΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ

OWIHighFunction.c

OWISWBitFunction.c

OWIUARTBitFunction.c

— добавляСм Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² main.c

#include «OWIPolled.h»

#include «OWIHighLevelFunctions.h»

#include «OWIBitFunctions.h»

#include «common_files\OWIcrc.h» — настраиваСм Ρ„Π°ΠΉΠ» OWIPolled.h

— Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ OneWire интСрфСйса – ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΡƒΡŽΒ 

Β Β  Β  Β  #define Β  Β  OWI_SOFTWARE_DRIVER Β  Β 

Β Β  Β  Β  //#define Β  Β  OWI_UART_DRIVER

— Π·Π°Π΄Π°Π΅ΠΌ Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΡƒΡŽ частоту ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°

Β Β  Β  Β  #define Β  Β  CPU_FREQUENCY Β  16.000

—Β Π·Π°Π΄Π°Π΅ΠΌ ΠΏΠΎΡ€Ρ‚, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π° OneWire шина

Β Β  Β  Β  #define Β  Β  OWI_PORT Β  Β  Β PORTD Β  //!< 1-Wire PORT Data register.

Β Β  Β  Β  #define Β  Β  OWI_PIN Β  Β  Β  Β  PIND Β  Β //!< 1-Wire Input pin register.

Β Β  Β  Β  #define Β  Β  OWI_DDR Β  Β  Β  Β DDRD Β  Β //!< 1-Wire Data direction register.

— Π² main.c Π·Π°Π΄Π°Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π° OneWire шина

Β Β  Β  Β #define BUS Β  OWI_PIN_7

Β 

Для GCC ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π² makefile Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ всС ΡΠΈΡˆΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.Β 

НапримСр, Ρ‚Π°ΠΊ:

Β 

SRC = $(TARGET).c bcd.c lcd_lib.c OWISWBitFunctions.c OWIHighLevelFunctions.c OWIUARTBitFunctions.c Β common_files/OWIcrc.c

Application note AVR318: Dallas 1-Wire

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΠ»ΠΈΡΡŒ Π² ΠΆΠ΅Π»Π΅Π·Π΅ ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π½Π°Ρ€Π΅ΠΊΠ°Π½ΠΈΠΉ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ. Π’ Proteus`Π΅ я ΠΈΡ… Ρ‚ΠΎΠΆΠ΅ запустил, Π½ΠΎ Π½Π΅ сразу. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ°ΠΌ DS18B20 ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ адрСса. ΠŸΡ€ΠΈ использовании Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ² адрСса Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ€ΡƒΡ‡ΠΊΠ°ΠΌΠΈ.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΆΠ΅ Π² Π½ΠΎΠ²ΠΎΠΌ Π³ΠΎΠ΄Ρƒ…

AVR. Π£Ρ‡Π΅Π±Π½Ρ‹ΠΉ курс. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° сканирования ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

ΠšΠΎΡ€ΠΎΡ‡Π΅, Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΠ΄Ρƒ. Π‘Ρ€Π°Π·Ρƒ ΠΎΠ³ΠΎΠ²ΠΎΡ€ΡŽΡΡŒ, Ρ‡Ρ‚ΠΎ я взял ΠΌΠΎΠ΄Ρƒ ΠΊΡ€ΠΎΡˆΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° дСсяток ΠΌΠ΅Π»ΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ², Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, это Ρ€Π΅Π·ΠΊΠΎ структурируСт ΠΊΠΎΠ΄, позволяя Π»Π΅Π³Ρ‡Π΅ Π² Π½Π΅ΠΌ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Π° Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΊΠΎΠ΄ становится ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌ ΠΈ Π΅Π³ΠΎ куски ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. Волько ΠΏΠΎΠ΄ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ‡ΡƒΡ‚ΠΎΠΊ. По этой ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ я всС опрСдСлСния дСлаю Ρ‡Π΅Ρ€Π΅Π· макросы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ вСсь ΠΊΠΎΠ΄, Π° достаточно Π±Ρ‹Π»ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ°Ρ€Ρƒ строк ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² Ρ„Π°ΠΉΠ»Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ ΠΎ Ρ„Π°ΠΉΠ»Π°Ρ…:
keyboard_define.inc β€” Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹.

Π’ этом Ρ„Π°ΠΉΠ»Π΅ хранятся всС макроопрСдСлСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ ΠΊΠ°ΠΊΠΈΠ΅ Π½ΠΎΠΆΠΊΠΈ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° ΠΊ ΠΊΠ°ΠΊΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹. Одна Ρ‚ΠΎΠ½ΠΊΠΎΡΡ‚ΡŒ β€” Π²Ρ‹Π²ΠΎΠ΄Ρ‹ Π½Π° столбцы (ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ€Ρ‚) Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ Π»ΠΈΠ½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ€Ρ‚Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΎΠΆΠΊΠΈ 0,1,2,3 ΠΈΠ»ΠΈ 4,5,6,7, ΠΈΠ»ΠΈ 3,4,5,6. НСваТно ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΡ€Ρ‚Π°, Π³Π»Π°Π²Π½ΠΎΠ΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.
Π‘ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠΆΠ΅ΠΊ, Π΄ΡƒΠΌΠ°ΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚, Π° Π²ΠΎΡ‚ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° KEYMASK я Ρ…ΠΎΡ‡Ρƒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ особо.
Π­Ρ‚ΠΎ маска ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒΡΡ сканируСмый ΠΏΠΎΡ€Ρ‚. Π’ Π½Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ 6 Π΅Π΄ΠΈΠ½ΠΈΡ† ΠΈ ΠΎΠ΄ΠΈΠ½ 0. Ноль выставляСтся Π² ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΏΡ€Π°Π²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ€Ρ‚Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Π£ мСня ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ€Ρ‚ висит Π½Π° Π±ΠΈΡ‚Π°Ρ… 7,6,5,4 ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΏΡ€Π°Π²Ρ‹ΠΉ Π±ΠΈΡ‚ ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ€Ρ‚Π° это Π±ΠΈΡ‚ 4, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ маска Ρ€Π°Π²Π½Π° 0b11101111 β€” ноль стоит Π½Π° 4ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Если ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π»ΠΈΠ½ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΡΠ΅Ρ‚ΡŒ Π½Π° Π½ΠΎΠΆΠΊΠ°Ρ… 5,4,3,2, Ρ‚ΠΎ маска ΡƒΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ 0b11111011 β€” ноль Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Π—Π°Ρ‡Π΅ΠΌ это всС Π±ΡƒΠ΄Π΅Ρ‚ объяснСно Π½ΠΈΠΆΠ΅.

Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ маска Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Π»ΠΈΠ½ΠΈΠΉ ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ€Ρ‚Π° β€” SCANMSK. Π’ Π½Π΅ΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ стоят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ² Π»ΠΈΠ½ΠΈΠΉ столбцов. Π£ мСня столбцы Π·Π°Π²Π΅Π΄Π΅Π½Ρ‹ Π½Π° ΡΡ‚Π°Ρ€ΡˆΡƒΡŽ Ρ‚Π΅Ρ‚Ρ€Π°Π΄Ρƒ ΠΏΠΎΡ€Ρ‚Π°, поэтому ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ маска ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ 0b11110000.

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ Π·Π°Π±Ρ‹Ρ‚ΡŒ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½ΠΎΠΆΠΊΠΈ ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ€Ρ‚Π° Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄, Π° Π½ΠΎΠ³ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Π½Π° Π²Ρ…ΠΎΠ΄ с подтяТкой. А ΠΏΠΎΡ‚ΠΎΠΌ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΊΡƒΠ΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ просто β€” Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ чтСния с ΠΊΠ»Π°Π²Ρ‹, Π° ΠΊΠΎΠ³Π΄Π° возвращаСмся Ρƒ нас Π² рСгистрС R16 находится скан ΠΊΠΎΠ΄ клавиши.

Π’ΠΎΡ‚ Ρ‚Π°ΠΊ Ρƒ мСня выглядСл тСстовый ΠΊΠΎΠ΄:

Main:	SEI			; Π Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ прСрывания.

RCALL KeyScan ; Π‘ΠΊΠ°Π½ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ
CPI R16,0 ; Если вСрнулся 0 Π·Π½Π°Ρ‡ΠΈΡ‚ наТатия Π½Π΅ Π±Ρ‹Π»ΠΎ
BREQ Main ; Π’ этом случаС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ
RCALL CodeGen ; Если вСрнулся скан ΠΊΠΎΠ΄, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ Π²
; ASCII ΠΊΠΎΠ΄.

MOV R17,R16 ; Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π² ΠΏΡ€ΠΈΠ΅ΠΌΠ½Ρ‹ΠΉ рСгистр LCD ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°
RCALL DATA_WR ; Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π½Π° дисплСй.

RJMP Main ; Π—Π°Ρ†ΠΈΠΊΠ»ΠΈΠ²Π°Π΅ΠΌ всС Π½Π°Ρ„ΠΈΠ³.

ΠŸΡ€ΠΎ LCD дисплСй я ΠΏΠΎΠΊΠ° Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ скаТу, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ Π΄ΠΎΠ²Π΅Π΄Π΅Π½Ρ‹ Π΄ΠΎ ΡƒΠΌΠ°, Π½ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π»ΠΎΠΆΠ΅Π½Ρ‹ ΠΈ Ρ€Π°Π·ΠΆΠ΅Π²Π°Π½Ρ‹ Π² блиТайшСС врСмя.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ расскаТу ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° KeyScan

.def COUNT = R18
KeyScan: LDI COUNT,4 ; Π‘ΠΊΠ°Π½ΠΈΠΌ 4 ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ
LDI R16,KEYMASK ; Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ маску Π½Π° скан 0 ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ.

Π’Π½Π°Ρ‡Π°Π»Π΅ ΠΌΡ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ маску. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ Π²Π·ΡΡ‚ΡŒ ΠΈ Π³Π½Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΏΠΎΡ€Ρ‚. Π’Π΅Π΄ΡŒ строки висят Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° послСдних Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Π±ΠΈΡ‚Π°Ρ…, Π° Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, поэтому Π½Π°ΠΌ Π³Π»Π°Π²Π½ΠΎΠ΅ Π½ΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΊΠΈΡ… условиях Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ состояниС Π±ΠΈΡ‚ΠΎΠ² младшСй Ρ‚Π΅Ρ‚Ρ€Π°Π΄Ρ‹ ΠΏΠΎΡ€Ρ‚Π°.

KeyLoop: IN R17,COL_PORT ; Π‘Π΅Ρ€Π΅ΠΌ ΠΈΠ· ΠΏΠΎΡ€Ρ‚Π° ΠΏΡ€Π΅ΠΆΠ½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
ORI R17,SCANMSK ; ВыставляСм Π² 1 Π±ΠΈΡ‚Ρ‹ сканируСмой части.


Π’Π½Π°Ρ‡Π°Π»Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· рСгистра ΠΏΠΎΡ€Ρ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π° Ρ€ΡƒΠΊΠ°Ρ… ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΏΠΎΡ€Ρ‚Π°. Π’Π°ΠΊΠΆΠ΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ всС ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΈΡ‚Ρ‹ ΠΏΠΎΡ€Ρ‚Π° Π² 1, это дСлаСтся посрСдством ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π˜Π›Π˜Β ΠΏΠΎ ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ маскС. Π’ Ρ‚ΠΎΠΉ части Π³Π΄Π΅ стояли Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ послС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π˜Π›Π˜ ΠΏΠΎ маскС 11110000 (ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ SCANMASK) всС Π±ΠΈΡ‚Ρ‹ станут Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌΠΈ, Π° Π³Π΄Π΅ Π±Ρ‹Π» ноль останутся Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

AND R17,R16 ; БбрасываСм Π±ΠΈΡ‚ сканируСмого столбца
OUT COL_PORT,R17 ; Π’Ρ‹Π²ΠΎΠ΄ΠΈΠΌ сформированный Π±Π°ΠΉΡ‚ ΠΈΠ· ΠΏΠΎΡ€Ρ‚Π°.


Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π½Π° сформированный Π±Π°ΠΉΡ‚ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌ маску Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ столбца. Π’ Π½Π΅ΠΉ Π²Π½Π°Ρ‡Π°Π»Π΅ ноль Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния ΠΏΠΎΡ€Ρ‚Π° Π½Π΅ измСнятся, Π° Π²ΠΎΡ‚ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ столбцС Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ 0. ΠŸΠΎΡ‚ΠΎΠΌ маска сдвинСтся, Π° вся опСрация повторится снова. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ноль Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΆΠ΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ столбцС ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅ΠΌ Β«Π±Π΅Π³Π°ΡŽΡ‰ΠΈΠΉΒ» Π½ΠΎΠ»ΠΈΠΊ Π² ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΠΎΡ€Ρ‚Π΅, ΠΏΡ€ΠΈ нСизмСнности Π΄Ρ€ΡƒΠ³ΠΈΡ…, посторонних, Π±ΠΈΡ‚ΠΎΠ² ΠΏΠΎΡ€Ρ‚Π°. А дальшС сформированноС число загруТаСтся Π² рСгистр ΠΏΠΎΡ€Ρ‚Π° ΠΈ Π½ΠΎΠΆΠΊΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ напряТСний.
	NOP	; Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½ΠΎΠ³ΠΈ.
NOP
NOP
NOP

SBIS ROW0_PIN,ROW0 ; ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ строкС Π½Π°ΠΆΠ°Ρ‚Π°
RJMP bt0

SBIS ROW1_PIN,ROW1
RJMP bt1

SBIS ROW2_PIN,ROW2
RJMP bt2

SBIS ROW3_PIN,ROW3
RJMP bt3


БСрия NOP Π½ΡƒΠΆΠ½Π° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Π΄Π°Ρ‚ΡŒ Π½ΠΎΠΆΠΊΠ΅ врСмя Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π½ΡΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½Π°Ρ Ρ†Π΅ΠΏΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Смкости ΠΈ индуктивности, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ уровня, нСбольшая Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° всС ΠΆΠ΅ Π΅ΡΡ‚ΡŒ. А Π½Π° скорости Π² 8ΠœΠ³Ρ† ΠΈ Π²Ρ‹ΡˆΠ΅ процСссор Ρ‰Π΅Π»ΠΊΠ°Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ с Ρ‚Π°ΠΊΠΎΠΉ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎ напряТСниС Π½Π° Π½ΠΎΠ³Π΅ Π΅Ρ‰Π΅ Π½Π΅ спало, Π° ΠΌΡ‹ ΡƒΠΆΠ΅ провСряСм состояниС Π²Ρ‹Π²ΠΎΠ΄Π°. Π’ΠΎΡ‚ я ΠΈ Π²Π»Π΅ΠΏΠΈΠ» нСсколько пустых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. На 8ΠœΠ³Ρ† всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ. На Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ частоту, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΡˆΡ‚ΡƒΠΊ ΠΏΡΡ‚ΡŒ ΡˆΠ΅ΡΡ‚ΡŒ NOP ΠΈΠ»ΠΈ Π²Π»Π΅ΠΏΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΈΠΉ Ρ†ΠΈΠΊΠ». Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Ρ‚ΡƒΡ‚ Π½Π°Π΄ΠΎ ΠΏΠΎΠ³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ Π±Π°ΠΉΡ‚Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ экономичнСй.
ПослС Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΈΠ΄Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° строки. И ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ события.
	ROL	R16		; Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ маску сканирования
DEC COUNT ; УмСньшаСм счСтчик столбцов
BRNE KeyLoop ; Если Π΅Ρ‰Π΅ Π½Π΅ всС ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Π»ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ

CLR R16 ; Если Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ Π½Π΅ Π±Ρ‹Π»ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ 0
RET
.undef COUNT

Π’ΠΎΡ‚ Ρ‚ΡƒΡ‚ происходит сдвиг маски Π²Π»Π΅Π²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ цикличСского сдвига ROL. ПослС Ρ‡Π΅Π³ΠΎ ΠΌΡ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ счСтчик ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ (ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Ρ€Π°Π²Π΅Π½ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρƒ нас Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ столбца). Если Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ Π½Π΅ Π±Ρ‹Π»ΠΎ, Ρ‚ΠΎ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ всСх Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΡ‹ вываливаСмся ΠΈΠ· Ρ†ΠΈΠΊΠ»Π°, обнуляСм рСгистр R16 ΠΈ возвращаСмся.


bt0: ANDI R16,SCANMSK ; Π€ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ скан ΠΊΠΎΠ΄
ORI R16,0x01 ; Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π΅Π³ΠΎ Π² рСгистрС 16
RET

А Π²ΠΎΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠ½Ρ†ΠΎΠ² ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ. Π’ΡƒΡ‚ формируСтся скан ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вСрнСтся Π² рСгистрС R16. Π― Ρ€Π΅ΡˆΠΈΠ» Π½Π΅ Π·Π°ΠΌΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ, Π° ΠΊΠ°ΠΊ всСгда Π·Π°ΠΆΠ°Ρ‚ΡŒ дСсяток Π±Π°ΠΉΡ‚ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСй ΠΈ ΠΊΠΎΡ€ΠΎΡ‡Π΅. Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ ΠΏΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄Ρƒ Π² этот кусок ΠΊΠΎΠ΄Π°. А ΠΈΠΌΠ΅Π΅ΠΌ ΠΌΡ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ€Ρ‚Π° (1110,1101,1011,0111), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π½Π°Π΅ΠΌ Π½ΠΎΠΌΠ΅Ρ€ строки ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΠΏΠΎΠΏΠ°Π»ΠΈ сюда. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π² этот кусок ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ RJMP bt0.
Π’Π°ΠΊ Π΄Π°Π²Π°ΠΉ сдСлаСм скан ΠΊΠΎΠ΄ ΠΈΠ· ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° строки! Π‘ΠΊΠ°Π·Π°Π½ΠΎ β€” сдСлано! Π‘Π½Π°Ρ‡Π°Π»Π° Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ· значСния ΠΏΠΎΡ€Ρ‚Π° ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ β€” ΠΎΠ½Π° Ρƒ нас хранится Π² рСгистрС R16, поэтому Π²Ρ‹ΠΊΠΎΠ²Ρ‹Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ· ΠΏΠΎΡ€Ρ‚Π° Π΅Π΅ Π½Π΅Ρ‚ Π½ΡƒΠΆΠ΄Ρ‹. ΠŸΡ€ΠΎΠ΄Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ И Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ R16 Ρ‡Π΅Ρ€Π΅Π· SCANMASK ΠΈ всС Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ΄ Π΅Π΄ΠΈΠ½ΠΈΡ‡ΠΊΠ°ΠΌΠΈ ΠΏΡ€ΠΎΡˆΠ»ΠΎ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π° Π³Π΄Π΅ Π±Ρ‹Π»ΠΈ Π½ΡƒΠ»ΠΈ β€” Π·Π°Π½ΡƒΠ»ΠΈΠ»ΠΎΡΡŒ. Опа, ΠΈ Ρƒ нас Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ кусок β€” ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ ΠΏΠΎΠ»ΡƒΠ±Π°ΠΉΡ‚. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΊΠ»Π΅ΠΈΠΌ Ρ‚ΡƒΠ΄Π° Π½ΠΎΠΌΠ΅Ρ€ строки β€” ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π˜Π›Π˜. Π Π°Π·, ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π²ΠΈΠ΄Π° [скан][строка]
Π’ΠΎΡ‚ Π΅Π΅ ΠΈ оставляСм Π² рСгистрС R16, Π° сами Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΡ€ΠΎΡ‡ΡŒ! Π’Π°ΠΊΠΆΠ΅ ΠΈ с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ строками. Погляди Π² исходникС, я ΠΈΡ… Π½Π΅ Π±ΡƒΠ΄Ρƒ Ρ‚ΡƒΡ‚ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ скан ΠΊΠΎΠ΄Π°.
ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ, скан ΠΊΠΎΠ΄ Π΅ΡΡ‚ΡŒ, Π½ΠΎ Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ? Π•Π³ΠΎ ΠΆΠ΅ Π½ΠΈΠΊΡƒΠ΄Π° Π½Π΅ ΠΏΡ€ΠΈΡ‚ΠΊΠ½ΡƒΡ‚ΡŒ. ΠœΡ‹ Ρ‚ΠΎ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎΡ‚ эта шняга Π²ΠΈΠ΄Π° 01110001 это ΠΊΠΎΠ΄ Π΅Π΄ΠΈΠ½ΠΈΡ‡ΠΊΠΈ, Π° ΠΊΠ°ΠΊΠΎΠΉ Π½ΠΈΠ±ΡƒΠ΄ΡŒ LCD экран ΠΈΠ»ΠΈ стандартная Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΊΠ° скорчит Π½Π°ΠΌ ΠΆΡƒΡ‚ΠΊΡƒΡŽ кракозябру ΠΈ скаТСт, Π½Π°ΠΌ всС Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π΄ΡƒΠΌΠ°Π΅Ρ‚ ΠΎ нашСй систСмС ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ β€” Π΅ΠΉ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π»ΠΈ ASCII ΠΏΠΎΠ΄Π°Π²Π°ΠΉ. Π›Π°Π΄Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π΅ΠΉ ASCII.

Как Π±Ρ‹Ρ‚ΡŒ? ΠŸΡ€ΠΎΠ³Π½Π°Ρ‚ΡŒ всю ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠΎ CASE Π³Π΄Π΅ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ скан ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΠΎ ASCII ΠΊΠΎΠ΄Ρƒ мСня Π΄Π°Π²ΠΈΡ‚ ΠΆΠ°Π±Π° β€” это ΠΆΠ΅ сколько Π½Π°Π΄ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ! Π­Ρ‚ΠΎ ΠΆΠ΅ сколько Π±Π°ΠΉΡ‚ ΡƒΠΉΠ΄Π΅Ρ‚ Π½Π° всю эту Ρ‚Ρ€ΡΡ…ΠΎΠΌΡƒΠ΄ΠΈΡŽ? А ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρƒ нас Π½Π΅ рСзиновая, ΠΆΠ°Π»ΠΊΠΈΠ΅ восСмь ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚, Π΄Π° ΠΏΠΎ Π΄Π²Π° Π±Π°ΠΉΡ‚Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, это Π² Π»ΡƒΡ‡ΡˆΠ΅ΠΌ случаС. Π― ΠΌΠΎΠ³ всС это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ прям Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. НЕВ!!! Π’ ВОПКУ!!! ΠœΡ‹ ΠΏΠΎΠΉΠ΄Π΅ΠΌ своим ΠΏΡƒΡ‚Π΅ΠΌ.
Ок, Π° Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Π² запасС? ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ‚Π°Π±Π»ΠΈΡ† ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π΅ ΠΊΠ°Ρ‚ΠΈΡ‚, ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ ΠΆΡƒΡ‚ΠΊΠΎΠΉ нСупорядочСнности скан ΠΊΠΎΠ΄ΠΎΠ². ΠŸΠΎΡ‡Π΅ΡΠ°Π» я Ρ‚Ρ‹ΠΊΠΎΠ²ΠΊΡƒ, ΠΏΠΎΡˆΠ°Ρ€ΠΈΠ»ΡΡ ΠΏΠΎ квартирС… ΠΈ Ρ‚ΡƒΡ‚ мСня осСнило. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅!!! Брутфорс!!!

Брутфорсим скан ΠΊΠΎΠ΄.
Π˜Ρ‚Π°ΠΊ, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΆΡƒΡ‚ΠΊΠΎ нСсваримый скан ΠΊΠΎΠ΄, Π° Ρ‚Π°ΠΊΠΆΠ΅ стройная Ρ‚Π°Π±Π»ΠΈΡ†Π° ASCII символов. Как ΡΠΊΡ€Π΅ΡΡ‚ΠΈΡ‚ΡŒ ΡƒΠΆΠ° с Π΅ΠΆΠΎΠΌ? Π”Π° всС просто! РазмСстим Π² памяти Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ символов Π² связкС [скан ΠΊΠΎΠ΄]:[ascii ΠΊΠΎΠ΄] , Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½ΡƒΠΆΠ½Ρ‹ΠΉ скан ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ³ΠΎΠ½ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ ΠΏΡ€ΠΈ совпадСнии ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ASCII ΠΈΠ· связки. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΠ·ΠΌΠ° β€” потСряли Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π·Π°Ρ‚ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Π°Π»ΠΈ Π² памяти.

Π’ΠΎΡ‚ Ρ‚Π°ΠΊ это выглядит:

CodeGen:LDI ZH,High(Code_Table*2) ; Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠ» адрСс ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
LDI ZL,Low(Code_Table*2) ; Π‘Ρ‚Π°Ρ€ΡˆΠΈΠΉ ΠΈ младший Π±Π°ΠΉΡ‚Ρ‹

Π’ΡƒΡ‚ ΠΌΡ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»ΠΈ Π² индСксный рСгистр адрСс нашСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π΄Π²Π° для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ адрСс Π±Ρ‹Π» Π² Π±Π°ΠΉΡ‚Π°Ρ…, Ρ‚.ΠΊ. Π² срСдС компилятора пространство ΠΊΠΎΠ΄Π° адрСсуСтся Π² словах.
Brute:	LPM	R17,Z+		; Взял ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ β€” скан ΠΊΠΎΠ΄

CPI R17,0xFF ; Если ΠΊΠΎΠ½Π΅Ρ† Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
BREQ CG_Exit ; Π’ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ

CPI R16,0 ; Если ноль,
BREQ CG_Exit ; Ρ‚ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ

CP R16,R17 ; Π‘Ρ€Π°Π²Π½ΠΈΠ» Π΅Π³ΠΎ со скан ΠΊΠΎΠ΄ΠΎΠΌ клавиши.
BREQ Equal ; Если Ρ€Π°Π²Π΅Π½, Ρ‚ΠΎ ΠΈΠ΄Π΅ΠΌ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ascii ΠΊΠΎΠ΄

Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ скан ΠΊΠΎΠ΄ ΠΈ Π½Ρ‹Ρ‡ΠΈΠΌ Π΅Π³ΠΎ Π² рСгистр R17, ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ адрСс Π² рСгистрС Z (Π²Ρ‹Π±ΠΎΡ€ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ячСйки Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹) ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ сравниваСм Π΅Π³ΠΎ с FF β€” это ΠΊΠΎΠ΄ ΠΊΠΎΠ½Ρ†Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Если Ρ‚Π°Π±Π»ΠΈΡ†Π° Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ, Ρ‚ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΎΡ‚ΡΡŽΠ΄Π°. Если ΠΌΡ‹ Π½Π΅ всю Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Π»ΠΈ, Ρ‚ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π² рСгистрС R16) Π²Π½Π°Ρ‡Π°Π»Π΅ с Π½ΡƒΠ»Π΅ΠΌ (Π½Π΅Ρ‚ наТатия), Ссли ноль Ρ‚ΠΎΠΆΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ. И со скан ΠΊΠΎΠ΄ΠΎΠΌ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Если скан Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ совпадаСт со сканом Π½Π° Π²Ρ…ΠΎΠ΄Π΅, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° Equal.

LPM R17,Z+ ; Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Z Π½Π° 1
RJMP Brute ; ΠŸΠΎΠ²Ρ‚ΠΎΡ€ Ρ†ΠΈΠΊΠ»Π°

А Π² случаС Ссли Π½ΠΈΡ‡ΠΎ Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ, Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ LPM R17,Z+ лишь для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»Π° Z Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ‡ΠΊΡƒ β€” Π½Π°ΠΌ ΠΆΠ΅ Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅ΡˆΠ°Π³Π½ΡƒΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ASCII ΠΊΠΎΠ΄ ΠΈ Π²Π·ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ скан ΠΊΠΎΠ΄ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. ΠŸΡ€ΠΎΡΡ‚ΠΎ INC Z Π½Π΅ ΠΏΡ€ΠΎΠΊΠ°Ρ‚ΠΈΡ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Z Ρƒ нас Π΄Π²ΡƒΠ±Π°ΠΉΡ‚Π½Ρ‹ΠΉ. ZL ΠΈ ZH. Π’ Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹Ρ… случаях достаточно INC ZL, Π½ΠΎ это Π² случаС ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ‚ΠΎΡ‡Π½ΠΎ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ адрСс находится Π½Π΅Π΄Π°Π»Π΅ΠΊΠΎ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° ΠΈ пСрСполнСния младшСго Π±Π°ΠΉΡ‚Π° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ (ΠΈΠ½Π°Ρ‡Π΅ ΠΌΡ‹ вмСсто адрСса 00000001:00000000 ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ просто 00000000:0000000, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΡ€Π½Π΅ Π½Π΅Π²Π΅Ρ€Π½ΠΎ), Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° LPM всС сдСлаСт Π·Π° нас, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ ΠΌΡ‹ сэкономили Π΅Ρ‰Π΅ ΠΏΠ°Ρ€Ρƒ Π±Π°ΠΉΡ‚. ΠŸΠΎΡ‚ΠΎΠΌ ΠΌΡ‹ вСрнСмся Π² Π½Π°Ρ‡Π°Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°, Π° Ρ‚Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡΡ‚ΡŒ LPM которая Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ ΡƒΠΆΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ скан ΠΊΠΎΠ΄.

Equal: LPM R16,Z ; Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΈΠ· памяти ASCII ΠΊΠΎΠ΄.
RET ; ВозвращаСмся

Если ΠΆΠ΅ Π±Ρ‹Π»ΠΎ совпадСниС, Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ LPM Z+ Ρƒ нас Z ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ячСйку β€” с ASCII ΠΊΠΎΠ΄ΠΎΠΌ. Π•Π΅ ΠΌΡ‹ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ Π² рСгистр R16 ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π°Ρ€ΡƒΠΆΡƒ.

CG_Exit: CLR R16 ; БбрасываСм 0 = Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ 0
RET ; ВозвращаСмся

А Π² случаС Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ исхода, ΠΊΠΎΠ³Π΄Π° Π»ΠΈΠ±ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ, Π° скан ΠΊΠΎΠ΄ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ подобрался, Π»ΠΈΠ±ΠΎ ноль Π±Ρ‹Π» Π² рСгистрС R16 Π½Π° Π²Ρ…ΠΎΠ΄Π΅ β€” возвращаСмся с Ρ‚Π΅ΠΌ ΠΆΠ΅ Π½ΡƒΠ»Π΅ΠΌ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ Π²ΠΎΡ‚.


;========================================
; STATIC DATA
;========================================
Code_Table: .db 0x71,0x31 ;1
.db 0xB1,0x32 ;2
.db 0xD1,0x33 ;3
.db 0x72,0x34 ;4
.db 0xB2,0x35 ;5
.db 0xD2,0x36 ;6
.db 0x73,0x37 ;7
.db 0xB3,0x38 ;8
.db 0xD3,0x39 ;9
.db 0x74,0x30 ;0
.db 0xFF,0 ;END

Π’ΡƒΡ‚ просто Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠ° статичных Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Π΅ памяти. Как видишь Π΄Π°Π½Π½Ρ‹Π΅ сгруппированы ΠΏΠΎ Π΄Π²Π° Π±Π°ΠΉΡ‚Π° β€” сканкод/ASCII

Π’ΠΎΡ‚ посрСдством Ρ‚Π°ΠΊΠΈΡ… ΠΈΠ·Π²Ρ€Π°Ρ‚ΠΎΠ² вся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ скан ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ/записью Π² LCD ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²ΠΊΠΈ (Π½ΡƒΠΆΠ½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΡ‡Π½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ) заняло всСго 354 Π±Π°ΠΉΡ‚Π°. ΠšΡ‚ΠΎ смоТСт мСньшС?

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΊ AVR | avr

На этой страничкС рассказываСтся, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ 12-ΠΊΠ½ΠΎΠΏΠΎΡ‡Π½ΡƒΡŽ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ ΠΊ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρƒ AVR, ΠΈ ΠΊΠ°ΠΊ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½Ρ‹Π΅ наТатия Π½Π° языкС ассСмблСра. Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ «Connecting a keypad to an AVR» [1]. Как Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π½Π° языкС C, см. [2].

[1. Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°]

ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° прСдставляСт собой просто Π½Π°Π±ΠΎΡ€ Π·Π°ΠΌΡ‹ΠΊΠ°Ρ‚Π΅Π»Π΅ΠΉ. НаТали ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ — ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ замкнулся. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ количСство ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ΄ΡƒΡ‚ ΠΎΡ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, ΠΈ Ρ‚Π΅ΠΌ самым ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ схСму ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ соСдинСниС Π·Π°ΠΌΡ‹ΠΊΠ°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с 12-ΠΊΠ½ΠΎΠΏΠΎΡ‡Π½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΈΠΌΠ΅Π΅Ρ‚ 3 столбца (Column, ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π° столбцов ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ Col3..Col1) ΠΈ 4 строки (Row, ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π° строк ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ Row4..Row1).

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ссли Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° «1», Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ Π½Π° Π΄Ρ€ΡƒΠ³Π° Col1 ΠΈ Row1, Ссли Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° «2», Ρ‚ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°ΡŽΡ‚ΡΡ Col2 ΠΈ Row1, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΆΠ°Ρ‚Π° хотя Π±Ρ‹ ΠΎΠ΄Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΈΠ· 12, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ всС столбцы Π½Π° зСмлю, Π° всС строки ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½Ρ‹ΠΉ рСзистор (pull-up) ΠΊ + питания. Π’ΠΎΠ³Π΄Π° Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Output появится Π»ΠΎΠ³. 0, Ссли Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΆΠ°Ρ‚Π° любая ΠΊΠ½ΠΎΠΏΠΊΠ°.

Однако ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ Π½ΡƒΠΆΠ½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΆΠ°Ρ‚Π° любая ΠΊΠ½ΠΎΠΏΠΊΠ°, Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, какая ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΈΠ· 12 Π±Ρ‹Π»Π° Π½Π°ΠΆΠ°Ρ‚Π°. Для этого Π½Π΅ всС сразу столбцы ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΊ Π»ΠΎΠ³. 0, ΠΎΠ½ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΊ 0 ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ, Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ. Вакая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° пробСгания Π»ΠΎΠ³. 0 ΠΏΠΎ столбцам называСтся сканированиСм ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. Один Ρ†ΠΈΠΊΠ» сканирования происходит ΠΎΡ‡Π΅Π½ΡŒ быстро, Π·Π° врСмя порядка 1..10 миллисСкунд. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½Ρ‹ΠΉ рСзистор.

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ наТатия опрСдСляСтся ΠΏΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ состояния всСх строк (Row4..Row1). Если Π½Π° всСх RowX ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π»ΠΎΠ³. 1, Ρ‚ΠΎ это Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· клавиш Π½Π΅ Π½Π°ΠΆΠ°Ρ‚Π°. Если Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· строк RowX появился ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π»ΠΎΠ³. 0, Ρ‚ΠΎ сканированиС прСкращаСтся, ΠΈ ΠΊΠΎΠ΄ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши опрСдСляСтся ΠΏΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

Π‘Ρ‚ΠΎΠ»Π±Ρ†Ρ‹ Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Код ΠΊΠ½ΠΎΠΏΠΊΠΈ
Col1 Col2 Col3 Row1 Row2 Row3 Row4 Π‘ΠΈΠΌΠ²ΠΎΠ» Π”Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄
0 0 0 1 1 1 1 Π½Π΅Ρ‚ наТатия 1111
0 1 1 0 1 1 1 1 0001
1 0 1 0 1 1 1 2 0010
1 1 0 0 1 1 1 3 0011
0 1 1 1 0 1 1 4 0100
1 0 1 1 0 1 1 5 0101
1 1 0 1 0 1 1 6 0110
0 1 1 1 1 0 1 7 0111
1 0 1 1 1 0 1 8 1000
1 1 0 1 1 0 1 9 1001
0 1 1 1 1 1 0 * 1010
1 0 1 1 1 1 0 0 0000
1 1 0 1 1 1 0 # 1011

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ с использованиСм Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

β€’ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€, рСгистр сдвига ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ запуска/останова для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ сигналов столбцов,
β€’ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ появлСния нуля Π½Π° сигналах строк,
β€’ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ для прСобразования 7 Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… сигналов Π² ΠΊΠΎΠ΄ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ клавиши.

Π›ΡƒΡ‡ΡˆΠ΅ всСго с Ρ‚Π°ΠΊΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ справится ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ AVR.

[2. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ AVR ΠΊ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹]

ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΊ AVR Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

На этой ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΊ 7 младшим разрядам ΠΏΠΎΡ€Ρ‚Π° P ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° AVR. МоТно ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚Ρ‹ Π² любой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ GPIO PB4..PB6 Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠ°ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Ρ‹, ΠΎΠ½ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ сигналы для столбцов (ΡΠΊΠ°Π½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π±Π΅Π³ΡƒΡ‰ΠΈΠΉ Π»ΠΎΠ³. 0). GPIO PB0..PB3 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π²Ρ…ΠΎΠ΄Ρ‹, Ρ‡Π΅Ρ€Π΅Π· Π½ΠΈΡ… читаСтся состояниС строк. На этих Π²Ρ…ΠΎΠ΄Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½Ρ‹Π΅ рСзисторы ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° (pull-up), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ внСшниС рСзисторы для создания Π»ΠΎΠ³. 1 Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΡ€Ρ‚Ρ‹ GPIO. Π­Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° 1 Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΠΈΡ‚Π°Π½ΠΈΠ΅ AVR.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ

;
; Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ I/O ΠΏΠΎΡ€Ρ‚ΠΎΠ² для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
;
.DEF rmp = R16 ; ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ рСгистра ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния
; ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ€Ρ‚ΠΎΠ²
.EQU pKeyOut = PORTB  ; рСгистр для установки состояния Π²Ρ‹Ρ…ΠΎΠ΄Π° (Col3..Col1)
                      ; ΠΈ настройки Pull-Up (Row4..Row1)
.EQU pKeyInp = PINB   ; рСгистр для чтСния Π²Ρ…ΠΎΠ΄ΠΎΠ² (Row4..Row1)
.EQU pKeyDdr = DDRB   ; рСгистр, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎΡ€Ρ‚Π°
; Код ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ
InitKey:
   ldi rmp,0b01110000 ; ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… для рСгистра DDRB, столбцы
                      ; Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Ρ‹, строки ΠΊΠ°ΠΊ Π²Ρ…ΠΎΠ΄Ρ‹
   out pKeyDdr,rmp    ; запись Π² рСгистр направлСния
   ldi rmp,0b00001111 ; Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ рСзисторы Pull-Up Π½Π° строках
   out pKeyOut,rmp    ; Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² рСгистр PORTB

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, Π½Π°ΠΆΠ°Ρ‚Π° Π»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ°

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ кусок ΠΊΠΎΠ΄Π° Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Π±Ρ‹Π»Π° Π»ΠΈ Π½Π°ΠΆΠ°Ρ‚Π° любая ΠΈΠ· 12 ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. Π­Ρ‚Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с использованиСм Ρ†ΠΈΠΊΠ»Π° Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ, ΠΈΠ»ΠΈ ΠΏΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°).

;
; ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Π½Π°ΠΆΠ°Ρ‚Π° ΠΈΠ»ΠΈ Π½Π΅Ρ‚ любая ΠΈΠ· ΠΊΠ½ΠΎΠΏΠΎΠΊ
;
AnyKey:
   ldi rmp,0b00001111 ; PB4..PB6(Col3..Col1)=0, pull-Up рСзисторы ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ 
                      ; Π½Π° Π²Ρ…ΠΎΠ΄Ρ‹ (PB0..PB3, Row4..Row1).
   out pKeyOut,rmp    ; установка рСгистра PORTB
   in rmp,pKeyInp     ; Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ состояния строк (Row4..Row1).
   ori rmp,0b11110000 ; ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ всС Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π±ΠΈΡ‚Ρ‹ Π² Π»ΠΎΠ³. 1
   cpi rmp,0b11111111 ; всС Π±ΠΈΡ‚Ρ‹ Π² Π»ΠΎΠ³. 1?
   breq NoKey         ; Π΄Π°, Π½Π΅ Π±Ρ‹Π»Π° Π½Π°ΠΆΠ°Ρ‚Π° Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΊΠ½ΠΎΠΏΠΎΠΊ

ΠŸΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° ΠΏΠΎ измСнСнию уровня Π½Π° любом ΠΈΠ· Π²Ρ…ΠΎΠ΄ΠΎΠ² Row4..Row1. Для этого Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ всС Ρ‚Ρ€ΠΈ столбца Col3..Col1 Π² состояниС Π»ΠΎΠ³. 0 ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ Π² Ρ€Π΅ΠΆΠΈΠΌ сна (Sleep, Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎΠ½ΠΈΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ энСргопотрСблСния). ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΌΠ΅Ρ‚ Π»ΡŽΠ±ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ, ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ проснСтся ΠΏΠΎ появлСнию Π»ΠΎΠ³. 0 Π½Π° Π²Ρ…ΠΎΠ΄Π°Ρ… строк Row4..Row1. Π’ этом мСстС ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сканированиС Col3..Col1 ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, какая ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π°ΠΆΠ°Ρ‚Π°.

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ, для этого Π½Π° столбцы Col3..Col1 ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π»ΠΎΠ³. 0. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΏΠΎΡ€Ρ‚ΠΎΠ² столбца PB4..PB6 (Col3..Col1) выставлСн 0 ΠΈ Π½Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ€Ρ‚Π°Ρ… столбца Π»ΠΎΠ³. 1, провСряСтся состояниС ΠΏΠΎΡ€Ρ‚ΠΎΠ² строк PB0..PB3 (Row4..Row1) Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ 0. РСгистр Z (рСгистровая ΠΏΠ°Ρ€Π° R31:R30) ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ (Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π° Π² памяти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ FLASH), ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ ΠΊΠΎΠ΄Ρ‹ ΠΊΠ½ΠΎΠΏΠΎΠΊ. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ опрСдСлСния ΠΊΠ½ΠΎΠΏΠΊΠΈ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, рСгистр Z Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΊΠΎΠ΄ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструкции LPM ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ этот ΠΊΠΎΠ΄ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² рСгистр R0.

;
; Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ
;
ReadKey:
   ldi ZH,HIGH(2*KeyTable) ; Z ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠΎΠ΄ΠΎΠ² ΠΊΠ½ΠΎΠΏΠΎΠΊ
   ldi ZL,LOW(2*KeyTable)
   ; Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ столбца 1 (Col1)
   ldi rmp,0b00111111      ; PB6 = 0
   out pKeyOut,rmp
   in rmp,pKeyInp          ; Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ строк
   ori rmp,0b11110000      ; маскированиС ΡΡ‚Π°Ρ€ΡˆΠΈΡ… Π±ΠΈΡ‚
   cpi rmp,0b11111111      ; Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° Π² этом столбцС?
   brne KeyRowFound        ; Π½Π°ΠΉΠ΄Π΅Π½Π° наТатая ΠΊΠ½ΠΎΠΏΠΊΠ° Π² этом столбцС
   adiw ZL,4               ; Π² этом столбцС Π½Π΅ Π±Ρ‹Π»ΠΎ наТатия, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Z
                           ; на 4 кнопки дальшС
   ; Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ столбца 2 (Col2)
   ldi rmp,0b01011111      ; PB5 = 0
   out pKeyOut,rmp
   in rmp,pKeyInp          ; снова Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ строк
   ori rmp,0b11110000      ; снова маскированиС ΡΡ‚Π°Ρ€ΡˆΠΈΡ… Π±ΠΈΡ‚
   cpi rmp,0b11111111      ; Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° Π² этом столбцС?
   brne KeyRowFound        ; Π½Π°ΠΉΠ΄Π΅Π½Π° наТатая ΠΊΠ½ΠΎΠΏΠΊΠ° Π² этом столбцС
   adiw ZL,4               ; Π² этом столбцС Π½Π΅ Π±Ρ‹Π»ΠΎ наТатия, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Z
                           ; на 4 кнопки дальшС
   ; Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ столбца 3 (Col3)
   ldi rmp,0b01101111      ; PB4 = 0
   out pKeyOut,rmp
   in rmp,pKeyInp          ; послСднСС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ строк
   ori rmp,0b11110000      ; снова маскированиС ΡΡ‚Π°Ρ€ΡˆΠΈΡ… Π±ΠΈΡ‚
   cpi rmp,0b11111111      ; Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° Π² этом столбцС?
   breq NoKey ; Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ
              ; ΠΈΠ· столбцов
KeyRowFound:               ; Π½Π°ΠΉΠ΄Π΅Π½ столбСц, Π³Π΄Π΅ Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ°, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ
                           ; Π½Π°Π΄ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΉ строкС
   lsr rmp                 ; сдвиг Π»ΠΎΠ³. 0 Π²Π»Π΅Π²ΠΎ, Π±ΠΈΡ‚ 0 ΠΏΡ€ΠΈ этом вдвигаСтся
                           ; Π² ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ пСрСноса
   brcc KeyFound           ; выдвинулся Π»ΠΎΠ³. 0, это Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‡Ρ‚ΠΎ клавиша Π½Π°ΠΉΠ΄Π΅Π½Π°
   adiw ZL,1               ; ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠ½ΠΎΠΏΠΊΠ΅ Π² этом столбцС
   rjmp KeyRowFound        ; ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚ΡŒ сдвиг
KeyFound:                  ; Π½Π°ΠΉΠ΄Π΅Π½Π° наТатая ΠΊΠ½ΠΎΠΏΠΊΠ°
   lpm                     ; ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΊΠΎΠ΄ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² рСгистр R0
   rjmp KeyProc            ; ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΊΠ½ΠΎΠΏΠΎΠΊ
NoKey:
   rjmp NoKeyPressed       ; Π½Π΅ Π±Ρ‹Π»Π° Π½Π°ΠΉΠ΄Π΅Π½Π° наТатая ΠΊΠ½ΠΎΠΏΠΊΠ°
;
; Π’Π°Π±Π»ΠΈΡ†Π° ΠΊΠΎΠ΄ΠΎΠ² ΠΊΠ½ΠΎΠΏΠΎΠΊ для прСобразования
;
KeyTable:
.DB 0x0A,0x07,0x04,0x01 ; ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ столбСц, ΠΊΠ½ΠΎΠΏΠΊΠΈ *, 7, 4 ΠΈ 1
.DB 0x00,0x08,0x05,0x02 ; Π²Ρ‚ΠΎΡ€ΠΎΠΉ столбСц, ΠΊΠ½ΠΎΠΏΠΊΠΈ 0, 8, 5 ΠΈ 2
.DB 0x0B,0x09,0x06,0x03 ; Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ столбСц, ΠΊΠ½ΠΎΠΏΠΊΠΈ #, 9, 6 ΠΈ 3

Как ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π΄Ρ€Π΅Π±Π΅Π·Π³Π° ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ΠΎΠ² (дСбоунсинг)

Π£ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ KeyProc ΠΈ NoKeyPressed ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ дСбоусинг Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² счСтчик, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π²Π²Π΅Ρ€Ρ…, ΠΏΠΎΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠ°. Π­Ρ‚ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒΡΡ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 50 миллисСкунд. ΠŸΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° NoKeyPressed очистит счСтчик, ΠΈ этим Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π»ΠΎΠΆΠ½Ρ‹Π΅ срабатывания опрСдСлСния Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ врСмя опроса зависит ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ AVR, Ρ‚ΠΎ конкрСтная рСализация подавлСния Π΄Ρ€Π΅Π±Π΅Π·Π³Π° здСсь Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π°.

НСдостатки, Ρ‡Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ

Π­Ρ‚ΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅, Π½Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ установкой состояния столбцов ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ строк. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ большой Смкости ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΎΠ² Π΄ΠΎ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ/ΠΈΠ»ΠΈ Π½Π° высокой частотС опроса ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ (Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ высокая тактовая частота ядра AVR) Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠ΅ΠΆΠ΄Ρƒ записью ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ (это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ простым Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ инструкций NOP ΠΈΠ»ΠΈ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ).

Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½Ρ‹Π΅ рСзисторы ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° AVR (pull-up) ΠΈΠΌΠ΅ΡŽΡ‚ Π½ΠΎΠΌΠΈΠ½Π°Π» ΠΎΠΊΠΎΠ»ΠΎ 50 кОм. Π”Π»ΠΈΠ½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π° ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° Π² условиях ΡΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠΌΠ΅Ρ… ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ нСустойчивому опросу ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊ ΡˆΡƒΠΌΠ°ΠΌ ΠΈ ΠΏΠΎΠΌΠ΅Ρ…Π°ΠΌ, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π½Π° сигналы строк Row4..Row1 внСшниС Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½Ρ‹Π΅ рСзисторы подходящСго Π½ΠΎΠΌΠΈΠ½Π°Π»Π° (1..10 кОм).

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ нСдостаток схСмы Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ трСбуСтся 7 ΠΏΠΎΡ€Ρ‚ΠΎΠ² GPIO ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°. ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ с использованиСм Ρ†ΠΈΡ„Ρ€ΠΎΠ°Π½Π°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ прСобразоватСля (ЦАП, Analog-Digital Convertor, ADC) ΠΈ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ рСзисторов Π±ΠΎΠ»Π΅Π΅ экономична ΠΈ позволяСт Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ мСньшС Π½ΠΎΠΆΠ΅ΠΊ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°.

[3. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ADC с использованиСм рСзисторной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹]

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² AVR сСрий Tiny ΠΈ Mega Π² настоящСС врСмя ΠΈΠΌΠ΅ΡŽΡ‚ Π² своСм составС ЦАП (ADC). Π‘Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ внСшнСй Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ ADC ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ напряТСниС с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ 10 Π±ΠΈΡ‚. Если Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½ΠΎΠΆΠΊΠΈ GPIO ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ для чтСния ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ADC, Ρ‚ΠΎ Π’Ρ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρƒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΎΠ΅ напряТСниС Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, какая ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π°ΠΆΠ°Ρ‚Π°. Π­Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‡Π° для рСзисторной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹.

РСзисторная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°

На рисункС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ устроСна рСзисторная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Π·Π΅ΠΌΠ»Π΅ (- источника питания), ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ столбцами ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ соСдинСнныС Π² стСк рСзисторы. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ Ρ‚Π°ΠΊΠΆΠ΅ ΠΊ стСку рСзисторов, Π½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΊ + питания (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 5V). Π’Ρ…ΠΎΠ΄ АЦП (ΠΊΠ°Π½Π°Π» ADC0) Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ кондСнсатором 1 Π½Π€ (1000 ΠΏΠ€). Π­Ρ‚ΠΎΡ‚ кондСнсатор ΠΈ сопротивлСниС рСзисторов ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ЀНЧ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ всСгда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ ADC, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ADC Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΡ†ΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ слишком высокиС частоты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠ°Π΄Π°ΠΌΠΈ сигнала ΠΏΡ€ΠΈ наТатиях Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ.

Рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ с использованиСм ADC. Если Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° «5», Ρ‚ΠΎ активизируСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ напряТСния:

1 кОм + 820 Ом = 1.82 кОм Π½ΠΈΠΆΠ½Π΅Π΅ ΠΏΠ»Π΅Ρ‡ΠΎ (ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ΅ ΠΊ Π·Π΅ΠΌΠ»Π΅),
3,3 кОм + 680 Ом + 180 Ом = 4.16 кОм Π²Π΅Ρ€Ρ…Π½Π΅Π΅ ΠΏΠ»Π΅Ρ‡ΠΎ (ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ΅ ΠΊ +5V).

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ напряТСнии 5V Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ дСлитСля получится напряТСниС:
(5 * 1.82) / (1.82 + 4.16) = 1.522V

Π­Ρ‚ΠΎ напряТСниС ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ АЦП. Если ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ допуск Π½Π° Π½ΠΎΠΌΠΈΠ½Π°Π» рСзисторов 5%, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ напряТСниС Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ 1.468 ΠΈ 1.627 Π²ΠΎΠ»ΡŒΡ‚Π°ΠΌΠΈ. 10-Π±ΠΈΡ‚Π½Ρ‹ΠΉ АЦП ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ это напряТСниС (Ссли Ρƒ ADC ΠΎΠΏΠΎΡ€Π½ΠΎΠ΅ напряТСниС Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ Ρƒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, 5V) Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ 300 ΠΈ 333. Если ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ Π΄Π²Π° ΠΌΠ»Π°Π΄ΡˆΠΈΡ… Π±ΠΈΡ‚Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ADC Π½Π° 4 сдвигом ΠΈΠ»ΠΈ Ссли ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π»Π΅Π²ΠΎΠ΅ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° ADC это позволяСт), это даст 8-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 74..78. Π›ΡŽΠ±ΠΎΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ даст ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ADC, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ΄ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ.

НапряТСния ΠΈ распознаваниС ΠΊΠ½ΠΎΠΏΠΎΠΊ

ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ рСзисторов Π² Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π΄Π°Π΄ΡƒΡ‚ напряТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ собраны Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ напряТСний, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΊ 8-Π±ΠΈΡ‚Π½ΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ прСобразования ADC. 8-Π±ΠΈΡ‚Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для дСтСктирования Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ.

Кнопка НапряТСниС, V 8-Π±ΠΈΡ‚Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ADC Π”Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
(ΠΈΠ· значСния ADC)
min nom max min nom max
1 0.225 0.248 0.272 11 13 14 7
2 0.396 0.434 0.474 20 22 25 18
3 0.588 0.641 0.698 29 33 36 28
4 0.930 0.969 1.048 47 49 54 42
5 1.438 1.522 1.627 74 78 84 64
6 1.959 2.020 2.139 99 103 110 91
7 2.563 2.688 2.809 130 137 144 121
8 3.285 3.396 3.500 167 173 180 156
9 3.740 3.832 3.917 190 195 201 185
* 4.170 4.237 4.298 212 216 221 207
0 4.507 4.550 4.588 229 232 235 225
# 4.671 4.700 4.726 238 240 242 237

Как ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π½Π΅Ρ‚ пСрСкрытия ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ напряТСния ΠΏΡ€ΠΈ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΏΡ€ΠΈ ΡƒΡ‡Π΅Ρ‚Π΅ допуска Π½Π° Π½ΠΎΠΌΠΈΠ½Π°Π» рСзисторов 5%. Если Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ комбинациями рСзисторов, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ лист Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Excel ΠΈ Open Office [4], ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ вычислСния для составлСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ прСобразования.

Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ использованию Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ АЦП ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² AVR

Π§ΠΈΠΏΡ‹ ATtiny часто ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ напряТСния АЦП Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ ΠΎΠΏΠΎΡ€Π½ΠΎΠ΅ напряТСниС ΠΈΠ»ΠΈ напряТСниС источника питания. Для опроса ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π² качСствС ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ напряТСния для АЦП ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с напряТСниСм источника питания Π² качСствС ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ. Π­Ρ‚Π° опция Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ настроСна ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ADC, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° стартуСт (послС сброса ΠΈΠ»ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ питания).

МногиС Ρ‡ΠΈΠΏΡ‹ ATmega ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠΏΠΎΡ€Π½ΠΎΠ΅ напряТСниС для ADC с внСшнСго Π²Ρ‹Π²ΠΎΠ΄Π°, AREF. Π­Ρ‚ΠΎΡ‚ Π²Ρ‹Π²ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ Π²Ρ…ΠΎΠ΄, Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄. Он Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ, Ссли Π² качСствС ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ для ADC Π²Ρ‹Π±Ρ€Π°Π½ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ ΠΎΠΏΠΎΡ€Π½ΠΎΠ΅ напряТСниС, ΠΈΠ»ΠΈ напряТСниС источника питания. Π’ этом случаС ΠΊ Π½ΠΎΠΆΠΊΠ΅ AREF ΠΈ ΠΊ Π·Π΅ΠΌΠ»Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ кондСнсатор, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΡˆΡƒΠΌΡ‹ ΠΈ ΠΏΠΎΠΌΠ΅Ρ…ΠΈ Π½Π° ΠΎΠΏΠΎΡ€Π½ΠΎΠΌ напряТСнии. AREF Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π²Ρ…ΠΎΠ΄, Ссли настроСн Π²Ρ‹Π±ΠΎΡ€ внСшнСго источника ΠΎΠΏΠΎΡ€Π½ΠΎΠ³ΠΎ напряТСния. Π’ этом случаС ΠΎΠΏΠΎΡ€Π½ΠΎΠ΅ напряТСниС для ADC поступаСт ΠΎΡ‚ внСшнСго источника. Если ΠΎΠΏΠΎΡ€Π½ΠΎΠ΅ напряТСниС прСдоставляСт внСшний источник, Ρ‚ΠΎ ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° рСзисторов ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΠΈΡ‚Π°Π½Π° ΠΎΡ‚ этого ΠΆΠ΅ источника. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ привСдСнная схСма ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡ‚ΡŒ Ρ‚ΠΎΠΊ Π΄ΠΎ 10 мА, это сдСлано для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊ ΠΏΠΎΠΌΠ΅Ρ…Π°ΠΌ.

Π§ΠΈΠΏΡ‹ ATmega ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΈΡ‚Π°Ρ‚ΡŒ ADC ΠΎΡ‚ внСшнСго ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ источника питания Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ корпуса (AVCC), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΡˆΡƒΠΌΡ‹. Если ADC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Ρ‚ΠΎ ΠΈΠ·-Π·Π° Π½ΠΈΠ·ΠΊΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ точности прСобразования (8 Π±ΠΈΡ‚) Π½Π΅Ρ‚ нСобходимости ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ источник питания для Π²Ρ‹Π²ΠΎΠ΄Π° AVCC, ΠΈ этот Π²Ρ‹Π²ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ Π½Π°ΠΏΡ€ΡΠΆΠ΅Π½ΠΈΡŽ питания. Если всС ΠΆΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Ρ‹ ADC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ, Ρ‚ΠΎ рСкомСндуСтся ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ AVCC ΠΊ Π½Π°ΠΏΡ€ΡΠΆΠ΅Π½ΠΈΡŽ питания Ρ‡Π΅Ρ€Π΅Π· Π΄Ρ€ΠΎΡΡΠ΅Π»ΡŒ Π½ΠΎΠΌΠΈΠ½Π°Π»ΠΎΠΌ ΠΎΠΊΠΎΠ»ΠΎ 22 ΠΌΠΊΠ“Π½, ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ AVCC ΠΈ Π·Π΅ΠΌΠ»Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ кондСнсатор 100 Π½Π€ (0.1 ΠΌΠΊΠ€).

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° прСобразования ADC

Для чтСния напряТСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π½Π°Π» ADC. ADC инициализируСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° запускаСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° (Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ питания ΠΈΠ»ΠΈ сброс). Π”Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΊΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚: Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ запуска ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ прСобразования, Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ATmega8, ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ управляСмый прСрываниями запуск ADC, этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для ATtiny13.

ATmega8: Ρ€ΡƒΡ‡Π½ΠΎΠΉ запуск прСобразования ADC

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для ATmega8, Π±Π΅Π· ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, с Ρ€ΡƒΡ‡Π½Ρ‹ΠΌ запуском ΠΈ остановом ADC. Π‘ΠΈΠ³Π½Π°Π» ΠΎΡ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° ΠΊΠ°Π½Π°Π» ADC0.

.DEF rKey =R15   ; РСгистр для хранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ADC
.DEF rmp = R16    ; РСгистр ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния
   ; установка ΠΊΠ°Π½Π°Π»Π° 0 ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΎΡ€Π°, с Π»Π΅Π²Ρ‹ΠΌ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ 
   ; Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, AREF бСрСтся ΠΎΡ‚ AVCC
   ldi rmp,(1<<REFS0)|(1<<ADLAR) ; ADMUX ΠΊΠ°Π½Π°Π» 0, AREF ΠΎΡ‚ AVCC
   out ADMUX,rmp
   ; Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ADC, запуск конвСрсии, Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ скорости = 128
   ldi rmp,(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
   out ADCSRA,rmp
   ; ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅
WaitAdc1:
   ; ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π±ΠΈΡ‚Π° ADSC, конвСрсия Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° Ссли этот Π±ΠΈΡ‚ == 0
   sbic ADCSRA,ADSC  ; конвСрсия Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°?
   rjmp WaitAdc1     ; Π΅Ρ‰Π΅ Π½Π΅Ρ‚
   ; Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ Π±Π°ΠΉΡ‚Π° (MSB) Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° прСобразования ADC
   in rKey,ADCH
   ; Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ADC
   ldi rmp,(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)
   out ADCSRA,rmp

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π° ΠΈΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ это ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 25 * 128 Ρ‚Π°ΠΊΡ‚ΠΎΠ²Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ², Π½Π° Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΠΎΠΉ частотС 1 ΠœΠ“Ρ† врСмя прСобразования составит 3.2 миллисСкунды. Π­Ρ‚ΠΎ довольно Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‚Ρ€Π°Ρ‚Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, поэтому Ρ‚Π°ΠΊΠΎΠΉ способ получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ADC допустим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π’Π°ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΎ врСмя Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ прСобразования (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Ρ… ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ).

ATtiny13: автозапуск конвСрсии ADC, с использованиСм ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ

Π”Π°ΠΆΠ΅ ATtiny13 с Π΅Ρ‘ 8 Π½ΠΎΠΆΠΊΠ°ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Ссли Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ADC (ΠΌΡ‹ Π½Π΅ смоТСм Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ 3×4, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ ATtiny13 Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΡ‚ Π½ΠΎΠΆΠ΅ΠΊ I/O).

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹Π±Ρ€Π°Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ способ прСобразования: напряТСниС постоянно считываСтся с ΠΊΠ°Π½Π°Π»Π° ADC3 (Π²Ρ‹Π²ΠΎΠ΄ 2 ATtiny13), ΠΈ послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ запустится автоматичСски.

;
; Настройка ADC, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ запуск конвСрсии
;
   ; PB3=ADC3, этот Π²Ρ…ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для чтСния ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹
   ldi rmp,0b00001000   ; ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ³ΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° PB3,
                        ; это экономит ΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΠ΅ΠΌΡƒΡŽ ΡΠ½Π΅Ρ€Π³ΠΈΡŽ
   out DIDR0,rmp
   ; ΠžΠΏΠΎΡ€Π½ΠΎΠ΅ напряТСниС = Π½Π°ΠΏΡ€ΡΠΆΠ΅Π½ΠΈΡŽ питания, Π»Π΅Π²ΠΎΠ΅ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅
   ; Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° прСобразования, ADMUX ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ Π½Π° ADC3
   ldi rmp,0b00100011   ; ΠΎΠΏΠΎΡ€Π½ΠΎΠ΅ напряТСниС = Π½Π°ΠΏΡ€ΡΠΆΠ΅Π½ΠΈΡŽ питания,
                        ; Π²Ρ‹Π±ΠΎΡ€ ADC3
   out ADMUX,rmp
   ; Π²Ρ‹Π±Ρ€Π°Π½Π° опция автостарта прСобразования
   ldi rmp,0b00000000   ; постоянно Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ сами ΠΏΠΎ сСбС
                        ; прСобразования (free-running, автостарт).
   out ADCSRB,rmp
   ; запуск ADC, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ прСрывания, Π²Ρ‹Π±ΠΎΡ€ дСлитСля Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΠΎΠΉ частоты
   ldi rmp,0b11101111 ; старт ADC, автостарт
   out ADCSRA,rmp       ; ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ, Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ Ρ‚Π°ΠΊΡ‚ΠΎΠ² 128
; инициализация Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°

ИспользованиС прСрывания ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ прСобразования Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ опрСдСлСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° прСрывания (rjmp intadc).

;
; Π’Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ сброса ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ ATtiny13
;
.CSEG          ; ассСмблированиС Π² сСгмСнт ΠΊΠΎΠ΄Π°,
.ORG $0000     ; с самого Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»Π°
   rjmp main   ; Π’Π΅ΠΊΡ‚ΠΎΡ€ сброса (Reset)
   reti ; Int0, Π²Π΅ΠΊΡ‚ΠΎΡ€ внСшнСго прСрывания
   reti ; PCINT0, Π²Π΅ΠΊΡ‚ΠΎΡ€ прСрывания ΠΏΠΎ измСнСнию уровня
   reti ; TC0, Π²Π΅ΠΊΡ‚ΠΎΡ€ прСрывания ΠΏΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° 0
   reti ; Π²Π΅ΠΊΡ‚ΠΎΡ€ прСрывания готовности EEPROM
   reti ; Π²Π΅ΠΊΡ‚ΠΎΡ€ прСрывания Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠ°Ρ€Π°Ρ‚ΠΎΡ€Π°
   reti ; Π²Π΅ΠΊΡ‚ΠΎΡ€ прСрывания TC0 CompA (событиС сравнСния)
   reti ; Π²Π΅ΠΊΡ‚ΠΎΡ€ прСрывания TC0 CompB (событиС сравнСния)
   reti ; Π²Π΅ΠΊΡ‚ΠΎΡ€ прСрывания WDT
   rjmp intadc ; Π²Π΅ΠΊΡ‚ΠΎΡ€ прСрывания ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ конвСрсии ADC
;

Π‘Π°ΠΌΠΎ собой, для использования ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ стСк, ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСн Ρ„Π»Π°Π³ ΠΎΠ±Ρ‰Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ (SEI).

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ прСрывания ADC Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ прСобразования. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹Π±Ρ€Π°Π½ΠΎ Π»Π΅Π²ΠΎΠ΅ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Ρ‚ΠΎ достаточно ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ (MSB) Π±Π°ΠΉΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°:

;
; ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ прСрывания (ISR) для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ конвСрсии ADC
;
.DEF rKey = R15   ; РСгистр для хранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ADC
intadc:
   in rKey,ADCH   ; Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ (MSB) Π±Π°ΠΉΡ‚Π° прСобразования
   reti           ; Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· прСрывания
;

РСгистр rKey постоянно Π΄Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС рСзисторной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹.

Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ARC, получСния ΠΊΠΎΠ΄Π° Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ прСобразования ADC сам ΠΏΠΎ сСбС Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π΅Π½. НапряТСния ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ прСобразования ADC Π½Π΅ ΡƒΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² простыС матСматичСскиС ΠΏΡ€Π°Π²ΠΈΠ»Π° (Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ, Π½ΠΎΠΌΠΈΠ½Π°Π»Ρ‹ рСзисторов 4.7 — 5.6 — 6.8 — 8.2 ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π» ΠΏΡŒΡΠ½Ρ‹ΠΉ профСссор ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ, ΠΈ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π° V = R1 / (R1 + R2) Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ проста для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ для получСния ΠΊΠΎΠ΄ΠΎΠ² ΠΊΠ½ΠΎΠΏΠΎΠΊ. Π’Π°Π±Π»ΠΈΡ†Π° Π½Π΅ получится ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ 256 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² прСобразования ADC, ΠΈ Π½Π°ΠΌ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ помСньшС.

Как обСзьяна, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΊΠ°Ρ€Π°Π±ΠΊΠ°Ρ‚ΡŒΡΡ ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ шаг Π·Π° шагом Ρ‡Π΅Ρ€Π΅Π· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ:

KeyTable:
.DB 7, 255, 18, 1, 28, 2, 42, 3, 64, 4, 91, 5
.DB 121, 6, 156, 7, 185, 8, 207, 9, 225, 10, 237, 0, 255, 11

Π—Π΄Π΅ΡΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π°ΠΉΡ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сравнСния для Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° прСобразования, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π±Π°ΠΉΡ‚ это ΠΊΠΎΠ΄ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Ссли Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сравнСния большС, Ρ‡Π΅ΠΌ наш Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ находится Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ 0 ΠΈ < 7, Ρ‚ΠΎ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ Π±Ρ‹Π»Π° Π½Π°ΠΆΠ°Ρ‚Π° Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΊΠ½ΠΎΠΏΠΎΠΊ (ΠΊΠΎΠ΄ клавиши 255), Ссли ΠΌΠ΅ΠΆΠ΄Ρƒ 7 ΠΈ < 18, Ρ‚ΠΎ ΠΊΠΎΠ΄ ΠΊΠ½ΠΎΠΏΠΊΠΈ 1, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Или ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сразу ASCII-ΠΊΠΎΠ΄Ρ‹ для ΠΊΠ½ΠΎΠΏΠΎΠΊ:

KeyTable:
.DB 7, 0 , 18, '1', 28, '2', 42, '3', 64, '4', 91, '5'
.DB 121, '6', 156, '7', 185, '8', 207, '9', 225, '*', 237, '0', 255, '#'

Код дСкодирования Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ:

;
; ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° прСобразования ADC Π² ΠΊΠΎΠ΄ ΠΊΠ½ΠΎΠΏΠΊΠΈ
;
GetKeyCode:
   ; сначала Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ копию Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
   ; ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ Π²ΠΎ врСмя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ
   mov R1,rKey ; ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ADC Π² рСгистр R1
   ldi ZH,HIGH(2*KeyTable)    ; Z ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ прСобразования
   ldi ZL,LOW(2*KeyTable)
GetKeyCode1:
   lpm               ; Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ значСния сравнСния ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
   cp R1,R0          ; сравнСниС значСния ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ADC
   brcs GetKeyCode2  ; Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ мСньшС, Ρ‡Π΅ΠΌ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅,
                     ; ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π°
   inc R0            ; ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, достигнут Π»ΠΈ ΠΊΠΎΠ½Π΅Ρ† Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
   breq GetKeyCode2  ; Ρ‚Π°Π±Π»ΠΈΡ†Π° Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ
   adiw ZL,2         ; ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ записи Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅
   rjmp GetKeyCode1  ; ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ записи
GetKeyCode2:
   adiw ZL,1         ; Z ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΊΠΎΠ΄ ΠΊΠ½ΠΎΠΏΠΊΠΈ
   lpm               ; Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² рСгистр R0
;

Π—Π΄Π΅ΡΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΎΠ΄Π½Π° ΠΈΡ… ΠΊΠ½ΠΎΠΏΠΎΠΊ Π½Π΅ Π½Π°ΠΆΠ°Ρ‚Π° (Π² этом случаС R0 = 0xFF, Π° Ссли ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΊΠ½ΠΎΠΏΠΎΠΊ ASCII, Ρ‚ΠΎ R0 = 0) ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π»ΠΎΠΆΠ½Ρ‹Π΅ срабатывания (Ссли ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ΄ клавиши ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ 20 ΠΈΠ»ΠΈ большСС количСство Ρ€Π°Π·).
Experiences

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ экспСримСнты ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ слишком большиС значСния рСзисторов (сначала рСзисторы Π±Ρ‹Π»ΠΈ Π² 10 Ρ€Π°Π· большС ΠΏΠΎ Π½ΠΎΠΌΠΈΠ½Π°Π»Ρƒ) Π΄Π΅Π»Π°ΡŽΡ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ с использованиСм АЦП слишком Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊ высокочастотным ΠΏΠΎΠΌΠ΅Ρ…Π°ΠΌ. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°Π»Π°ΡΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° рядом находился ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚Ρ‡ΠΈΠΊ VHF (Π£ΠšΠ’) с ΠΌΠΎΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠΊΠΎΠ»ΠΎ 2 Π’Ρ‚.

[Бсылки]

1. Connecting a keypad to an AVR site:avr-asm-tutorial.net.
2. AVR245: ΠΊΠΎΠ΄ΠΎΠ²Ρ‹ΠΉ Π·Π°ΠΌΠΎΠΊ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ 4×4 ΠΈ I2C LCD.
3. Доступ ΠΊ ΠΏΠΎΡ€Ρ‚Π°ΠΌ I/O AVR Π½Π° языкС C (GCC, WinAVR).
4. 131121-adc-keyboard.zip.
5. AVR240: ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π° 4×4, ΠΏΡ€ΠΎΠ±ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ AVR ΠΎΡ‚ наТатия.

alexxlab

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *