интерфейс клавиатуры!

S

seanthearakh

Guest
Благодарим Вас за АНМ, но то, что мне нужно в C, пожалуйста, помогите мне!

<img src="http://www.edaboard.com/images/smiles/icon_cry.gif" alt="Плачущий или очень расстроенный" border="0" />
 
Как насчет этого материала:
Код:

# Pragma язык = продлен

# включить <df0034.h>

# включить "keyboard.h"

# включить "infhotel.h"

# включить "rtc.h"

# включить "lang.h"

# включить "rs232.h"uchar keyModifier / / E0, E1,

saddr uchar uniKey / / клавиши преобразуется в псевдо-формате Unicode (подписано 128bit)

saddr uchar lastUniKey / / Store предыдущий ключ в псевдо-юникод формате

разрядных keyReleased / / 1, если F0 клавиши получилsaddr uchar kbdbytes / / число байт, полученных с клавиатуры

saddr uchar kbdbuffer [KBDBUFFERLEN] / / буфер клавиатуры

uchar kbdbits / / число полученных битов (начало битных включительно)

uchar kbdbyte; / / приема байта

uchar kbdto / / таймаут для клавиш приема

разрядных kbdtx; / / 1 при передаче на клавиатуре, при получении 0

разрядных kbdbit / / получили разрядные

разрядных kbdoddparity / / 1, если нечетное число битов до паритета

разрядных kbderr / / 1, если какие-либо ошибкиструктуры kbd_struct kbd_table;/ / E C N R U

Const uchar uni2ascii [UNI2ASCIILEN] = "abcdefghijklmnopqrstuvwxyz0123456789 \ \ '\ x8d \ x8a \ x95 \ x85 \ x97 >,.-. 0123456789 -* /";

/ / E * C ° §

Const uchar shiftuni2ascii [UNI2ASCIILEN] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ =! \" L $%&/()|?^ \ * x82 \ x87 \ xf8 \ xf5 <;:_. 0123456789 -* / ";

/ / 0 4 8 C 0 4 8 C 0 4 8 C 0 4 8 C 0/ / Карта клавиши на карте аналогично Unicode.

uchar Const key2uni [132] = (

0x00, K_F9, 0x00, K_F5, K_F3, K_F1, K_F2, K_F12,

0x00, K_F10, K_F8, K_F6, K_F4, K_TAB, 0x25, 0x00,

/ / 10

0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x1c, 0x00,

0x00, 0x00, 0x1A, 0x13, 0x01, 0x17, 0x1d, 0x00,

/ / 20

0x00, 0x03, 0x18, 0x04, 0x05, 0x1f, 0x1e, 0x00,

0x00, 0x40, 0x16, 0x06, 0x14, 0x12, 0x20, 0x00,

/ / 30

0x00, 0x0E, 0x02, 0x08, 0x07, 0x19, 0x21, 0x00,

0x00, 0x00, 0x0D, 0x0A, 0x15, 0x22, 0x23, 0x00,

/ / 40

0x00, 0x2e, 0x0B, 0x09, 0x0F, 0x1B, 0x24, 0x00,

0x00, 0x2f, 0x30, 0x0c, 0x2a, 0x10, 0x26, 0x00,

/ / 50

0x00, 0x00, 0x2b, 0x00, 0x28, 0x27, 0x00, 0x00,

0x00, 0x00, K_ENTER, 0x29, 0x00, 0x2c, 0x00, 0x00,

/ / 60

0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, K_BACKSP, 0x00,

0x33, 0x1c, 0x00, 0x36, 0x39, 0x00, 0x00, 0x00,

/ / 70

0x32, 0x31, 0x34, 0x37, 0x38, 0x3a, K_ESC, 0x00,

K_F11, 0x3c, 0x35, 0x3d, 0x3e, 0x3b, 0x00, 0x00,

/ / 80

0x00, 0x00, 0x00, K_F7

);недействительным getKeyStroke (uchar * ч) (

/ / Возвращает первое нажатие клавиши в kbdbuffer []

uchar I;

если (kbdbytes) (

* CH =* kbdbuffer;

kbdbytes -;

для (i = 0; I <kbdbytes; I )

kbdbuffer = kbdbuffer [I 1];

если (kbdbytes == KBDBUFFERLEN-1) (

kbdclk = 1; / / освобождение kbdclk на клавиатуре повторно RX

kbdclkm = 1;

)

# ifdef DEBUGKBD

rs232putbyte2hex ((uchar) * CH, '\ N');

# ENDIF

возвращение;

() Другое

* CH = 0;

возвращение;

)

)/ / Если новый символ был получен, реинициализации переменной (используется kbdGetChar)

# определить kbdNewChar () (keyModifier = 0; keyReleased = 0;)/ * Возврат в uniKey символа читаются из kbdbuffer, 0, если Есть нет доступных символов * /

kbdGetChar недействительным (недействительными) (

uchar CH;

/ / На данный момент я буду читать:

/ / A.
новый полный или частичный клавиш

/ / B.
завершения предыдущего получила частичную клавиш

/ / C.
другая часть ранее получила частичную клавишесли (uniKey)

lastUniKey = uniKey;

uniKey = 0; / / инициализация uniKey к нулю (полезно, если "нет ключа" была нажата / освобожден)

в то время как (1) (

getKeyStroke (И СН); / / будем хранить в гл следующей части клавиш

если (CH == 0) (

/ / Нет клавиши доступны

возвращение;

)

если (CH == 0xF0) (

keyReleased = 1;

), Если другое (CH == 0xE0) (

keyModifier = 1;

), Если другое (CH == 0xE1) (

keyModifier = 2;

), Если другое (CH == 0xAA) (

/ / Необходимо реинициализации клавиатура

kbd_initialize (); / / PowerOn: инициализации клавиатуры и пустые kbdbuffer []

kbdbytes = 0;

uniKey = 0;

kbdNewChar (); / / Инициализация переменных используется эта функция (keyRelease, keyModifier, ...)

возвращение;

), Если другое (CH <0x84) (

если (keyModifier == 0) (

переключатель (CH) (

дело 0x12: / / LEFT SHIFT

дело 0x59: / / сдвиг вправо

kbd_table.shift =! keyReleased; перерыва;

дело 0x14: / / LEFT CONTROL

kbd_table.ctrl =! keyReleased; перерыва;

дело 0x11: / / LEFT ALT

kbd_table.alt =! keyReleased; перерыва;

дело 0x58: / / CAPS LOCK

если (keyReleased == 1) (

kbd_table.capsLock ^ = 1;

kbd_initialize ();

) Перерыва;

дело 0x77: / / NUM LOCK

если (keyReleased == 1) (

kbd_table.numLock ^ = 1; / / Num Lock всегда активных!

kbd_initialize ();

) Перерыва;

случае 0x7E: / / SCROLL LOCK

если (keyReleased == 1) (

kbd_table.scrollLock ^ = 1;

kbd_initialize ();

) Перерыва;

дело 0x07: / / F12

если (lastUniKey! = K_F12 | | keyReleased) (

uniKey = K_F12;

если (keyReleased)

uniKey | = 0x80;

)

брейк;

по умолчанию:

uniKey = key2uni [CH];

если (keyReleased) (

uniKey | = 0x80;

)

)

kbdNewChar ();

возвращение;

), Если другое (keyModifier == 1) (

переключатель (CH) (

дело 0x14: / / ПРАВО УПРАВЛЕНИЯ

kbd_table.ctrl = 1 ^ keyReleased; перерыва;

дело 0x11: / / Право ALT

kbd_table.alt = 1 ^ keyReleased; перерыва;

случае 0x4A: / / Клавиатуры /

uniKey = 0x25; перерыва;

случае 0x5A: / / Keypad ENTER

uniKey = K_ENTER; перерыва;

случае 0x6B: / / K_LEFT

uniKey = K_LEFT; перерыва;

дело 0x74: / / K_RIGHT

uniKey = K_RIGHT; перерыва;

дело 0x72: / / K_DOWN

uniKey = K_DOWN; перерыва;

дело 0x75: / / K_UP

uniKey = K_UP; перерыва;

дело 0x70: / / K_INSERT

uniKey = K_INSERT; перерыва;

дело 0x71:

uniKey = K_DELETE; перерыва;

0x6c случае:

uniKey = K_HOME; перерыва;

дело 0x69:

uniKey = K_END; перерыва;

0x7d случае:

uniKey = K_PGUP; перерыва;

0x7a случае:

uniKey = K_PGDOWN; перерыва;

0x7c случае:

uniKey = K_SYSRQ; перерыва;

)

если (keyReleased) (

uniKey | = 0x80;

)

kbdNewChar ();

возвращение;

), Если другое (keyModifier == 2) (

если (keyReleased == 0) (

# ifdef DEBUGKBD

rs232putchar ( 'E');

rs232putchar ('1 ');

rs232putchar ( '');

rs232putbyte2hex (ГЖД, '');

# ENDIF

)возвращение;

)

)

)

)недействительным kbd_sendData (uchar данных) (

/ / Подготовить для передачи команд на клавиатуре, а затем подождать

/ / До тех пор, пока Израиль закончит вещание, ждать, пока ACK и ретранслировать команды

/ / Если Noack:.

uchar I, J, CH;для (i = 5; I, I -) (

kbdtx = 1; / / рассказать прерывать обычные для TX данных

kbdbyte = данные;

kbdbits = 0;

kbdoddparity = 0;

kbderr = 0;

kbdto = 20 / / клавиатура должна завершить операцию в течение 15ms

kbdintmask = 1;

kbdclk = 0; / / тянуть часами низким

kbdclkm = 0;

для (J = 0; J <100; J ) / / ждать 100uS

kbddata = 0; / / извлечения данных на низком уровне, затем отпустите часы

kbddatam = 0;

для (J = 0; J <10; J );

kbdclk = 1;

kbdclkm = 1;

kbdintflag = 0;

kbdintmask = 0;

/ / OK, начать разрядных было передано, а затем прервать текущее сделает остальное/ / Подождать до тех пор, пока данные будут TXed

для (J = 100; J; J -) (

unconditionalmsleep (2);

если (kbdtx == 0)

брейк;

)

kbdNewChar ();

если (J == 0) (

kbdtx = 0;

kbddata = 1; / / клавиатура не связаны: набор kbd_data в качестве входных, то выход

kbddatam = 1;

возвращение;

)

если (kbderr) (

# ifdef DEBUGKBD

rs232puts ( "kbd_sendData: Данные TXed, но получил NACK \ N");

# ENDIF

unconditionalmsleep (10); / / передаваемых данных, но не признал

продолжать;

)

для (J = 25; J; J -) (

/ / Ждать ACK

unconditionalmsleep (2);

а (getKeyStroke (И СН), CH) (

kbdNewChar ();

если (CH == 0xfa)

брейк;

)

если (CH == 0xfa) (

возвращение;

), Если другое (CH) (

# ifdef DEBUGKBD

rs232puts ( "kbd_sendData: получил ответ 0x");

rs232putbyte2hex (ГЖД, '\ N');

# ENDIF

)

)

)

)
kbd_initialize недействительным (недействительными) (

/ / Сброс клавиатуры курса И светодиоды соответственно kbd_table структура

/ / Должна вызываться после клавиатура powerOn (когда клавиатура отправить 0xAA данные)

unconditionalmsleep (20);

/ / Не изменить курс и задержка ...
умолчанию 10.9cps и 500ms

/ / kbd_sendData (KBD_CMD_SET_RATE);

/ / kbd_sendData (0x00); / / максимальная ставка, минимальная задержка

kbd_sendData (KBD_CMD_SET_LEDS);

kbd_sendData (kbd_table.scrollLock | (kbd_table.numLock <<1) | (kbd_table.capsLock <<2));

kbdNewChar ();

uniKey = 0;

)kbdinit недействительным (недействительными) (

kbdclk = 1; / / kbdclock = вывода

kbdclkm = 1;

kbdclku = 1;

kbddata = 1;

kbddatam = 1;

kbddatau = 1;

kbdintegp = 0;

kbdintegn = 1;

kbdintflag = 0;

kbdintmask = 0;

kbdintprio = 1;

kbdtx = 0;

kbdbytes = 0;

kbdbits = 0;

kbdbyte = 0;

kbdbit = 0;

kbderr = 0;

kbdoddparity = 0;

kbdto = 0;

kbd_table.capsLock = 0;

kbd_table.scrollLock = 0;

kbd_table.numLock = 1;

kbd_table.shift = 0;

kbd_table.alt = 0;

kbd_table.ctrl = 0;

/ / Инициализация клавиатуры только тогда, когда 0xAA (PowerOn) будут получены

/ / Kbd_initialize ();

)статические прервать [INTP3_vect] kbdinterrupt недействительным (недействительными) (

/ / Каждый раз призвали в kbdclk идет низкими => защелки должны kbddata

если (kbdto == 0) (/ / Контроль клавиатуры тайм (2 мс для получения клавиш

kbderr = 0;

kbdbits = 0;

kbdoddparity = 0;

kbdto = 3 / / keyboad установить тайм-аут

kbdtx = 0;

kbddata = 1;

kbddatam = 1;

)

если (kbdtx) (

/ / Передать клавиатура

kbdbits ;

если (kbdbits <= 8) (

если (kbdbyte И 1) (

kbdoddparity ^ = 1;

kbddata = 1;

() Другое

kbddata = 0;

)

kbdbyte>> = 1;

), Если другое (kbdbits == 9) (

/ / Передать паритет

kbddata = ~ kbdoddparity;), Если другое (kbdbits == 10) (

/ / Передать стоповый бит

kbddata = 1;

kbddatam = 1;

), Если другое (kbdbits == 11) (

/ / Получить признать

kbderr = kbddata;

kbdtx = 0;

kbdto = 0;

)

() Другое

/ / Получения от клавиатуры

kbdbit = kbddata / / чтения данных

если (kbdbits == 0) (

если (kbdbit) (

/ / Контроль начать бит (должна быть равна нулю!)

kbderr = 1;

)

), Если другое (kbderr == 0) (

если (kbdbits> = 1 И И kbdbits <= 8) (

kbdbyte>> = 1;

если (kbdbit) (

kbdbyte | = 0x80;

kbdoddparity ^ = 1;

)

), Если другое (kbdbits == 9) (

/ / Паритета битных

если (kbdbit == kbdoddparity) (

kbderr = 1;

)

), Если другое (kbdbits == 10) (

/ / Стоповый бит

если (kbdbit == 0) (

kbderr = 1;

)

)

)

если (( kbdbits) == 11) (

если (kbderr == 0) (

/ / Нет ошибки => Store получили байт с kbdbuffer

kbdbuffer [kbdbytes] = kbdbyte;

если (( kbdbytes) == KBDBUFFERLEN) (

kbdclk = 0; / / потянув kbddata низким, клавиатура связи будут ингибируетсяkbdclkm = 0;

)

kbdtimeout = KBDTIMEOUT;

)

kbdto = 0;

)

)

kbdintflag = 0; / / сбросить флаг прерывания

)uchar kbdAsciiConv (недействительными) (

/ / Читать uniKey глобальные переменные: 0 вернуться не ASCII

если (uniKey И 0x80 | | uniKey == 0)

возврат 0; / / ключ выпущена или неизвестное

И uniKey = 0x7f;

если (uniKey <= 26) (

если (kbd_table.shift ^ kbd_table.capsLock) (

вернуться shiftuni2ascii [uniKey];

() Другое

вернуться uni2ascii [uniKey];

)

), Если другое (uniKey <= 0x30) (

если (kbd_table.shift) (

вернуться shiftuni2ascii [uniKey];

() Другое

вернуться uni2ascii [uniKey];

)

), Если другое (uniKey <UNI2ASCIILEN) (

вернуться uni2ascii [uniKey];

)

возврат 0;

)
 
Привет IanP,

Как определить kbd_struct?
Я хочу, чтобы, если я мог бы сделать этот код работать для меня.У меня уже есть функционирования клавиатуры на базе Atmel appnote, но у него глюки и не принимающие на клавиатуре комм.Я также как и идея о том, что я мог бы просто установить прервать края на этот код один раз вместо flipping краю каждого прерывания, как это в appnote.

TIA

 

Welcome to EDABoard.com

Sponsor

Back
Top