⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps2.c

📁 智能家居系统。。。包括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 + -