Подключение к 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 |