📄 serial_key.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 + -