Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подключение клавиатуры PS/2 к микроконтроллеру
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ffilin
преобразователь скан кода компьютерной клавиатуры PS/2 в UART.
видео камера не высокого разрешения по этому плохо видно как отображаются на экране ноутбука, в программе Hyper Terminal нажатые на клавиатуре кнопки.

Работает следующим образом, данные проходят Клавиатура --> скан код--> микроконтроллер ATmega8--> UART--> MAX232-->COM port-->Hyper Terminal

https://www.youtube.com/watch?v=gGJYEg4GNJM

Исходник на BASCOM AVR

CODE
' программа kebord-->ascii
'
'-------------------------------------------------------------------------------
' директивы компилятора
'-------------------------------------------------------------------------------
$regfile = "m8def.dat" ' тип процессора
$crystal = 14318180 ' частота кварца
$baud = 9600
'Config Serialin = Buffered , Size = 16 ' скорость связи

'-------------------------------------------------------------------------------
' соответствие электрических цепей выводам портов
'-------------------------------------------------------------------------------
' сеть
' направление данных в сети
' конечники

'-------------------------------------------------------------------------------
' переменные
'-------------------------------------------------------------------------------

Dim B As Byte
Dim B_o As Byte
Dim Y As Byte
Dim C As Byte

Dim V As Bit
Dim O As Bit
Dim P As Bit

Dim In_p As Bit
Dim Caps As Bit

'============================================================================
===
' начало программы
'-------------------------------------------------------------------------------
' вектор прерывания по сбросу (начало программы)
Startmodule:
' обрабатываем источник сброса
' if MCUCSR.WDRF = 1 then goto ResetWD

' goto ConfigModule

Resetwd: ' сброс по сторожевому таймеру
' resetFlag = MCUCSR
' MCUCSR.WDRF = 0




Configmodule:
'настройка портов ввода/вывода
'внутреннее сопротивление
'0 - 100кОм(в микроконтроллер)
'1- низкое (измикроконтроллера)
'
'подтягивание
'1 - к плюсу
'0 - на нуле


Ddrb = &B00000000
Ddrc = &B00000000
Ddrd = &B00000010
Portb = &B00000000
Portc = &B00000000
Portd = &B00000000


Ucsrc = &B10111110 '2-stop odd-par




Config Int0 = Falling

On Int0 Int0_int

Enable Interrupts ' разрешить работу прерываний
Enable Int0

Stop Ac ' отключить питание
' настройка АЦП
' Stop ADC
' F_him = 10


'переходит в режим приёма ожидает начало пакета


' Enable Interrupts ' разрешить работу прерываний


' загрузка конфигурации
Loadconfig:





' основной цикл программы
Reset Caps

Main:
'Tmp = Waitkey()

If V = 1 Then

Waitus 800

If B = &H12 Then Set Caps
If B = &H59 Then Set Caps

If B_o = &HF0 Then
If B = &H12 Then Reset Caps
If B = &H59 Then Reset Caps
End If


If Caps = 0 Then
Select Case B

Case &H69 : C = &H31 '1
Case &H72 : C = &H32 '2
Case &H7A : C = &H33 '3
Case &H6B : C = &H34 '4
Case &H73 : C = &H35 '5
Case &H74 : C = &H36 '6
Case &H6C : C = &H37 '7
Case &H75 : C = &H38 '8
Case &H7D : C = &H39 '9
Case &H70 : C = &H30 '0



Case &H16 : C = &H31 '1
Case &H1E : C = &H32 '2
Case &H26 : C = &H33 '3
Case &H25 : C = &H34 '4
Case &H2E : C = &H35 '5
Case &H36 : C = &H36 '6
Case &H3D : C = &H37 '7
Case &H3E : C = &H38 '8
Case &H46 : C = &H39 '9
Case &H45 : C = &H30 '0
Case &H4E : C = &H2D '-
Case &H55 : C = &H3D '=
Case &H5D : C = &H5C '\

Case &H15 : C = &H71 'q '
Case &H1D : C = &H77 'w
Case &H24 : C = &H65 'e
Case &H2D : C = &H72 'r
Case &H2C : C = &H74 't
Case &H35 : C = &H79 'y
Case &H3C : C = &H75 'u
Case &H43 : C = &H69 'i
Case &H44 : C = &H6F 'o
Case &H4D : C = &H70 'p
Case &H54 : C = &H5B '[
Case &H5B : C = &H5D ']

Case &H1C : C = &H61 'a
Case &H1B : C = &H73 's
Case &H23 : C = &H64 'd
Case &H2B : C = &H66 'f
Case &H34 : C = &H67 'g
Case &H33 : C = &H68 'h
Case &H3B : C = &H6A 'j
Case &H42 : C = &H6B 'k
Case &H4B : C = &H6C 'l
Case &H4C : C = &H3B ';
Case &H52 : C = &H27 ''

Case &H1A : C = &H7A 'z
Case &H22 : C = &H78 'x
Case &H21 : C = &H63 'c
Case &H2A : C = &H76 'v
Case &H32 : C = &H62 'b
Case &H31 : C = &H6E 'n
Case &H3A : C = &H6D 'm
Case &H41 : C = &H2C ',
Case &H49 : C = &H2E '.
Case &H4A : C = &H2F '/

Case &H29 : C = &H20 '" "
Case &H5A : C = &H0D ' "enter"
Case &H76 : C = &H1B ' "esc"

Case Else : Reset O

End Select
End If

If Caps = 1 Then
Select Case B

Case &H69 : C = &H31 '1
Case &H72 : C = &H32 '2
Case &H7A : C = &H33 '3
Case &H6B : C = &H34 '4
Case &H73 : C = &H35 '5
Case &H74 : C = &H36 '6
Case &H6C : C = &H37 '7
Case &H75 : C = &H38 '8
Case &H7D : C = &H39 '9
Case &H70 : C = &H30 '0


Case &H16 : C = &H21 '1 !
Case &H1E : C = &H40 '2 @
Case &H26 : C = &H23 '3 #
Case &H25 : C = &H24 '4 $
Case &H2E : C = &H25 '5 %
Case &H36 : C = &H5E '6 ^
Case &H3D : C = &H26 '7 &
Case &H3E : C = &H2A '8 *
Case &H46 : C = &H28 '9 (
Case &H45 : C = &H29 '0 )
Case &H4E : C = &H5F '- _
Case &H55 : C = &H2B '= +
Case &H5D : C = &H7C '\ |

Case &H15 : C = &H51 'q '
Case &H1D : C = &H57 'w
Case &H24 : C = &H45 'e
Case &H2D : C = &H52 'r
Case &H2C : C = &H54 't
Case &H35 : C = &H59 'y
Case &H3C : C = &H55 'u
Case &H43 : C = &H49 'i
Case &H44 : C = &H4F 'o
Case &H4D : C = &H50 'p
Case &H54 : C = &H7B '[{
Case &H5B : C = &H7D ']}

Case &H1C : C = &H41 'a
Case &H1B : C = &H53 's
Case &H23 : C = &H44 'd
Case &H2B : C = &H46 'f
Case &H34 : C = &H47 'g
Case &H33 : C = &H48 'h
Case &H3B : C = &H4A 'j
Case &H42 : C = &H4B 'k
Case &H4B : C = &H4C 'l
Case &H4C : C = &H3A '; :
Case &H52 : C = &H22 ' ' ""

Case &H1A : C = &H5A 'z
Case &H22 : C = &H58 'x
Case &H21 : C = &H43 'c
Case &H2A : C = &H56 'v
Case &H32 : C = &H42 'b
Case &H31 : C = &H4E 'n
Case &H3A : C = &H4D 'm
Case &H41 : C = &H3C ',<
Case &H49 : C = &H3E '.>
Case &H4A : C = &H3F '/ ?

Case &H29 : C = &H20 '" "
Case &H5A : C = &H0D ' "enter"
Case &H76 : C = &H1B ' "esc"


Case Else : Reset O

End Select
End If

If B <> &HF0 Then
If B_o <> &HF0 Then

If O = 1 Then Printbin C

' Print©
End If
End If






B_o = B

Reset V
Reset O
Reset P

B = 0
Y = 0

End If


Goto Main

Int0_int:
Disable Interrupts

If Y > 10 Then

Reset V
Reset O
Reset P

B = 0
Y = 0

End If

In_p = Pind.3


Select Case Y
Case 0 : If In_p = 0 Then Set V

Case 1 : If In_p = 1 Then
B = B + 1
Toggle P
End If

Case 2 : If In_p = 1 Then
B = B + 2
Toggle P
End If
Case 3 : If In_p = 1 Then
B = B + 4
Toggle P
End If
Case 4 : If In_p = 1 Then
B = B + 8
Toggle P
End If
Case 5 : If In_p = 1 Then
B = B + 16
Toggle P
End If
Case 6 : If In_p = 1 Then
B = B + 32
Toggle P
End If
Case 7 : If In_p = 1 Then
B = B + 64
Toggle P
End If
Case 8 : If In_p = 1 Then
B = B + 128
Toggle P
End If
Case 9 : If In_p = P Then B = 0
Case 10 : If In_p = 1 Then Set O
End Select

Incr Y

Enable Interrupts
Enable Int0
Return
zltigo
Абсолютная муть.
prottoss
Цитата(zltigo @ Mar 30 2017, 17:27) *
Абсолютная муть.
+1
ffilin
Может кто то захочет сделать DDS генератор частоты а частоту вводить сразу, а не нажимая кнопочки или крутя инкодер. Может кто то захочет сделать бегущую строку, туда тоже нужно как то вводить текст...

единственное пост длинный получился, как спрятать исходник под кат?
adnega
Цитата(ffilin @ Mar 30 2017, 18:09) *
Может кто то захочет сделать DDS генератор частоты а частоту вводить сразу, а не нажимая кнопочки или крутя инкодер. Может кто то захочет сделать бегущую строку, туда тоже нужно как то вводить текст...

BASIC уже не модно.
Кнопки уже не модно. Проще энкодером или с сенсорного экрана.
Связь с ПК/планшетом для ввода текста можно легко сделать через BT или WiFi.

Цитата(ffilin @ Mar 30 2017, 18:09) *
единственное пост длинный получился, как спрятать исходник под кат?

Тэг 'codebox'
zltigo
Цитата(adnega @ Mar 30 2017, 17:16) *
BASIC уже не модно.

Тут проблема уже начинается не с BASIC. BASIC это уже мелкий штрих.

MrYuran
Цитата(adnega @ Mar 30 2017, 18:16) *
Тэг 'codebox'

а ещё лучше ссылка на github или mysvn
zip в конце концов
adnega
Цитата(zltigo @ Mar 30 2017, 18:27) *
Тут проблема уже начинается не с BASIC. BASIC это уже мелкий штрих.

На серьезность намерений подход ТС не намекает, а для всех прочих вариантов годится тот же Arduino.
hsoft
Цитата(ffilin @ Mar 30 2017, 16:09) *
единственное пост длинный получился, как спрятать исходник под кат?

Чтобы сократить код напишите слова [ c o d e ] и [ / c o d e ] до и после кода (пробелы убрать)

Будет вот так
Код
здесь ваш код

Сделайте reply моего поста и сразу увидите. Другой вариант запаковать в zip и прикрепить к посту.

Вы делаете отличные вещи, рассказываете и показываете практические результаты.
Это самое ценное.
Вам тут будут гадости писать не обращайте внимание. У нас тут полно всезнаек, которые стесняются выложить свои работы.
А раз так, значит вес их слов равен нулю. Людям нужны такие вот обучающие видео.
Спасибо за интересную работу. Отлично подойдет в качестве стартовой точки по работе с клавиатурой.


Если будут особо доставать, включим тяжелую артиллерию...sm.gif
adnega
Цитата(hsoft @ Mar 30 2017, 19:36) *
У нас тут полно всезнаек,

Для портянок лучше использовать 'codebox', вместо 'code'.
Aldec
В некоторых средах и пакетах разработки для AVR есть различные библиотеки для работы с периферией, SPI датчиками, USB, GSM, CAN модулями, ЛСД драйверы, PS2 клавиатуры,
ffilin
Цитата(Aldec @ Apr 2 2017, 11:52) *
В некоторых средах и пакетах разработки для AVR есть различные библиотеки для работы с периферией, SPI датчиками, USB, GSM, CAN модулями, ЛСД драйверы, PS2 клавиатуры,


Программирую на С, паскале, ASM. Иногда пишу драйверы и библиотеки.
просто BASCOM бесплатный и программатор 2 разъёма и 5 проводов.

Этот преобразователь скан-кода в ASCII всего лишь часть более крупного проекта.

Вывод текстовой строки в эфирную ТВ картинку.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.