인터페이스 키보드!

S

seanthearakh

Guest
당신은 ASM는 고맙지만, 무엇이 필요 한 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; / / 키스트 로크 사이비 - 유니 코드 형식으로 변환 () 128bit 서명

saddr UCHAR lastUniKey; / / 사이비에 매장 이전 키 - 유니 코드 형식

비트 keyReleased; / / 1면 키받은 F0saddr UCHAR kbdbytes; 바이트 키보드에서받은 / / 번호

saddr UCHAR kbdbuffer [KBDBUFFERLEN]; / / 키보드 버퍼

UCHAR kbdbits;받은 비트 / / 숫자 (비트 포함)를 시작합니다

UCHAR kbdbyte; / / 수신 바이트

UCHAR kbdto하며, 키스트 로크 수신 / / 시간

비트 kbdtx; / / 1 때 키보드로, 0 때 수신 전송

비트 kbdbit; / / 비트 접수

비트 kbdoddparity; / / 1 패리티 비트의 경우 전에 홀수

비트 kbderr; / / 1면 어떤 오류kbd_table kbd_struct 구조체;/ / E는 C N을 연구 유

const UCHAR uni2ascii [UNI2ASCIILEN] = "abcdefghijklmnopqrstuvwxyz0123456789 \ \ '\ x8d \ x8a \ x95 서울 \ x85 \ x97 >,.-. 0123456789 -* /";

/ / é * ç ° §

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

/ / 0 8월 4일 C 0 8월 4일 C 0 8월 4일 C 0 8월 4일 C 0/ /지도 키지도 유니 코드와 유사합니다.

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 난;

(kbdbytes) (

* 채널 =* kbdbuffer;

kbdbytes -;

은 (i = 0; 난 <kbdbytes; 난 )

kbdbuffer [나] = kbdbuffer [내가 1];

만약 (kbdbytes == KBDBUFFERLEN - 1) (

kbdclk = 1; / / release를 다시 활성화할 kbdclk 키보드 rx로

kbdclkm = 1;

)

# ifdef DEBUGKBD

rs232putbyte2hex ((UCHAR) * 채널, '\ n'을);

# 각각 endif

반환;

) 다른 (

* 채널 = 0;

반환;

)

)/ / 새로운 숯불 때, 변수는 다시 초기화를받은 (kbdGetChar하여 사용)

# kbdNewChar () (keyModifier = 0; keyReleased = 0 정의;)/ uniKey 문자 kbdbuffer에서 읽고, 0에 해당하는 경우에는 문자 * * 돌아가기 /

무효 kbdGetChar (무효) (

UCHAR 채널;

이 시점 i /로 /에서 읽습니다 :

/ / 대답
새 전체 또는 부분 키

/ / b.
이전에받은 부분 키스트 로크의 완료

/ / C.
이전에받은 부분 키스트 로크의 다른 부분(uniKey)

lastUniKey = uniKey;

uniKey = 0; / / 제로 (해당되는 경우는 "신경 안써"키를 누르면 유용 / 릴리스) uniKey 초기화

(1)은 (

getKeyStroke (& 채널); / / 키스트 로크의 다음 부분을 채널에 저장됩니다

만약 (채널 == 0) (

/ / 아니 키에 해당하는

반환;

)

만약 (채널 == 0xF0) (

= 1 keyReleased;

) 다른 경우 (채널 == 0xE0) (

keyModifier = 1;

) 다른 경우 (채널 == 0xE1) (

keyModifier = 2;

) 다른 만약 (벼 == 0xaa) (

/ / 키보드를 다시 초기화해야합니다

kbd_initialize (); / / PowerOn : [키보드와 빈 kbdbuffer 초기화]

kbdbytes = 0;

uniKey = 0;

kbdNewChar (); / / 초기화 변수가이 함수에 의해 (keyRelease, keyModifier, ...)을 사용

반환;

) 다른 경우 (채널 <0x84) (

만약 (keyModifier == 0) (

(차) 스위치 (

사건 0x12 : / / Shift를 좌

사건 0x59 : / / 오른쪽 Shift를

kbd_table.shift =! keyReleased; 휴식;

사건 0x14 : / / 제어 좌

kbd_table.ctrl =! keyReleased; 휴식;

사건 0x11 : / /에는 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; / / 인분 포함 항상 활성 자물쇠!

kbd_initialize ();

) 휴식;

사건 0x7E : / / 조절 잠금

(keyReleased == 1) (

kbd_table.scrollLock ^ = 1;

kbd_initialize ();

) 휴식;

사건 0x07 : / /에서는 F12

만약 (lastUniKey! = K_F12 | | keyReleased) (

uniKey = K_F12;

만약 () keyReleased

uniKey | = 0x80으로;

)

휴식;

기본값 :

uniKey = key2uni [채널];

만약 () keyReleased (

uniKey | = 0x80으로;

)

)

kbdNewChar ();

반환;

) 다른 경우 (keyModifier == 1) (

(차) 스위치 (

사건 0x14 : / / 오른쪽 제어

kbd_table.ctrl = 1 ^ keyReleased; 휴식;

사건 0x11 : / / 오른쪽 Alt

kbd_table.alt = 1 ^ keyReleased; 휴식;

사건 0x4A : / / 키패드 /

uniKey = 0x25; 휴식;

사건 0x5A : / / 키패드 입력하고 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 데이터) (

/ / 키보드로 명령의 전송을 위해, 다음을 준비 기다려

/ / 때까지 끝내 ISR 전송, 응답을 기다 렸 명령 재전송

/ / 만약 NOACK.

UCHAR 난, 일본, 벼;은 (i = 5; 난; 난 -) (

kbdtx = 1; / / 루틴을 방해 데이터를 텍사스로 말해

kbdbyte = 데이터;

kbdbits = 0;

kbdoddparity = 0;

kbderr = 0;

kbdto = 20; / / 키보드 15ms 이내에 작업을 완료해야합니다

kbdintmask = 1;

kbdclk = 0; / / 클럭이 낮은 당겨

kbdclkm = 0;

(일본 = 0; j를 <100; j를 ); / / 100uS 나올 때까지 기다리는 것이

kbddata = 0; / / 다음 데이터를 낮은 클럭 릴리스, 당겨

kbddatam = 0;

(일본 = 0; j를 <10; j를 );

kbdclk = 1;

kbdclkm = 1;

= 0 kbdintflag;

kbdintmask = 0;

/ / 좋아요, 시작 비트, 그리고 나머지는 할 것입니다 루틴 인터럽트 전송 됐습니다데이터 TXed 될 때까지 / / 기다려

(일본 = 100; 일본; 일본 -) (

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); / / 데이터가 전송되지 인정하지만

계속;

)

(일본 = 25; 일본; 일본 -) (

/ / ACK는 나올 때까지 기다리는 것이

unconditionalmsleep (2);

동안 (getKeyStroke (& 채널), 채널) (

kbdNewChar ();

만약 (채널 == 0xfa)

휴식;

)

만약 (채널 == 0xfa) (

반환;

) 다른 경우 (벼) (

# ifdef DEBUGKBD

rs232puts ( "kbd_sendData :") 대답 0x있어;

rs232putbyte2hex (, '채널 \ n'을);

# 각각 endif

)

)

)

)
(무효) kbd_initialize 무효 (

/ / 리셋 키보드 속도 & kbd_table 구조에 따라 LED가

/ / 키보드 powerOn 후 (키보드) 0xaa라는 데이터를 전송해야합니다

unconditionalmsleep (20);

/ / 속도와 지연을 변경하지 마십시오 ...
기본 10.9cps와 500ms이다

/ / kbd_sendData (KBD_CMD_SET_RATE);

/ / (0x00); / / 최대 속도, 최소 지연 kbd_sendData

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;

= 0 kbdintflag;

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 정적 (

/ / 매번 the kbdclk = 낮은가는라는> kbddata 래치합니다

만약 (kbdto == 0) (/ / 컨트롤 키보드 시간 (2 미시시피 a 키 입력을받을

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) (

/ / 아무런 오류 => 저장할 kbdbuffer 바이트 접수

kbdbuffer [kbdbytes] = kbdbyte;

만약 (( kbdbytes) == KBDBUFFERLEN) (

kbdclk = 0; / / 당기는 낮은, 키보드 커뮤니케이 션을 저해한다 kbddatakbdclkm = 0;

)

kbdtimeout = KBDTIMEOUT;

)

kbdto = 0;

)

)

= 0 kbdintflag; / / Reset 플래그가 인터럽트

)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에 키보드를 기본 기능을 가지고 있지만 고장이 키보드와 통신하는 호스트.나는 아이디어는 그냥 그것 appnote에있는이 코드를 한 번 튀기는 대신 모든 인터럽트 가장자리 가장자리에 방해가 설정할 수도 좋아.

TIA는

 

Welcome to EDABoard.com

Sponsor

Back
Top