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

📄 datainput.c

📁 51系列单片机上实现PC键盘的识别
💻 C
字号:
////////////////////////////////////////////////////////////////////////
//  键盘识别源文件
//  功能:将获得的键盘扫描码放到全局变量的InputData中

#include "at89x52.h"
#include "common.h"
#include "dataInput.h"
#include "display/display.h"

///////////////////////////////////////////////////////////////////////
//    如果需要PC键盘模块

#ifdef NEED_PC_KEYBORD

////////////////////////////////////////////////////////////////////////
unsigned char Buffer[11];   //接受数据缓冲区   
unsigned char InputDataBuffer=0x00; //实际数据暂存区,用于组装数据时候
unsigned char DataBitPtr=0x00;  //接受数据位指针 
BOOL gSymboleE0=0x00;
BOOL SymboleF0=0x00;

//////////////////////////////////////////////////////////////////////////
//  数据校验
//  校验正确返回1
//  否则返回0
BOOL CheckData(void)
{
    ACC=InputDataBuffer;
    if(~P==Buffer[9])   //检测累加器中1的个数
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

////////////////////////////////////////////////////////////////////////
//  组合数据 
//  参数:无
//  返回值:无
//  功能:将缓冲区中数据组合成unsigned char型数据并且调用ExchangeCode()函数
//  为显示作准备
void CombinData(void)
{
    unsigned char lInputData=0x00;
    unsigned char CircleTemp;   //移位循环变量
    InputDataBuffer=0;          //数据暂存区

    ////////////////////////////////////////////////////////////////////
    //  通过移位的方法将数据进行整合
    for(CircleTemp=0x00;CircleTemp<0x08;CircleTemp++)
    {
        InputDataBuffer=InputDataBuffer+(Buffer[CircleTemp+1]<<CircleTemp);
    }
    ///////////////////////////////////////////////////////////////////
    //    数据写入显示缓冲区
    if(CheckData())
    { 
        if(InputDataBuffer!=0xE0&&InputDataBuffer!=0xF0)
        {
            lInputData=InputDataBuffer;
            Print(lInputData);
        }

        if(InputDataBuffer==0xE0)
        {           
            gSymboleE0=1;
            return;
         }

        if(gSymboleE0==1&&lInputData==0xF0)
        {
            SymboleF0=1;
            return;
        }
        else if(gSymboleE0==1&&SymboleF0==1)
        {
            lInputData=InputDataBuffer;  //数据接受
            Print(lInputData);
            gSymboleE0=0;
            SymboleF0=0;
            return;
        }
        else if(gSymboleE0==1&&SymboleF0==0)
        {
            lInputData=InputDataBuffer;  //数据接受
            Print(lInputData);             
        }        
    }
    else
    {
        return ;
    }
}

/////////////////////////////////////////////////////////////////////////
//  接受数据中断服务函数
//  通过外部跳变电平引发外部中断
//  接受数据线上的数据,放数据接收完成后组装数据

void RecData(void) interrupt 0
{

    Buffer[DataBitPtr]=DataLine;
    DataBitPtr++;
    if(DataBitPtr==11)
    {
        CombinData();              //组装数据
        DataBitPtr=0;              //复位数据指针
    }
} 


///////////////////////////////////////////////////////////////////////////////////
//    文件结束
#endif         

⌨️ 快捷键说明

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