📄 ps2.c
字号:
#include <REG52.H>
#include "intrins.h"
//#include "ku.h" //按键通码与ascii对照表
#include <string.h>
#define uchar unsigned char
sbit sda= P2^5; //键盘数据线
extern uchar inbuf1[];
//extern uchar PS2_Busy;
extern uchar PS2_ok;
uchar PS2_ok;
//uchar PS2_Busy;
uchar Ps2_Data=0x00; //最终按键值(第二套键扫码)
uchar PS2_Dat_Temp=0x00; //接收键盘数据临时变量
uchar count=0,num;//shu; //控制标志
Ps2_Receice_Data[2]={0x00,0x00}; //临时接收按键值(第二套键扫码)
/*******LCD函数调用声明******/
void sent_string(uchar x,uchar y,uchar *sent_data,uchar length);
void LCD_clr_pic();
void init_PS2(void)
{
EX0=1;
IT0=1;
EA=1;
//shu=0;
PS2_Dat_Temp=0x00;
num=9;
count=0;
PS2_ok=0;
}
//外部中断0 用来接收键盘发来的数据
void zhongduan() interrupt 0
{
EX1=0; //关外部中断0,防止红外中断同时发生,串口优先
PS2_Dat_Temp>>=1; //接收数据 低->高
if(sda)
{
PS2_Dat_Temp|=0x80;
}
count++;
if(count==num)
{
if(count==9)
{
if((PS2_Dat_Temp==0xE0)||(PS2_Dat_Temp==0xF0)) //忽略0xE0和0xF0
{
count=0; //重新记录第一个数据
PS2_Dat_Temp=0x00;
}
else //if(
{
Ps2_Receice_Data[0]=PS2_Dat_Temp; //保存第一个数据
PS2_Dat_Temp=0x00;
num=20; //使中断可以继续中断11次
//shu++;
//Ps2_Data=Ps2_Receice_Data[0];
}
}
if(count==20)
{
if((PS2_Dat_Temp==0xE0)||(PS2_Dat_Temp==0xF0)) //忽略0xE0和0xF0
{
count=9; //重新记录第二个数据
PS2_Dat_Temp=0x00;
}
else
{
Ps2_Receice_Data[1]=PS2_Dat_Temp; //保存第二个数据
PS2_Dat_Temp=0x00;
if(Ps2_Receice_Data[0]!=Ps2_Receice_Data[1]) //如果两组数据错位
{
Ps2_Receice_Data[0]=Ps2_Receice_Data[1]; //以最新的一次按键为准
}
Ps2_Data=Ps2_Receice_Data[0]; //确认最终按键并保存到Ps2_Data中
//shu=0;
num=9;
count=0;
PS2_ok=1;
}
}
}
EX1=1;
}
//译码函数,用来处理缓冲区里的数据
void Ps2_Getkey(void)
{
unsigned char i=0;
EX0=0; EX1=0; //关外部中断
if(PS2_ok==1) //若有按键解出
{
if(Ps2_Receice_Data[0]==Ps2_Receice_Data[1])
{
switch (Ps2_Data)
{
case 0x16:init_PS2(); if(inbuf1[19]=='1')inbuf1[19]='0';else inbuf1[19]='1';break; // 1
case 0x1E:init_PS2(); if(inbuf1[20]=='1')inbuf1[20]='0';else inbuf1[20]='1';break; // 2
case 0x26:init_PS2(); if(inbuf1[21]=='1')inbuf1[21]='0';else inbuf1[21]='1';break; // 3
case 0x25:init_PS2(); if(inbuf1[22]=='1')inbuf1[22]='0';else inbuf1[22]='1';break; // 4
case 0x2E:init_PS2(); if(inbuf1[23]=='1')inbuf1[23]='0';else inbuf1[23]='1';break; // 5
case 0x36:init_PS2(); if(inbuf1[24]=='1')inbuf1[24]='0';else inbuf1[24]='1';break; // 6
case 0x3D:init_PS2(); if(inbuf1[25]=='1')inbuf1[25]='0';else inbuf1[25]='1';break; // 7
case 0x3E:init_PS2(); if(inbuf1[26]=='1')inbuf1[26]='0';else inbuf1[26]='1';break; // 8
default:init_PS2(); break;
}
}
//Ps2_Data=0;
}
PS2_ok=0;
EX0=1;EX1=1; //开外部中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -