Решил поиграться с давно заказанной с китая мембранной клавиатурой 3x4. Есть много видов и разновидностей данной клавиатуры, есть в пластмассовых корпусах, а есть пленочные. У моего вариант 3x4 7 контактов, распиновка клавиатуры 4x4 показана на схеме ниже, схема один к одному. Схема почти идентична с клавиатурой 3x4 за исключением того что отсутствует правый ряд клавиш "A,B,С,D".

Схема подключения клавиатуры 3x4 :

Клавиатура 4x4 подключается аналогично, четвертый ряд "A,B,С,D" подключается к порту PD7 микроконтроллера.
Исходный код программы:
$regfile = "m8def.dat"
$crystal = 1000000
'конфигурация дисплея
Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 20 * 4
Cursor Off
Cls
'конфигурация клавиатуры
Config Kbd = Portd , Debounce = 40 , Delay = 100
'переменные
Dim Key_char As Byte 'номер нажатой клавиши
Dim Key_str As String * 1 'символ нажатой клавиши на клаивиатуре
Dim Result As String * 20 'результат нажатий на клавиатуру
Deflcdchar 1 , 32 , 14 , 10 , 31 , 27 , 27 , 14 , 32 '
Locate 1 , 4
Lcd Chr(1)
Result = ""
'Главный цикл программы
Do
Key_char = Getkbd() 'когда клавиша не нажата функция возвращает переменной значение 16
If Key_char <> 16 Then 'если переменная не равна 16, значит была нажата кнопка
Key_str = Lookupstr(key_char , Keyboard_data) 'вытаскиваем из массива символ нажатой клавиши
Result = Result + Key_str
End If
Locate 2 , 3
Lcd Result 'выводим на дисплей результат нажатий
Waitms 100
If Result = "123" Then
Locate 2 , 2
Lcd "UNLOCK"
Wait 1
Goto Pizdec
Else
End If
If Key_str = "5" Then
Locate 2 , 2
Lcd "RETURN"
Wait 1
Goto Pizdec
Else
End If
Loop
End
Keyboard_data:
Data "1" , "4" , "7" , "*" , "2" , "5" , "8" , "0"
Data "3" , "6" , "9" , "#" , "A" , "B" , "C" , "D"
Pizdec:
Return
При удержании клавиши символы начинают повторяться, программу можно слегка доработать если добавить в конец первого в примере строки:
Key_char = Getkbd()
If Key_char <> 16 Then
Goto 1
End If
то мы избегаем повторения символов при удержании клавиши. Можем хоть минуту давить на кнопку, а символ будет один.
При включении прибора на верхней строке высвечивается иконка "замок", на нижней строке отображаются вводимые символы.

По умолчанию в исходнике код "123", как только мы введем этот код (как только нажмем третью правильную кнопку) на нижней строке выйдет надпись "UNLOCK".

Если при вводе мы ошиблись цифрой, т.е. ввели не ту цифру - нажимаете кнопку 5 чтобы стереть все и начать ввод кода заного, при нажатии на кнопку 5 программа перезапускается. Статья дана лишь в ознакомительных целях и естественно клавишу 5 (клавишу которая стирает цифры) в идеале нужно перенести например на знак "решетка". Из за нехватки времени не стал переделывать, перепроверил все в железе и решил поделиться с вами.

Думаю принцип работы программы вам понятен, остается программу чуть дописать, указать порты на срабатывание при вводе правильного кода.
Видео работы кодового замка:
файлы проекта с исходным кодом (~15кб.)
Готовая версия кодового замка:
Ниже представлена готовая рабочая схема кодового замка с настроенными портами для подключения электропривода и светодиодов. Электропривод можно подключить автомобильный, так называемый привод замка дверей.
При верном вводе PIN кода привод сработает на 1 секунду, этого времени достаточно для работы механизма замка (открывания двери)? привод подключается через транзистор к порту PORTB.4. Если же при попытке ввести PIN код ошиблись цифрой, нажимаете кнопку "решетка" и можно начать ввод кода заново...

При правильном вводе PIN кода открывается замок, а на дисплее выводится надпись "UNLOCK".

Проект в Proteus и прошивка лежат ниже в архиве, PIN код замка указан в архиве в названии файла прошивки.
...по материалам сайта avrproject.ru
проект Proteus и файл прошивки (~16кб.)
|