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

📄 ps2keybord.c

📁 芯片at89s52
💻 C
字号:
/******************************************************************************
 * File   Name: PS2KeyBord.c												  *
 * Create Time: 2007/07/30													  *
 * Description:																  *
 * Copyright  :																  *
 * History    :																  *
 * |---Data---|---Author---|--Version--|--------------Description-------------|
 *****************************************************************************/
  #define PSKEYBORD_ONOFF
  #ifdef PSKEYBORD_ONOFF
/******************************
 *      Head File             *
 *****************************/
 #include"PS2KeyBord.h"
/******************************
 *     Global Variable        *
 *****************************/
 uchar g_ucPSkeydata = 0x00; //按下键的通码值  
 uchar ucRecBuf_ptr=0x00;	 //键盘按下键数据的缓冲区指针
 uchar ucRecBuf[11];		 //从键盘接收数据的缓冲区
 uchar cntOddNum = 0x00;// 奇校验中‘1’的个数
/******************************
 *      Function  Implement	  *
 *****************************/
    
/*******************************************************************************
Function Name:	数据接收函数												   *
Input  Parameter :															   *
Output Parameter :															   *
Function Description :	接收从键盘输入的11位数据							   *
*******************************************************************************/
void DataReceive(void)
{	
	if(ucRecBuf_ptr<=0x0a)
	{  	
	   if(P3_2 == 0) 	   
	   {ucRecBuf[ucRecBuf_ptr] = P3_7; 
	   ucRecBuf_ptr++; }
	   else return; 
	}
	else
	{
		GetData();	
		ucRecBuf_ptr = 0x00;
	} 		
  
} 
/*******************************************************************************
Function Name:	奇校验函数  												   *
Input  Parameter :															   *
Output Parameter :															   *
Function Description :	对收到的数据进行校验和检验,防止数据出错			   *
*******************************************************************************/
uchar oddCheck(void)
{
	uchar tmp;
	for(tmp=0;tmp<9;tmp++)
	{
		if(ucRecBuf[tmp+1]==0x01)
			cntOddNum++;
	}
	if(cntOddNum%2 == 1)
		return TURE;
	else return FALSE;
}
/*******************************************************************************
Function Name:	返回通码值函数												   *
Input  Parameter :															   *
Output Parameter :															   *
Function Description :	通过函数得到键盘按下的键的通码值					   *
*******************************************************************************/
uchar PSkeydata_value(void)
{
	return g_ucPSkeydata;
} 
/*******************************************************************************
Function Name:	通码拾取函数												   *
Input  Parameter :															   *
Output Parameter :															   *
Function Description :	从接收的11位数据中抽取出8位通码						   *
*******************************************************************************/
void GetData(void)
{ 	
	uchar tmp,tmp2;
	if(oddCheck())
	{
		tmp2 = g_ucPSkeydata;
		g_ucPSkeydata = 0x00;
		for(tmp=0;tmp<0x08;tmp++)
		{  
			g_ucPSkeydata |= ucRecBuf[tmp+1]<<tmp;		
		}
		if(g_ucPSkeydata == 0xf0)
			g_ucPSkeydata = tmp2;		
	} 	
}
/*******************************************************************************
Function Name:	PS键盘中断0初始化函数										   *
Input  Parameter :															   *
Output Parameter :															   *
Function Description :	从接收的11位数据中抽取出8位通码						   *
*******************************************************************************/
void Int0_init_PSkeybord(void)
{
	TMOD = 0x01; //选择定时/计数器0,做定时器用,选择模式1,THx和TLx构成全16位计数器
	TL0 = 0x00;	//定时器中断时间为2.5ms
	TH0 = 0xee; //65536 - 0.0025/(12/22118400)=X,反解求出
	TR0 = 0x01;	//开启定时器0
	IE = 0x83;	//允许全局中断,允许定时器/计数器0溢出中断
	PT1 = 0x00;
	PX0 = 0x01;
}

 #endif
/*******************************************************************************
 *                        The end of the entire file			               *
 ******************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -