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

📄 serial_key.c

📁 串口键盘,单片机应用者必备 给有用的同志门
💻 C
字号:
/***************************************************************************************************
功能:基于74HC165串行键盘驱动
***************************************************************************************************/
#include "SPCE061V004.h"
#define  DELAYTIMES   300
#define   IO_DATA     *P_IOA_Data  //设置输出口为IOA口
#define   IO_DIR      *P_IOA_Dir 	
#define   IO_ATTRIB   *P_IOA_Attrib   
//#define  IO_DATA     *P_IOB_Data  //设置输出口为IOB口
//#define   IO_DIR      *P_IOB_Dir 	
//#define   IO_ATTRIB   *P_IOB_Attrib   

#define  CLK          0x0080
#define  DATA         0x0020
#define  LOAD         0x0040 
/********************************检测用*********************************************************
#define  CLK          0x0001
#define  DATA         0x0004
#define  LOAD         0x0002 
/*****************************************************************************************************/
#define   Set_LOAD_Low    (IO_DATA &= ~LOAD )
#define   Set_LOAD_High   (IO_DATA |=LOAD)
#define   Set_CLK_Low     (IO_DATA &= ~CLK) 
#define   Set_CLK_High    (IO_DATA |= CLK) 
typedef unsigned int uint;
uint key_buffer=0,key_buf=0;
uint KeyFlag=0;
uint c_key_delay=0;
void EnterKey();
/****************************************************************************************************
函数:void Init_SER_Key();
功能:初始化键盘用IO
参数:无
返回:无
****************************************************************************************************/
void Init_SER_Key()
{
  IO_DIR    |= CLK;    //设置CLK为输出
  IO_ATTRIB |= CLK;
  IO_DATA   |= CLK;
  IO_DIR    |= LOAD;   //设置LOAD为输出 
  IO_ATTRIB |= LOAD;
  IO_DATA   |= LOAD;
  IO_DIR    &= ~DATA;  //设置DATA为输入
  IO_ATTRIB &= ~DATA;
  IO_DATA   |= DATA;
}
/****************************************************************************************************
函数:unsigned int Receive_SerialDATA()
功能:获取74HC165的原始数据
参数:无
返回:串行数据值
****************************************************************************************************/
unsigned int Receive_SerialDATA()
{
    unsigned int  i,j,SERdata; 
    SERdata=0;   
    Set_CLK_High;
    __asm("NOP");    
    Set_LOAD_Low;
    __asm("NOP");
    Set_LOAD_High;
    __asm("NOP");

    for ( i=0x8000; i>=0x0001; i=i>>1 )
    {
     
      j=IO_DATA;
      if( j&DATA )
      	SERdata |= i;
      	
      Set_CLK_Low;	 	
      __asm("NOP"); 
      Set_CLK_High;
      __asm("NOP");
    }
    
    return(SERdata);
}
/*******************************************************************************************************
函数:void KeyScan();
功能:键盘扫描
参数:无
返回:无
********************************************************************************************************/
void KeyScan()
{
 key_buffer = Receive_SerialDATA();
 key_buffer = ~key_buffer;
 if(key_buffer==0) {KeyFlag=0;c_key_delay=0;} 
 else EnterKey();
}
/*******************************************************************************************************
函数:void EnterKey()
功能:按键处理
参数:无
返回:无
********************************************************************************************************/
void EnterKey()
{
      if(c_key_delay==0)
         {c_key_delay++;key_buf=key_buffer;}
      else if(c_key_delay < DELAYTIMES )
        {
          if(key_buf==key_buffer) c_key_delay++;
          else { KeyFlag=0;c_key_delay=0;}
        }
      else 
        { KeyFlag=1;c_key_delay=0;}
}
/*******************************************************************************************************
函数:unsigned int ReturnKeyValue();
功能:获取键值,ks1-ks16分别为1-16
参数:无
返回:键值
********************************************************************************************************/
unsigned int ReturnKeyValue()
{
  uint i,j=0;
  for ( i=0x8000; i>=0x0001; i=i>>1 )
    {
      j++;
      if(i & key_buf)
          {
            key_buf=0;
            return(j);
          }
    }
}

⌨️ 快捷键说明

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