📄 38.c
字号:
程序三十九 PC键代码
/*
芯片: AT90S4434
频率: 8,000000 MHz
模式: Tiny
*/
#include <90s4434.h>
#include "kb.h"
#include <delay.h>
#asm
.equ __lcd_port=0x15
#endasm
#include <lcd.h>
// 全局变量
void main(void)
{
// 局域变量
unsigned char key;
// Port A
PORTA=0x00;
DDRA=0x00;
// Port B
PORTB=0x00;
DDRB=0x00;
// Port C
PORTC=0x00;
DDRC=0x00;
// Port D
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2
TCCR2=0x00;
ASSR=0x00;
TCNT2=0x00;
OCR2=0x00;
// INT0: Oon
// INT1: Off
GIMSK= 0x40; // 开INT0
MCUCR=0x00;
TIMSK=0x00;
// 模拟初始化
ACSR=0x80;
//lcd初始化
lcd_init(16);
InitKeyBoard(); // 键盘初始化
while(1)
{
key = getchar_kb();
lcd_putchar(key);
delay_ms(5);
}
}
//KB.C代码
#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; //初始化缓冲
outpt = kb_buffer;
buffcnt = 0;
MCUCR = 2; // INT0
edge = 0; // 0 = 降沿 1 = 升沿
bitcount = 11;
#asm("sei") //开中断
}
interrupt [EXT_INT0] void INT0_interrupt(void)
{
static unsigned char data;
if(bitcount < 11 && bitcount > 2) // Bit 3 to 10.
{
data = (data >> 1);
if(PIND & 8)
data = data | 0x80; // 存储 '1'
}
if(--bitcount == 0) //所有位接收
{
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 是 up-key
{
switch (sc)
{
case 0xF0 : // up-key
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;
if(mode == 2)
mode = 3;
break;
default:
if(mode == 0 || mode == 3) // 假如ASCII mode
{
if(!shift) // 假如没按shift
{ // 查 table
for(i = 0; unshifted[i][0]!=sc && unshifted[i][0]; i++);
if (unshifted[i][0] == sc)
{
put_kbbuff(unshifted[i][1]);
}
} else { //假如按shift
for(i = 0; shifted[i][0]!=sc && shifted[i][0]; i++);
if (shifted[i][0] == sc)
{
put_kbbuff(shifted[i][1]);
}
}
} else{ // 扫描 code mode
print_hexbyte(sc);
put_kbbuff(' ');
}
break;
}
} else {
is_up = 0;
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<BUFF_SIZE) // 假如buffer 没满
{
*inpt = c;
inpt++;
buffcnt++;
if (inpt >= kb_buffer + BUFF_SIZE)
inpt = kb_buffer;
}
}
int getchar_kb(void)
{
int byte;
while(buffcnt == 0); // 等data
byte = *outpt; // 得byte
outpt++;
if (outpt >= kb_buffer + BUFF_SIZE)
outpt = kb_buffer;
buffcnt--;
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 通讯
#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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -