PC键盘与AVR单片机连接的C语言源程序
** low level kexboard routines VERSION 1.0
******************************/
#include "kb.h"
#include "scancodes.h"
#define BUFF_SIZE 64
unsigned char edge, bitcount; // 0 = neg. 1 = pos.
unsigned char kb_buffer[BUFF_SIZE];
unsigned char *inpt, *outpt;
unsigned char buffcnt;
void InitKeyBoard(void)
{
inpt = kb_buffer; // Initialize buffer
outpt = kb_buffer;
buffcnt = 0;
MCUCR = 2; // INT0 interrupt on falling edge
edge = 0; // 0 = falling edge 1 = rising edge
bitcount = 11;
#asm("sei") // interrupt enable
}
interrupt [EXT_INT0] void INT0_interrupt(void)
{
static unsigned char data; // Holds the received scan code
if(bitcount < 11 && bitcount > 2) // Bit 3 to 10 is data. Parity bit,
{ // start and stop bits are ignored.
data = (data >> 1);
if(PIND & 8)
data = data | 0x80; // Store a 1
}
if(--bitcount == 0) // All bits received
{
decode(data);
bitcount = 11;
}
}
void decode(unsigned char sc)
{
static unsigned char is_up=0, shift = 0, mode = 0;
unsigned char i;
if (!is_up) // Last data received was the up-key identifier
{
switch (sc)
{
case 0xF0 : // The up-key identifier
is_up = 1;
break;
case 0x12 : // Left SHIFT
shift = 1;
break;
case 0x59 : // Right SHIFT
shift = 1;
break;
case 0x05 : // F1
if(mode == 0)
mode = 1; // Enter scan code mode
if(mode == 2)
mode = 3; // Leave scan code mode
break;
default:
if(mode == 0 || mode == 3) // If ASCII mode
{
if(!shift) // If shift not pressed,
{ // do a table look-up
for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);
if (unshifted[i][0] == sc) {
put_kbbuff(unshifted[i][1]);
}
} else { // If shift pressed
for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
if (shifted[i][0] == sc) {
put_kbbuff(shifted[i][1]);
}
}
} else{ // Scan code mode
print_hexbyte(sc); // Print scan code
put_kbbuff( );
}
break;
}
} else {
is_up = 0; // Two 0xF0 in a row not allowed
switch (sc)
{
case 0x12 : // Left SHIFT
shift = 0;
break;
case 0x59 : // Right SHIFT
shift = 0;
break;
case 0x05 : // F1
if(mode == 1)
mode = 2;
if(mode == 3)
mode = 0;
break;
case 0x06 : // F2
// clr();
break;
}
}
}
void put_kbbuff(unsigned char c)
{
if (buffcnt
*inpt = c; // Put character into buffer
inpt++; // Increment pointer
buffcnt++;
if (inpt >= kb_buffer + BUFF_SIZE) // Pointer wrapping
inpt = kb_buffer;
}
}
int getchar_kb(void)
{
int byte;
while(buffcnt == 0); // Wait for data
byte = *outpt; // Get byte
outpt++; // Increment pointer
if (outpt >= kb_buffer + BUFF_SIZE) // Pointer wrapping
outpt = kb_buffer;
buffcnt--; // Decrement buffer count
return byte;
}
void print_hexbyte(unsigned char i)
{
unsigned char h, l;
h = i & 0xF0; // High nibble
h = h>>4;
h = h + 0;
if (h > 9)
h = h + 7;
l = (i & 0x0F)+0; // Low nibble
if (l > 9)
l = l + 7;
put_kbbuff(h);
put_kbbuff(l);
}
kb.h// Keyboard communication routines
#ifndef __KB_INCLUDED
#define __KB_INCLUDED
#include <90s4434.h>
#define CLOCK 2
#define DATAPIN 3
#define ISC00 0
#define ISC01 1
void InitKeyBoard(void);
interrupt [EXT_INT0] void INT0_interrupt(void);
void decode(unsigned char sc);
void put_kbbuff(unsigned char c);
int getchar_kb(void);
void print_hexbyte(unsigned char i);
#endif
scannodes.h
// Unshifted characters
flash unsigned char unshifted[68][2] = {
0x0d,9,
0x0e,|,
0x15,q,
0x16,1,
0x1a,z,
0x1b,s,
0x1c,a,
0x1d,w,
0x1e,2,
0x21,c,
0x22,x,
0x23,d,
0x24,e,
0x25,4,
0x26,3,
0x29, ,
0x2a,v,
0x2b,f,
0x2c,t,
0x2d,r,
0x2e,5,
0x31,n,
0x32,b,
0x33,h,
0x34,g,
0x35,y,
0x36,6,
0x39,,,
0x3a,m,
0x3b,j,
0x3c,u,
0x3d,7,
0x3e,8,
0x41,,,
0x42,k,
0x43,i,
0x44,o,
0x45,0,
0x46,9,
0x49,.,
0x4a,-,
0x4b,l,
0x4c,?,
0x4d,p,
0x4e,+,
0x52,?,
0x54,?,
0x55,\\,
0x5a,13,
0x5b,?,
0x5d,\\,
0x61,<,
0x66,8,
0x69,1,
0x6b,4,
0x6c,7,
0x70,0,
0x71,,,
0x72,2,
0x73,5,
0x74,6,
0x75,8,
0x79,+,
0x7a,3,
0x7b,-,
0x7c,*,
0x7d,9,
0,0
};
// Shifted characters
flash unsigned char shifted[68][2] = {
0x0d,9,
0x0e,?,
0x15,Q,
0x16,!,
0x1a,Z,
0x1b,S,
0x1c,A,
0x1d,W,
0x1e,",
0x21,C,
0x22,X,
0x23,D,
0x24,E,
0x25,?,
0x26,#,
0x29, ,
0x2a,V,
0x2b,F,
0x2c,T,
0x2d,R,
0x2e,%,
0x31,N,
0x32,B,
0x33,H,
0x34,G,
0x35,Y,
0x36,&,
0x39,L,
0x3a,M,
0x3b,J,
0x3c,U,
0x3d,/,
0x3e,(,
0x41,;,
0x42,K,
0x43,I,
0x44,O,
0x45,=,
0x46,),
0x49,:,
0x4a,_,
0x4b,L,
0x4c,?,
0x4d,P,
0x4e,?,
0x52,?,
0x54,?,
0x55,`,
0x5a,13,
0x5b,^,
0x5d,*,
0x61,>,
0x66,8,
0x69,1,
0x6b,4,
0x6c,7,
0x70,0,
0x71,,,
0x72,2,
0x73,5,
0x74,6,
0x75,8,
0x79,+,
0x7a,3,
0x7b,-,
0x7c,*,
0x7d,9,
0,0
};
PC键盘AVR单片机C语 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)