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

📄 ex_support.c

📁 一个解决5个IO口扫描25个按键的解决方法,完整文件包,有参考意义,C51.
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************
*   函数库说明:底层硬件初始化驱动函数库                   *
*   版本:                                                 *
*   作者:                                                 *
*   创建日期:                                             *
* -------------------------------------------------------- *
*  [硬件说明]                                              *
*   处理器:                                               *
*   系统时钟:                                             *
* -------------------------------------------------------- *
*  [支 持 库]                                              *
*   支持库名称:HD_Support.h                               *
*   需要版本:  -----                                      *
*   支持库说明:底层硬件初始化声明库                       *
*                                                          *
*   支持库名称:EX_Support.h                               *
*   需要版本:  -----                                      *
*   支持库说明:底层硬件初始化驱动声明库                   *
*                                                          *
*   支持库名称:PF_Config.h                                *
*   需要版本:  -----                                      *
*   支持库说明:硬件平台配置声明库                         *
* -------------------------------------------------------- *
*  [版本更新]                                              *
*   修改:                                                 *
*   修改日期:                                             *
*   版本:                                                 *
* -------------------------------------------------------- *
*  [版本历史]                                              *
* -------------------------------------------------------- *
*  [使用说明]                                              *
***********************************************************/

/********************
* 头 文 件 配 置 区 *
********************/
//# define _USE_VIRTUAL_SPI_SND_CODE
# include "PF_Config.h"
# include "Ex_Support.h"

/********************
*   系 统 宏 定 义  *
********************/

/*------------------*
*   常 数 宏 定 义  *
*------------------*/

/*------------------*
*   动 作 宏 定 义  *
*------------------*/
/*
# define VSPI_WAIT_SIGNAL_LOW(__SIGNAL)  \
            do\
            {\
                while((__SIGNAL));\
                Delay_MS(50);\
            }\
            while((__SIGNAL));
# define VSPI_WAIT_SIGNAL_HIGH(__SIGNAL)  \
            do\
            {\
                while(!(__SIGNAL));\
                Delay_MS(50);\
            }\
            while(!(__SIGNAL));
*/
# define VSPI_WAIT_SIGNAL_LOW(__SIGNAL)  while((__SIGNAL));
# define VSPI_WAIT_SIGNAL_HIGH(__SIGNAL) while(!(__SIGNAL));
/********************
*  模块结构体定义区 *
********************/

/********************
*   函 数 声 明 区  *
********************/
void Insert_Timer0_OVF_ISR_Code(void);
void Driver_INIT(void);
void Delay_MS(uint16 wTime);
UINT8 Key_Scan(void);
#ifdef _USE_VIRTUAL_SPI_RCV_CODE
UINT8 chVirtualSPIReceiver(void);
#endif
#ifdef _USE_VIRTUAL_SPI_SND_CODE
void chVirtualSPISender(UINT8 chData);
#endif
/********************
*   模块函数声明区  *
********************/


/********************
*   模块变量声明区  *
********************/
static uint16 s_wSystemDelayTimerCounter = 0;
/********************
*   全局变量声明区  *
********************/
uint16 g_wSystemTimer = 0;

/***********************************************************
*   函数说明:软件驱动初始化函数                           *
*   输入:    无                                           *
*   输出:    无                                           *
*   调用函数:无                                           *
***********************************************************/
void Driver_INIT(void)
{
    //*在这里插入你的各类软件驱动初始化代码*//
}

/***********************************************************
*   函数说明:系统毫秒延时函数                             *
*   输入:    需要延时的时间长度                           *
*   输出:    无                                           *
*   调用函数:无                                           *
***********************************************************/
void Delay_MS(uint16 wTime)
{
    s_wSystemDelayTimerCounter = wTime;
    
    while(s_wSystemDelayTimerCounter);
}

/***********************************************************
*   函数说明:定时器0中断处理程序代码插入函数              *
*   输入:    无                                           *
*   输出:    无                                           *
*   调用函数:无                                           *
***********************************************************/
void Insert_Timer0_OVF_ISR_Code(void)
{
    static UINT8 n = 0;
    g_wSystemTimer++;

    if (s_wSystemDelayTimerCounter)
    {
        s_wSystemDelayTimerCounter--;
    }
    
    if (!(g_wSystemTimer & (BIT(7) - 1)))
    {
        n++;
        n &= BIT(3)-1;
        chVirtualSPISender(~BIT(n));
    }
}



#ifdef _USE_VIRTUAL_SPI_RCV_CODE
/***********************************************************
*   函数说明:虚拟SPI接收机                                *
*   输入:    无                                           *
*   输出:    接收到的数据                                 *
*   调用函数:无                                           *
***********************************************************/
UINT8 chVirtualSPIReceiver(void)
{
    UINT8 chRCVData = 0;
    UINT8 chCounter = 0;
    
    VSPI_WAIT_SIGNAL_LOW(VSPI_SS)
    //PORTC &= ~BIT(PC0);
    while(!VSPI_SS)
    {
        VSPI_WAIT_SIGNAL_LOW(VSPI_CLK)
        PORTC ^= BIT(PC0);
        chRCVData <<= 1;
        chRCVData |= VSPI_DATA;
        chCounter++;
        VSPI_WAIT_SIGNAL_HIGH(VSPI_CLK)
        if (chCounter == 8)
        {
            break;
        }   
    }
    PORTC &= ~BIT(PC0);
    return chRCVData;
    
}
#endif

#ifdef _USE_VIRTUAL_SPI_SND_CODE
/***********************************************************
*   函数说明:虚拟SPI发送函数                              *
*   输入:    要发送的字节                                 *
*   输出:    无                                           *
*   调用函数:无                                           *
***********************************************************/
void chVirtualSPISender(UINT8 chData)
{
    UINT8 chBITCounter = 0;
    
    CLR_VSPI_SS
    
    for (chBITCounter = 0;chBITCounter < 8;chBITCounter++)
    {
        SET_VSPI_CLK
        if (chData & BIT(chBITCounter))
        {
            SET_VSPI_DATA
        }
        else
        {
            CLR_VSPI_DATA
        }
        Delay_MS(5);
        CLR_VSPI_CLK
        
        Delay_MS(5);
    }
    
    SET_VSPI_SS
}
#endif

/***********************************************************
*   函数说明:按键扫描函数                                 *
*   输入:    无                                           *
*   输出:    按键的扫描码(如果无按键返回KEY_NULL)       *
#   调用函数:无                                           *
***********************************************************/
UINT8 Key_Scan(void)
{
   UINT8 chTempKeyCode = KEY_NULL;
   //填写扫描代码
   
   //首先扫描A列
   CLR_A;
   
   if (!READ_PINX)                                         
   {
       chTempKeyCode = 0x00;
   }
   else if (!READ_PINY)
   {
       chTempKeyCode = 0x03;
   }
   
   CLR_B;
   if (!READ_PINX)                                         
   {
       chTempKeyCode = 0x01;
   }
   else if (!READ_PINY)
   {
       chTempKeyCode = 0x04;
   }
   
   CLR_C;
   if (!READ_PINX)                                          
   {
       chTempKeyCode = 0x02;
   }
   else if (!READ_PINY)
   {
       chTempKeyCode = 0x05;
   }
   
   return chTempKeyCode;
}
////////////////////////////////////////////////////////////////////////////
UINT8 Key_Scan_New(void)
{
   UINT8 chTempKeyCode = KEY_NULL;						//为按键的编码设初值
   
   
   //先对21-25按钮进行扫描
   DDRC &= ~(BIT(1) | BIT(2) | BIT(3) |
             BIT(4) | BIT(5));							//把端口pc1-pc5都置为输入
			 
   PORTC |=  BIT(1) | BIT(2) | BIT(3) |
   		     BIT(4) | BIT(5);			  				//全部端口拉高
   NOP();
   NOP();
   
   
   if (!(PINC & (BIT(1))))     		//读取pc1端口,如果返回值是0则表明按键被按下,
                              	 	//则返回按键的值                              
   {
       chTempKeyCode = 21;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(2))))  	//读取pc2端口,如果返回值是0则表明按键被按下,
                                 	//则返回按键的值,下面以此类推。              
   {
       chTempKeyCode = 22;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(3))))
   {
       chTempKeyCode = 23;
	   return chTempKeyCode;
   }
   else if (!(PINC & (BIT(4))))
   {
       chTempKeyCode = 24;
	   return chTempKeyCode;
   }

⌨️ 快捷键说明

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