📄 kb.c
字号:
#include <iom128v.h>
#include "pindefs.h"
#include "scancodes.h"
#define BUFF_SIZE 64
extern void delay_ms(unsigned int time);
const ascii[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,
0x39,0x41,0x42,0x43,0x44,0x45,0x46};
unsigned char bitcount;
unsigned char kb_buffer[BUFF_SIZE];
unsigned char input=0;
unsigned char output=0;
extern void cls(unsigned x,unsigned y,unsigned char high,unsigned char width);
extern void asc_tran(unsigned char x,unsigned char y,unsigned char *asc_p);
extern void ocmj_write(unsigned char data);
extern void hz_tran(unsigned char x,unsigned char y,unsigned char *hz_p);
extern void delay_ms(unsigned int n);
void put_kbbuff(unsigned char c)
{
kb_buffer[input]=c;
if (input<(BUFF_SIZE-1))
input++;
else
input=0;
}
unsigned char getchar(void)
{
unsigned char temp;
if(output==input)
return 0;
else
{
temp=kb_buffer[output];
if(output<(BUFF_SIZE-1))
{
output++;
}
else
output=0;
return temp;
}
}
void init_kb(void)
{
EICRB=0x02;
bitcount = 11;
}
void decode(unsigned char sc)
{
static unsigned char shift,up,shiftup;
unsigned char i;
if (sc==0xf0)
{
up=1;
return;
}
if (up==1)
{
up=0;
if ((sc==0x12)|(sc==0x59)) shift=0;
return;
}
if(sc==0x71)
{
ocmj_write(0xf4);
hz_tran(1,1,"将要重新启动");
asm("wdr");
WDTCR=(1<<WDCE)|(1<<WDE);
WDTCR|=(1<<WDP0)|(1<<WDP1)|(1<<WDP2);//大约2秒
while(1)
;
//delay_ms(3000);
}
switch (sc)
{
case 0x12:{
shift=1;
shiftup=1;
}
case 0x59:{
shift=1;
shiftup=1;
}
default:{
if (shift==0)
{
for(i = 0;unshifted[i][0]!=sc && unshifted[i][0]; i++);
if (unshifted[i][0] == sc)
put_kbbuff(unshifted[i][1]);
}
else
{
for(i = 0;shifted[i][0]!=sc && shifted[i][0]; i++);
if (shifted[i][0] == sc)
{
put_kbbuff(shifted[i][1]);
}
}
}
}
/*debug
kb_buffer[1]=ascii[sc%16];
sc=sc/16;
kb_buffer[0]=ascii[sc%16];
debug*/
}
#pragma interrupt_handler int4_isr:6
void int4_isr(void)
{
static unsigned char data;
/*if((bitcount < 11)&(bitcount > 2))
{
data = (data >> 1);
if((PINE&0x20)!=0)
data|=0x80;
}
if (--bitcount==0)
{
bitcount=11;
decode(data);
}*/
switch (bitcount)
{
case 11:{
if ((PINE&0x20)!=0)
return;
else
bitcount--;
break;}
case 2:{
bitcount--;
break;}
case 1:{
bitcount--;
if ((PINE&0x20)==0)
{
bitcount=11;
return;
}
else
{
bitcount=11;
decode(data);
}
break;}
default:{
data = (data >> 1);
if((PINE&0x20)!=0)
data|=0x80;
bitcount--;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -