Interface toetsenbord!

S

seanthearakh

Guest
dank voor uw asm, maar wat ik nodig heb is in C, Please help me!

<img src="http://www.edaboard.com/images/smiles/icon_cry.gif" alt="Huilen of zeer triest" border="0" />
 
Wat dacht je van dit spul:
Code:

# pragma language = uitgebreid

# include <df0034.h>

# include "keyboard.h"

# include "infhotel.h"

# include "rtc.h"

# include "lang.h"

# include "rs232.h"uchar keyModifier / / E0, E1,

saddr uchar uniKey / / toetsaanslag geconverteerd naar pseudo-Unicode-formaat (ondertekend 128bit)

saddr uchar lastUniKey / / Store vorige sleutel in pseudo-Unicode-formaat

bits keyReleased; / / 1 indien F0 toetsaanslag ontvangensaddr uchar kbdbytes; / / aantal bytes ontvangen van toetsenbord

saddr uchar kbdbuffer [KBDBUFFERLEN]; / / keyboard buffer

uchar kbdbits; / / aantal ontvangen bits (start bits inclusief)

uchar kbdbyte; / / ontvangen byte

uchar kbdto / / time-out voor een toetsaanslag ontvangst

bits kbdtx; / / 1 bij het doorgeven aan het toetsenbord, 0 bij ontvangst

bits kbdbit / / ontvangen bits

bits kbdoddparity; / / 1 als oneven aantal bits voor pariteit

bits kbderr; / / 1 eventuele foutenstruct 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 8 4 C 0 4 8 C 0 8 4 C 0/ / Kaart toetsaanslagen op een kaart die vergelijkbaar zijn met 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, waarde 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

);void getKeyStroke (uchar * ch) (

/ / Geeft de eerste toetsaanslag in het kbdbuffer []

uchar i;

if (kbdbytes) (

* ch =* kbdbuffer;

kbdbytes -;

for (i = 0; i <kbdbytes; i )

kbdbuffer = kbdbuffer [i 1];

if (kbdbytes == KBDBUFFERLEN-1) (

kbdclk = 1; / / release kbdclk bij opnieuw inschakelen toetsenbord rx

kbdclkm = 1;

)

# ifdef DEBUGKBD

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

# endif

terugkeer;

) Else (

* ch = 0;

terugkeer;

)

)/ / Wanneer nieuwe char werd ontvangen, opnieuw variabele (gebruikt door kbdGetChar)

# define kbdNewChar () (keyModifier = 0; keyReleased = 0;)/ * Return uniKey in het teken van lezen kbdbuffer, 0 als er geen tekens beschikbaar * /

void kbdGetChar (void) (

uchar ch;

/ / Op dit punt zal ik lezen:

/ / A.
nieuwe, volledige of gedeeltelijke toetsaanslag

/ / B.
voltooiing van de vorige gedeeltelijke toetsaanslag

/ / C.
een ander deel van de vorige gedeeltelijke toetsaanslagif (uniKey)

lastUniKey = uniKey;

uniKey = 0; / / Initialiseer uniKey op nul te zetten (handig als een "niet schelen sleutel" werd ingedrukt / vrijgegeven)

while (1) (

getKeyStroke (& ch); / / slaat in ch het volgende deel van toetsaanslag

if (ch == 0) (

/ / Geen toetsaanslagen beschikbaar

terugkeer;

)

if (ch == 0xF0) (

keyReleased = 1;

) Else if (ch == 0xE0) (

keyModifier = 1;

) Else if (ch == 0xE1) (

keyModifier = 2;

) Else if (ch == 0xAA) (

/ / Moet opnieuw toetsenbord

kbd_initialize (); / / POWERON: initialiseren toetsenbord en lege kbdbuffer []

kbdbytes = 0;

uniKey = 0;

kbdNewChar (); / / Initialiseer de variabelen die worden gebruikt door deze functie (keyRelease, keyModifier, ...)

terugkeer;

) Else if (ch <0x84) (

if (keyModifier == 0) (

switch (ch) (

geval 0x12: / / LEFT SHIFT

geval 0x59: / / RECHTS SHIFT

kbd_table.shift =! keyReleased; break;

geval 0x14: / / links CONTROL

kbd_table.ctrl =! keyReleased; break;

geval 0x11: / / LEFT ALT

kbd_table.alt =! keyReleased; break;

geval 0x58: / / CAPS LOCK

if (keyReleased == 1) (

kbd_table.capsLock ^ = 1;

kbd_initialize ();

) Break;

geval 0x77: / / NUM LOCK

if (keyReleased == 1) (

kbd_table.numLock ^ = 1; / / Num Lock altijd actief!

kbd_initialize ();

) Break;

geval 0x7E: / / SCROLL LOCK

if (keyReleased == 1) (

kbd_table.scrollLock ^ = 1;

kbd_initialize ();

) Break;

geval 0x07: / / F12

if (lastUniKey! = K_F12 | | keyReleased) (

uniKey = K_F12;

if (keyReleased)

uniKey | = 0x80;

)

break;

standaard:

uniKey = key2uni [CH];

if (keyReleased) (

uniKey | = 0x80;

)

)

kbdNewChar ();

terugkeer;

) Anders als (keyModifier == 1) (

switch (ch) (

geval 0x14: / / RECHTS CONTROL

kbd_table.ctrl = 1 ^ keyReleased; break;

geval 0x11: / / RECHTS ALT

kbd_table.alt = 1 ^ keyReleased; break;

geval 0x4A: / / KeyPad /

uniKey = 0x25; break;

geval 0x5A: / / KeyPad ENTER

uniKey = K_ENTER; break;

geval 0x6B: / / K_LEFT

uniKey = K_LEFT; break;

geval 0x74: / / K_RIGHT

uniKey = K_RIGHT; break;

geval 0x72: / / K_DOWN

uniKey = K_DOWN; break;

geval 0x75: / / K_UP

uniKey = K_UP; break;

geval 0x70: / / K_INSERT

uniKey = K_INSERT; break;

geval 0x71:

uniKey = K_DELETE; break;

geval 0x6c:

uniKey = K_HOME; break;

geval 0x69:

uniKey = K_END; break;

geval 0x7d:

uniKey = K_PGUP; break;

geval 0x7a:

uniKey = K_PGDOWN; break;

geval 0x7c:

uniKey = K_SYSRQ; break;

)

if (keyReleased) (

uniKey | = 0x80;

)

kbdNewChar ();

terugkeer;

) Anders als (keyModifier == 2) (

if (keyReleased == 0) (

# ifdef DEBUGKBD

rs232putchar ( "E");

rs232putchar ('1 ');

rs232putchar ( '');

rs232putbyte2hex (CH, '');

# endif

)terugkeer;

)

)

)

)void kbd_sendData (uchar data) (

/ / Bereiden voor de verzending van opdrachten naar het toetsenbord, dan wachten

/ / Tot ISR afwerking transmissies, wachten op de ack en opnieuw het commando

/ / Indien NOACK.

uchar I, J, CH;for (i = 5; i; i -) (

kbdtx = 1; / / vertellen interrupt routine tx gegevens

kbdbyte = gegevens;

kbdbits = 0;

kbdoddparity = 0;

kbderr = 0;

kbdto = 20 / / toetsenbord moet functioneren binnen 15ms

kbdintmask = 1;

kbdclk = 0; / / pull klok laag

kbdclkm = 0;

for (j = 0; j <100; j ); / / wachten op 100uS

kbddata = 0; / / pull gegevens laag is, dan los klok

kbddatam = 0;

for (j = 0; j <10; j );

kbdclk = 1;

kbdclkm = 1;

kbdintflag = 0;

kbdintmask = 0;

/ / Ok, start bits is verstrekt, dan interrupt routine doet de rest/ / Wacht tot gegevens zullen worden TXed

for (j = 100; j; j -) (

unconditionalmsleep (2);

if (kbdtx == 0)

break;

)

kbdNewChar ();

if (j == 0) (

kbdtx = 0;

kbddata = 1; / / toetsenbord niet aangesloten: set kbd_data als input en vervolgens afrit

kbddatam = 1;

terugkeer;

)

if (kbderr) (

# ifdef DEBUGKBD

rs232puts ( "kbd_sendData: Gegevens TXed, maar kreeg NACK \ n");

# endif

unconditionalmsleep (10); / / gegevens, maar niet erkend

blijven;

)

for (j = 25; j; j -) (

/ / Wachten op ACK

unconditionalmsleep (2);

while (getKeyStroke (& ch), ch) (

kbdNewChar ();

if (ch == 0xfa)

break;

)

if (ch == 0xfa) (

terugkeer;

) Else if (ch) (

# ifdef DEBUGKBD

rs232puts ( "kbd_sendData: heb antwoord 0x");

rs232putbyte2hex (CH, '\ n');

# endif

)

)

)

)
void kbd_initialize (void) (

/ / Reset toetsenbord & leds tarief dienovereenkomstig aan kbd_table structuur

/ / Moet worden aangeroepen nadat toetsenbord POWERON (wanneer toetsenbord sturen 0xAA gegevens)

unconditionalmsleep (20);

/ / Niet te wijzigen en een vertraging ...
Standaard is 10.9cps en 500 ms

/ / kbd_sendData (KBD_CMD_SET_RATE);

/ / kbd_sendData (0x00); / / maximale snelheid, minimale vertraging

kbd_sendData (KBD_CMD_SET_LEDS);

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

kbdNewChar ();

uniKey = 0;

)void kbdinit (void) (

kbdclk = 1; / / kbdclock = output

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;

/ / Initialiseer toetsenbord alleen wanneer 0xAA (POWERON) zal worden ontvangen

/ / Kbd_initialize ();

)statische onderbreken [INTP3_vect] nietig kbdinterrupt (void) (

/ / Wordt aangeroepen telkens als de kbdclk gaat lage => moet klinkinrichting kbddata

if (kbdto == 0) (/ / Control toetsenbord timeout (2 ms voor een toetsaanslag

kbderr = 0;

kbdbits = 0;

kbdoddparity = 0;

kbdto = 3; / / set keyboad time-out

kbdtx = 0;

kbddata = 1;

kbddatam = 1;

)

if (kbdtx) (

/ / Aan het toetsenbord

kbdbits ;

if (kbdbits <= 8) (

if (kbdbyte & 1) (

kbdoddparity ^ = 1;

kbddata = 1;

) Else (

kbddata = 0;

)

kbdbyte>> = 1;

) Anders als (kbdbits == 9) (

/ / Zenden pariteit

kbddata = ~ kbdoddparity;) Anders als (kbdbits == 10) (

/ / Zenden stopbit

kbddata = 1;

kbddatam = 1;

) Anders als (kbdbits == 11) (

/ / Get erkennen

kbderr = kbddata;

kbdtx = 0;

kbdto = 0;

)

) Else (

/ / Ontvangst van het toetsenbord

kbdbit = kbddata / / data te lezen

if (kbdbits == 0) (

if (kbdbit) (

/ / Controle start bit (moet ZERO!)

kbderr = 1;

)

) Anders als (kbderr == 0) (

if (kbdbits> = 1 & & kbdbits <= 8) (

kbdbyte>> = 1;

if (kbdbit) (

kbdbyte | = 0x80;

kbdoddparity ^ = 1;

)

) Anders als (kbdbits == 9) (

/ / Parity bit

if (kbdbit == kbdoddparity) (

kbderr = 1;

)

) Anders als (kbdbits == 10) (

/ / Stopbit

if (kbdbit == 0) (

kbderr = 1;

)

)

)

if (( kbdbits) == 11) (

if (kbderr == 0) (

/ / Geen fouten => store ontvangen byte te kbdbuffer

kbdbuffer [kbdbytes] = kbdbyte;

if (( kbdbytes) == KBDBUFFERLEN) (

kbdclk = 0; / / trekken kbddata laag, toetsenbord communicatie zal worden stopgezetkbdclkm = 0;

)

kbdtimeout = KBDTIMEOUT;

)

kbdto = 0;

)

)

kbdintflag = 0; / / reset interrupt vlag

)uchar kbdAsciiConv (void) (

/ / Lees uniKey globale variabele: return 0 niet ascii

if (uniKey & 0x80 | | uniKey == 0)

return 0; / / sleutel vrijgegeven of onbekend

uniKey & = 0x7f;

if (uniKey <= 26) (

if (kbd_table.shift ^ kbd_table.capsLock) (

terugkeer shiftuni2ascii [uniKey];

) Else (

terugkeer uni2ascii [uniKey];

)

) Anders als (uniKey <= 0x30) (

if (kbd_table.shift) (

terugkeer shiftuni2ascii [uniKey];

) Else (

terugkeer uni2ascii [uniKey];

)

) Anders als (uniKey <UNI2ASCIILEN) (

terugkeer uni2ascii [uniKey];

)

return 0;

)
 
Hi IanP,

Hoe is kbd_struct gedefinieerd?
Ik wil zien of ik het kon laten deze code werkt voor mij.Ik heb al functioneren toetsenbord baseren op Atmel appnote, maar het heeft geen glitches en gastheer voor toetsenbord comm.Ik ook graag het idee dat ik zojuist de interrupt rand van deze code een tijd in plaats van flipping de rand elke onderbreken als het in het appnote.

TIA

 

Welcome to EDABoard.com

Sponsor

Back
Top