📄 ps2.c
字号:
//PS2键盘驱动程序,使用第二套扫描码
//CLK接INT0(PD2)使用外部中断0来检测时钟脉冲,DATE接PD1
#include <mega16.h>
#include <delay.h>
#include "avryejing.c"
#define PSCLK_PORT PORTD.2
#define PSDATA_PORT PORTD.1
#define PSCLK_PIN PIND.2
#define PSDATA_PIN PIND.1
#define PSCLK_DDR DDRD.2
#define PSDATA_DDR DDRD.1
unsigned char int0_cnt=0; //中断次数
unsigned char tmp=0;
unsigned char code=0; //键盘发往主机的编码
unsigned char lastcode=0;
unsigned char hang=0;
unsigned char lie=0;
unsigned char kk=0;
bit xiao=0;
bit num_lock=0;
bit caps_lock=0;
bit shift=0;
bit flag=0;//显示标志位
void init_io(void)
{
PSDATA_DDR=0;//主机向键盘发送命令时需要将该端口置为输出
PSCLK_DDR=0;//主机向键盘发送命令时需要将该端口置为输出
//后面会对PORTD进行操作
//液晶初始化
DDRC=0xff;
DDRB=0x0f;
}
void decode(unsigned char code)
{
switch(code) //后退的是小键盘
{
//a-z
case 0x1c: cursor(hang,lie+1);word(hang,lie,33);break;//a
case 0x32: cursor(hang,lie+1);word(hang,lie,34);break;//b
case 0x21: cursor(hang,lie+1);word(hang,lie,35);break;//c
case 0x23: cursor(hang,lie+1);word(hang,lie,36);break;//d
case 0x24: cursor(hang,lie+1);word(hang,lie,37);break;//e
case 0x2b: cursor(hang,lie+1);word(hang,lie,38);break;//f
case 0x34: cursor(hang,lie+1);word(hang,lie,39);break;//g
case 0x33: cursor(hang,lie+1);word(hang,lie,40);break;//h
case 0x43: cursor(hang,lie+1);word(hang,lie,41);break;//i
case 0x3b: cursor(hang,lie+1);word(hang,lie,42);break;//j
case 0x42: cursor(hang,lie+1);word(hang,lie,43);break;//k
case 0x4b: cursor(hang,lie+1);word(hang,lie,44);break;//l
case 0x3a: cursor(hang,lie+1);word(hang,lie,45);break;//m
case 0x31: cursor(hang,lie+1);word(hang,lie,46);break;//n
case 0x44: cursor(hang,lie+1);word(hang,lie,47);break;//o
case 0x4d: cursor(hang,lie+1);word(hang,lie,48);break;//p
case 0x15: cursor(hang,lie+1);word(hang,lie,49);break;//q
case 0x2d: cursor(hang,lie+1);word(hang,lie,50);break;//r
case 0x1b: cursor(hang,lie+1);word(hang,lie,51);break;//s
case 0x2c: cursor(hang,lie+1);word(hang,lie,52);break;//t
case 0x3c: cursor(hang,lie+1);word(hang,lie,53);break;//u
case 0x2a: cursor(hang,lie+1);word(hang,lie,54);break;//v
case 0x1d: cursor(hang,lie+1);word(hang,lie,55);break;//w
case 0x22: cursor(hang,lie+1);word(hang,lie,56);break;//x
case 0x35: cursor(hang,lie+1);word(hang,lie,57);break;//y
case 0x1a: cursor(hang,lie+1);word(hang,lie,58);break;//z
//大键盘0-9
case 0x45: cursor(hang,lie+1);word(hang,lie,16);break;
case 0x16: cursor(hang,lie+1);word(hang,lie,17);break;
case 0x1E: cursor(hang,lie+1);word(hang,lie,18);break;
case 0x26: cursor(hang,lie+1);word(hang,lie,19);break;
case 0x25: cursor(hang,lie+1);word(hang,lie,20);break;
case 0x2E: cursor(hang,lie+1);word(hang,lie,21);break;
case 0x36: cursor(hang,lie+1);word(hang,lie,22);break;
case 0x3D: cursor(hang,lie+1);word(hang,lie,23);break;
case 0x3E: cursor(hang,lie+1);word(hang,lie,24);break;
case 0x46: cursor(hang,lie+1);word(hang,lie,25);break;
//小键盘0-9
case 0x70: cursor(hang,lie+1);word(hang,lie,16);break;
case 0x69: cursor(hang,lie+1);word(hang,lie,17);break;
case 0x72: cursor(hang,lie+1);word(hang,lie,18);break;
case 0x7A: cursor(hang,lie+1);word(hang,lie,19);break;
case 0x6B: cursor(hang,lie+1);word(hang,lie,20);break;
case 0x73: cursor(hang,lie+1);word(hang,lie,21);break;
case 0x74: cursor(hang,lie+1);word(hang,lie,22);break;
case 0x6C: cursor(hang,lie+1);word(hang,lie,23);break;
case 0x75: cursor(hang,lie+1);word(hang,lie,24);break;
case 0x7D: cursor(hang,lie+1);word(hang,lie,25);break;
case 0x4A: cursor(hang,lie+1);word(hang,lie,15);break;// '/'
case 0x7C: cursor(hang,lie+1);word(hang,lie,10);break;// '*'
case 0x7B: cursor(hang,lie+1);word(hang,lie,13);break;// '-'
case 0x79: cursor(hang,lie+1);word(hang,lie,11);break;// '+'
case 0x71: cursor(hang,lie+1);word(hang,lie,14);break;// '.'
case 0x29: cursor(hang,lie+1); break;//space
//退格处理
case 0x66:
if(!((hang==0)&&(lie==0)))
{
if(lie==0)
{
hang--;
lie=29;
}
cursor(hang,--lie);word(hang,lie,0);
--lie;
}
break; //Backspace
//回车处理
case 0x5a: ++hang;if(hang==16){word(0,0,hang+16);hang=0;}cursor(hang,lie=0);--lie;break;
case 0x76: resetlcd();cursor(0,0);hang=15;lie=28;break;//esc键
default:cursor(hang,lie);break;
}
lie++;
if(lie==29)
{
lie=0;
hang++;
if(hang==16)hang=0;
}
}
void main(void)
{
init_io();
resetlcd();
cursor(0,0);
delay_ms(10);
MCUCR=0x02;
GICR=0x40;
#asm("sei");
while(1)
{
if(flag==1)
{
flag=0;
word(5,0,code/100+16);
word(5,1,(code%100)/10+16);
word(5,2,code%10+16);
word(6,0,kk+16);
kk++;
if(kk>9)kk=0;
decode(code);
}
}
}
interrupt [2] void int0(void)
{
int0_cnt++;
if(int0_cnt>1&&int0_cnt<10)
{
tmp>>=1;
if(PSDATA_PIN)tmp|=0x80;
else tmp&=0x7F;
}
if(int0_cnt==11)
{
code=tmp;
tmp=0;
int0_cnt=0;
if(code==0xE0)xiao=!xiao;// 标示小键盘有键按下
//if(xiao==1 && lastcode==0xE0 && code==0xF0)xiao=0; // 标示小键盘有键弹起
if(code==0x12 || code==0x59)shift=!shift; //表示 shift 键被按下
//if(lastcode==0xF0 && (code==0x12 || code==0x59))shift=0; //表示shift 键弹起
if(code==0x77)num_lock=!num_lock;
//if(flag1==0xF0 && code ==0x77)num_lock=!num_lock; //数字小键盘的 num lock 键按下
if(code==0x58)caps_lock=!caps_lock;//caps_lock
if(code!=0xe0 && code!=0xF0 && lastcode!=0xF0){flag=1;}
if(lastcode==0xE0)
{
if(code==0x4A || code==0x5A)
flag=1;//小键盘的'/'
else flag=0;
}
lastcode=code;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -