|
Подключение к Palm
PC-AT клавиатуры Перевод оригинальной
версии - Владимир Медейко Очень многие спрашивают, как можно вводить длинные тексты в PalmPilot? Здесь рассказывается о такой возможности - подключении к PalmPilot самой обычной клавиатуры PC/AT, которая у всех есть либо дома, либо её можно купить весьма дешево. В конце-концов, в мире почти нет мест, где не было бы поблизости PC AT клавиатуры. CopyrightВсе права на схему и исходный текст принадлежат
Olaf Kaluza. Разрешается их использование в личных
целях, для собственного удовольствия.
Нежелательно копирование данной страницы и
перевод на другие языки без разрешения автора.
Нежелательно копирование на CD-ROM или другое
распространение информации с данной страницы.
Если у кого-то возникнут неприятности или
сломается Пилот - это полностью ваша собственная
проблема.
Контакты с авторомАвтор будет рад конструктивным письмам - о найденных ошибках, с пожеланиями об улучшении, с благодарностями и т.д. и т.п. Хотелось бы попросить воздержаться от дурацких вопросов. Автор не занимается сгоревшими микроконтроллерами, не раздаёт плат и не знает, почему ваша схема не работает!
Принцип функционированияФункционирование относительно просто. Необходимо лишь преобразовать данные в формате клавиатуры IBM-AT (а не старой XT-клавиатуры) в формат клавиатуры Apple-Newton. Затем уже можно использовать один из множества драйверов клавиатуры Newton для Пилота. Автор использует драйвер Freekey.
Как видно, схема так же проста, как и
функционирование. Вы должны видеть каждую
мельчайшую точку картинки. В противном случае
лучше бросьте это дело, пока наш маленький друг
не убит. ПитаниеВообще-то, как схеме, так и клавиатуре нужно 5
вольт. Однако, можно не следовать этому в
точности. У автора схема работает на 4.2В литиевых
аккумуляторах. Очевидно, четыре никель-кадмиевых
аккумулятора дадут то же самое. Исходный текст кода для микроконтроллера:
;Преобразователь для клавиатуры PC в клавиатуру Palmpilot/Newton-Key
;Работает на 24Mhz
;
;
;
;
; 9.04.99
;
.org 0000H
;Установка внутренних ассемблерных переменных
#include "/home/olaf/anwendungen/elektronik/tasm/global.inc"
#include "/home/olaf/anwendungen/elektronik/tasm/sysmacro.inc"
; baud_const = 256 - (crystal / (12 * 16 * baud))
baud_const .EQU 243 ;9600 бод на 24 MHz
#define idle orl PCON,#00000001b
STACK .EQU 04fH ;Начало системного стека-1
#define KEYDAT P3.3 ;Данные клавиатуры
;Как вход для тактирования
;используется Int0/P3.2
FLAGS .equ 040h ; Используем эти байты для флагов
Ctrl .equ (FLAGS-20h)+0 ; control key flag
Shift .equ (FLAGS-20h)+1 ; shift key flag
Alt .equ (FLAGS-20h)+2 ; alt key flag
RCtrl .equ (FLAGS-20h)+3 ; alt key flag
RShift .equ (FLAGS-20h)+4 ; alt key flag
RAlt .equ (FLAGS-20h)+5 ; alt key flag
E0cod .equ (FLAGS-20h)+6 ; alt key flag
lastkey .equ 041h ; Последняя нажатая клавиша
NBits .equ 042h ; Счётчик битов
keytemp .equ 043h ; Временный код нажатия
NBytes .equ 044h ; !=0 помещены байты в байтовый буфер
keybuff .equ 045h ; Буфер для оттранслированных кодов
ajmp anfang ;Старт программы после Reset'а
.org 0003H ;Внешнее прерывание 0, INT0
ajmp kbd ;Снова пришла клавиатура
.org 000BH ;Счётчик переполнения/таймер 0
nop
.org 0013H ;Внешнее прерывание 1, INT1
NOP
.org 001BH ;Счётчик переполнения/таймер 1
NOP
.org 0023H ;Прерывание, последовательный порт
NOP
.org 0026H ;Основная программа
;Основная программа, сначала некоторая инициализация
anfang mov SP,#STACK ;Увеличение указателя стека
;И место для банка регистров
;Установки по умолчанию используют RS232 как 9600 бод при 24-х мегагерцах
orl PCON,#10000000b ;Удвоение бодовой скорости
MOV TMOD,#00100001b
MOV SCON,#01000000b ; Установить последовательный
; порт в режим 1 и запретить приём
mov a, #baud_const
mov TH1, a
orl TCON,#01010010b ; стартовать 1 оба таймера
setb TI ;нормально установлено в этой программе
orl TCON,#00000001b ; Int0 должен переключаться по фронту
mov IP,#00000001b ; Int0 устанавливается на высший уровень
mov IE,#10000001b ; Разрешить Int0
clr Shift ; Очистить флаги клавиатуры
clr Ctrl
clr Alt
clr RShift
clr RCtrl
clr RAlt
clr E0cod
mov NBytes,#0
mov NBits,#0
;Здесь начинается рабочий код
mainl mov a,NBytes ; Нажата клавиша?
jz mainl ; Нет? Ждать.
anl IE,#01111110b ; Запретить IRQs
mov NBytes,#0
mov a,keybuff
orl IE,#10000001b ; Разрешить Int0
jz mainl ; Запрещённые клавиши посылают ноль
acall cout ; Послать нажатие на Palmpilot
mov a,#8ah ; Удалить нажатие клавиши
acall cout ; Palmpilot сделает там автоповтор
idle ;Экономить электроэнергию
sjmp mainl
;Послать байты на RS232
cout jnb TI, cout
clr TI
mov SBUF, a
ret
;KBD-процедура для прерывания 0
kbd: push psw ;Сохранить используемые регистры
push acc
mov acc,NBits ; NBits=число битов последующее от клавиатуры
cjne a,#0,bit1_8 ; Если не бит 0 то биты от 1 до 8
bit0: ajmp bump ; Bit0 игнорируется т.к. это стартовый бит
bit1_8: cjne a,#9,$+3 ; Проверить 9-й бит
jnc bit9
mov c,KEYDAT ; Текущий прочитанный бит
mov a,keytemp ; Возможно, последние биты
rr a ; И место для новых битов
mov ACC.7,c ; Биты введены.
mov keytemp,acc
ajmp bump
bit9: cjne a,#9,bit10
ajmp bump ;Для начала не используем проверку чётности
;Стоповый бит, поэтому заканчиваем и можем преобразовывать
bit10: mov acc,keytemp ;Последний полностью пришедший скан-код
jb E0cod,noe0 ;Уже в расширенном E0-режиме? (префикс E0)
cjne a,#0e0h,noe01 ;Переходим к расширенному E0-коду?
setb E0cod
ajmp tidy
;Обрабатываем E0-коды
noe0: mov acc,lastkey
cjne a,#0f0h,noe0no
clr E0cod ;Клавиша с префиксом E0 отпущена
mov lastkey,#0
mov acc,keytemp
cjne a,#75h,notCUr ;Это Cursor-UP
mov a,#126
ajmp Not0
notCUr: cjne a,#72h,noCDr ;Cursor-Down отпущена?
mov a,#125
ajmp Not0
noCDr: cjne a,#6bh,noCLr ;Это Cursor-Left?
mov a,#123
ajmp Not0
noCLr: cjne a,#74h,noCRr ;Это Cursor-Right?
mov a,#124
ajmp Not0
noCRr: cjne a,#11h,noAltgr ;Это правая клавиша ALT?
mov a,#58
ajmp Not0
noAltgr:cjne a,#14,noCtrrr ;Левая Ctrl?
mov a,#59
ajmp Not0
noCtrrr:
ajmp tidy ;Неопознанный код, ничего не делать
noe0no: ;Клавиша с префиксом E0 нажата
mov acc,keytemp
cjne a,#0f0h,noe3 ;Это F0?
mov lastkey,keytemp
ajmp tidy ;В первый раз если это F0
noe3: clr E0cod ;Мы знаем, какая клавиша была нажата
cjne a,#75h,noCU ;Это Cursor-Up?
mov a,#-2
ajmp Not0
noCU: cjne a,#72h,noCD ;Это Cursor-Down?
mov a,#-3
ajmp Not0
noCD: cjne a,#6bh,noCL ;Это Cursor-Left?
mov a,#-5
ajmp Not0
noCL: cjne a,#74h,noCR ;Это Cursor-Right?
mov a,#-4
ajmp Not0
noCR: cjne a,#11h,noAltg ;Это правая клавиша ALT?
mov a,#-70 ;Посылаем OptionsUP
ajmp Not0
noAltg: cjne a,#14h,noCtrr ;Это правая клавиша Ctrl?
mov a,#-69
ajmp Not0
noCtrr:
ajmp tidy ;Нажата неизвестная клавиша
;Обработка нажатий и отпусканий не-E0 клавиш
noe01: cjne a,#12h,notls ; Это левая клавиша Shift?
mov acc,lastkey ; Если последний код
cjne a,#0f0h,makels ; был $f0, клавиша Shift отпущена
clr Shift ; Поэтому стереть биты Shift'а
mov lastkey,#12h ; И скан-код последнего символа в буфере
mov a,#56
ajmp Not0
makels: setb Shift ; Следующая клавиша заShift'ена
mov lastkey,#12h ; Скан-код последнего символа в буфере
mov a,#-72
sjmp Not0
sjmp tidy
notls: cjne a,#59h,notrs ; Это правая клавиша Shift?
mov acc,lastkey ; Это код Break?
cjne a,#0f0h,makers
clr RShift
mov lastkey,#59h
mov a,#60 ;Клавиша отпущена
sjmp Not0
makers: setb RShift
mov lastkey,#59h
mov a,#-68 ;Правая клавиша Shif нажата
sjmp Not0
notrs: cjne a,#14h,notctrl ;Может, это клавиша Ctrl?
mov acc,lastkey
cjne a,#0f0h,mkctr
clr Ctrl
mov lastkey,#14h
mov a,#59
sjmp Not0
mkctr: setb Ctrl
mov lastkey,#14h
mov a,#-69
sjmp Not0
notctrl: cjne a,#11h,notalt ;Это клавиша Alt?
mov acc,lastkey
cjne a,#0f0h,mkalt
clr Alt
mov lastkey,#11h
mov a,#55
sjmp Not0
mkalt: setb Alt
mov lastkey,#11h
mov a,#-73
sjmp Not0
notalt: cjne a,#0f0h,notbreak ; Это код Break? (Клавиша отпущена)
mov lastkey,a ;Заметить
sjmp tidy ;но не сохранять в буфере
notbreak: mov acc,lastkey ; Если последняя клавиша была 0xf0
cjne a,#0f0h,not_f0 ;Игнорировать скан-код, это код Break
mov lastkey,#0 ;Dummy-значение
sjmp tidy
;Все особые случаи рассмотрены, так что это обычная клавиша
not_f0: mov a,keytemp ;Настоящая клавиша
mov lastkey,a ;и в код последней клавиши.
push dph ; Нам нужен dptr для доступа к таблице
push dpl
mov dptr,#keytab ;Да, другая таблица
movc a,@a+dptr ;Трансляция кода
pop dpl ;dptr больше не нужен
pop dph
Not0: mov keybuff,a ; Символ в буфере клавиатуры
mov NBytes,#1 ; И заметить для дальнейшей работы
tidy: mov NBits,#0 ; Всё готово для следующей клавиши
mov keytemp,#0
sjmp intdone
bump: inc NBits ;подготовка к следующему биту
intdone:pop acc
pop psw
reti
;Таблица перевода клавиш IBM-AT в Code-Set2 c't6/88 s.152
;в коды Newton
; 0 1 2 3 4 5 6 7 8 9 A B C D E F
keytab .db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,0b0h,0b2h,000h ;0x00
.db 000h,-73 ,-72 ,000h,-69 ,08ch,092h,000h,000h,000h,086h,081h,080h,08dh,093h,000h ;0x10
.db 000h,088h,087h,082h,08eh,095h,094h,000h,000h,0b1h,089h,083h,091h,08fh,097h,000h ;0x20
.db 000h,0adh,08bh,084h,085h,090h,096h,000h,000h,000h,0aeh,0a6h,0a0h,09ah,09ch,000h ;0x30
.db 000h,0abh,0a8h,0a2h,09fh,09dh,099h,000h,000h,0afh,0ach,0a5h,0a9h,0a3h,09bh,000h ;0x40
.db 000h,000h,0a7h,000h,0a1h,098h,000h,000h,-71 ,000h,0a4h,09eh,000h,0aah,000h,000h ;0x50
.db 000h,000h,000h,000h,000h,000h,0b3h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0x60
.db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0x70
.db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0x80
.db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0x90
.db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0xa0
.db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0xb0
.db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0xc0
.db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0xd0
.db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0xe0
.db 000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h,000h ;0xf0
.end
Если кому-то удастся собрать это устройство, или как-то дополнить статью - пожалуйста пишите. Примечание от DOOMKa: Я сделал клавиатуру, подобную той, о которой Вы рассказывали на странице. Мой материал можно посмотреть на http://wince.cdc.ru/russian/kbdproj.htm . Одно замечание: для нормальной работы нужно использовать прошивку palmtasta2 (а не palmtasta как у Вас).
Подключение к Palm Ericsson chatboard во-первых, вот: (если телефона нет, то проще сделать так же, только не готовую логику от писишной клавы отдирать, а вставить свой простенький контроллер на pic) во-вторых, вот: так что по логике как раз не проще. там надо декодировать at команды, плюс оный чатборд эмулирует нажатие телефонных клавиш, т.е. жмешь ты, к примеру, L а оно шлет три раза at+ckpd="5". декодировать это не сложнее, чем писишный интерфейс, но и не проще. в любом случае uC некий понадобится. И еще по поводу клавиатуры Ericsson и PS/2 - можно обратить внимание на проект ЙЦУКЕН (http://starostin.palmclub.ru) Там вся схемотехника, прошивки, фото. кроме того, для случая пальма, с батареек придется кормить ещс и преобразователь уровней и контроллер этой самой клавы, который больше вредит, чем даст пользы :) Дополнительно ссылка: http://wince.box.ru/russian/newtonkb.htm |