C-kode for PC Keyboard Interface - Wanted!

S

Smokey

Guest
Hei!

Jeg leter etter en klar til bruk 'C' koden (Keil51 V7.x fortrinnsvis) til grensesnittet en standard PC-tastatur til en standard 8051 mikroorganismer.

Jeg har tenkt å koble tastaturet clk linje til en ext.Avbrudd i 8051.og sample data linje (på en standard port pin med pull-up) på hver avbruddsordrelinje.Noen kode å gjøre noe sånt som dette ville være perfekt!

Jeg trenger 2 veis kommunikasjon - å skru lysene på tastaturet.

Smokey

 
Hei,
Til referanse http://www.semiconductors.com/acrobat/applicationnotes/AN434.pdf

Hilsen
Jackson

 
Takk!

Jeg har sett denne app notat fra Philips før.

For dette prosjektet, er jeg på jakt etter en "C"-versjon (fortrinnsvis skrevet under Keil51 V7.x).Jeg trenger å embedd koden som en del av et større fastvare.Jeg ønsker å bruke PC-tastatur Interface som en egen modul - å være sammen conditionally med `ifdef erklæring.

Smokey

 
Mange takk!

Koden virker 'akkurat hva legen organisert!

Smokey ...over
og ut!

 
/************************************************* *******************
Tastaturet til å I2C.Les under avbruddsordrelinje fra en IBM-tastaturet
LPC config = 0xf8
************************************************** ******************/
#
include <reg764.h>
#
include <mydefs.h>

//----------------------------------- I2C rutiner
extern void init_I2C (void);
extern void slaveI2C (void);

extern uchar koden kbtable []; / / tabell

//----------------------- Globals
bit rx_flag;
uchar kdata, key_data;

//------------------------ Pin defs
sbit KB_DAT = P0 ^ 3;

/*------------------------------------------------ --------------------------
*************************** MAIN PROGRAM ********************* ************
-------------------------------------------------- ----------------------*/
main () (

WDRST = 0x1e; / / reset vaktbikkje
WDRST = 0xe1;
WDCON = 0x06;
osv.WDRST = 0x1e;
WDRST = 0xe1;

EX1 = IT1 = 1; / / ekstern avbruddsordrelinje
init_I2C ();
EA = 1;

/************************************************* ******************/
mens (1) (
WDRST = 0x1e; / / feed Watchdog
WDRST = 0xe1;
//--------------------------------------
if (rx_flag == 1) (
statiske uchar KDA [3];
rx_flag = 0;
KDA [2] = KDA [1]; KDA [1] = KDA [0]; KDA [0] = kdata; / / push

if (KDA [0]! = 0xf0 & & KDA [0]! = 0xe0) (/ / hvis faktiske data
if (KDA [1] == 0xe0) (/ / prev utvidet
KDA [0] | = 0x80; / / konvertere data til utvidet
KDA [1] = KDA [2]; / / trekke tilbake 1 etappe
)
if (KDA [1] == 0xf0) (/ / prev var Break koden
key_data = 0x00; / /
slaveI2C (); / / sted i I2C buffer
/ / KDA [0] = KDA [1] = KDA [2] = 0x00;
)
else (/ / gyldige data håndtering
key_data = kbtable [KDA [0]];
slaveI2C (); / / sted i I2C buffer
/ / KDA [0] = KDA [1] = KDA [2] = 0x00;
))
)
//---------------------------------------
))

/************************************************* *******************
Keyboard klokken avbruddsordrelinje
Mottar Synkron data 11 biter (Start, 8, P, Stopp)
************************************************** ******************/
ext1_isr () avbruddsordrelinje 2 (
uchar koden maske [8] = (0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80);
statiske uchar KD; / / data Byte RXed
statiske uchar bit_cntr;
bit captBIT; / / fanget Data Bit

captBIT = KB_DAT;

if (bit_cntr == 0 & & captBIT == 0) (/ / start BIT 0
bit_cntr = 1;
KD = 0; / / Initialiser data
)
else if (bit_cntr! = 0 & & bit_cntr <9) (/ / 8 databit
if (captBIT == 1) KD | = maske [bit_cntr-1]; / / rotere
bit_cntr = 1;
)
else if (bit_cntr == 9) (/ / 9nde bit (paritetsbit?)
bit_cntr = 1;
)
else if (bit_cntr == 10 & & captBIT == 1) (/ / stoppbit
bit_cntr = 0;
kdata = KD;
rx_flag = 1;
)
else (/ / rammer feil
bit_cntr = 0;
)
)

 

Welcome to EDABoard.com

Sponsor

Back
Top