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

📄 kpd.c

📁 基于STR710和嵌入式操作系统的串口驱动程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                                      
**                                          公 司
**                                          部 门
**
**                                 http://www.chipapp.com
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: kpd.c
** 创 建 人: 罗辉联
** 创建日期: 2006年7月23日
** 描    述: kpd应用部分函数、变量定义
**
**--------------历史版本--------------------------------------------------------------------------------
** 修 改 人: 罗辉联 	
** 版    本: V1.0
** 日   期: 2006年7月23日
** 描   述: 原始版本
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include "config.h"


#define KPD_SLEEP_TIMER_STANDRAD	6

/***************************************** 全局变量定义  ************************************************/
const WORD8 keypad_layout[KPD_MAX_ROWS][KPD_MAX_COLS]={	/* 键盘物理键值映射表 		  */                           
   
   {KPD_PKEY_5,      	KPD_PKEY_6,    		KPD_PKEY_7,      KPD_PKEY_8 	},
   {KPD_PKEY_9,         KPD_PKEY_RIGHT,     KPD_PKEY_LEFT,   KPD_PKEY_ESC  	},
   {KPD_PKEY_0,         KPD_PKEY_1,        	KPD_PKEY_2,      KPD_PKEY_3 	},
   {KPD_PKEY_4,         KPD_PKEY_UP,       	KPD_PKEY_DOWN,   KPD_PKEY_OK	},
 };
 
 MMI_MSG_STRUCT_T  *kpd_msg = (void*)0; /* 定义全局指针需要这样赋初值 */

/***************************************** 函数原型声明  ************************************************/
void kpd_us_sleep(UWORD16 counter);


/*********************************************************************************************************
** 函数名称: kpd_init
** 功能描述: 初始化行列式键盘接口
** 
** 参    数: None
**           None
**
** 返 回 值: None
**         
** 作   者: 罗辉联
** 日   期: 2006年7月23日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void kpd_init(void)
{
	GPIO_ModeConfig(GPIO1,4,GPIO_OUT_PP);    /* 列配置(输出) */
	GPIO_ModeConfig(GPIO1,5,GPIO_OUT_PP);
	GPIO_ModeConfig(GPIO1,6,GPIO_OUT_PP);
	GPIO_ModeConfig(GPIO1,7,GPIO_OUT_PP);
	
	GPIO_ModeConfig(GPIO2,12,GPIO_IN_COMS);  /* 行配置(输入) */
	GPIO_ModeConfig(GPIO2,13,GPIO_IN_COMS);
	GPIO_ModeConfig(GPIO2,14,GPIO_IN_COMS);
	GPIO_ModeConfig(GPIO2,15,GPIO_IN_COMS);
}
/*********************************************************************************************************
** 函数名称: kpd_scan_keypad
** 功能描述: 行列式键盘扫描
** 
** 参    数: None
**
** 返 回 值: 扫描键盘所得的值
**         
** 作   者: 罗辉联
** 日   期: 2006年7月23日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
WORD8 kpd_scan_keypad(void)
{
   UWORD8 row, col;
   volatile UWORD16 rows;
   
   KPD_COL_OUT =  KPD_COL_OUT | KPD_ALL_OFF;
   
   kpd_us_sleep(15);
   rows = KPD_ROW_IN & 0xF000;
   
   if(rows != 0xF000)
   {
		KPD_COL_OUT =  KPD_COL_OUT & KPD_ALL_ON;
		return KPD_PKEY_NULL;     					/* 干扰, 返回*/
   }
   
   KPD_COL_OUT =  KPD_COL_OUT & KPD_ALL_ON;
   kpd_us_sleep(15);
    
   rows = KPD_ROW_IN & 0xF000;
   
   if(rows == 0xF000)
   		return KPD_PKEY_NULL;
   		
   KPD_COL_OUT =  KPD_COL_OUT | KPD_ALL_OFF;
   
       												/* 每次激活一列 */
   for (col = 0; col < KPD_MAX_COLS; col++)
   {
      KPD_COL_OUT = KPD_COL_OUT & (KPD_ACTIVATE(col));
      kpd_us_sleep(10);
      	 								
      rows =  KPD_ROW_IN & 0xF000;					/* 扫描那个行被激活 */

      if (rows != 0xF000)
      {
         for (row = 0; row < KPD_MAX_ROWS; row++)
         {
            										/* 首先被激活的行 */
            if ( KPD_IS_ACTIVE(rows,row))
            {
               										/* 重新激活所有的列 */
               KPD_COL_OUT =  KPD_COL_OUT & KPD_ALL_ON;
               
               return keypad_layout[row][col];		/* 返回扫描的键值 */
            }
         }
      }
   }
										
	KPD_COL_OUT =  KPD_COL_OUT & KPD_ALL_ON;	/* 没有行被激活,重新激活所有的列然后返回 */
   	return KPD_PKEY_NULL;
}

/********************************************************************************************************
;** 函数名称: kpd_scan_task_core
;** 功能描述: 键盘扫描任务core函数
;**
;** 参    数: *pdata
;**
;** 返 回 值: None
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年7月1日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void kpd_scan_task_core(void *pdata)
{
	WORD8	key_value = KPD_PKEY_NULL;
	
	while(1)
	{
		key_value = kpd_scan_keypad();
		if(key_value != KPD_PKEY_NULL)
		{
			kpd_msg->msg_id = 1; //MMI_MSG_GET_KEY=1;
			kpd_msg->callback_func = NULL;
			kpd_msg->msg_param[0] = key_value;
			mmi_msg_send(kpd_msg);
			key_value = KPD_PKEY_NULL;
		}
		
		OSTimeDly(30);	/* 大约150MS 扫描一次 */	
	}
	
}
/*********************************************************************************************************
** 函数名称: kpd_ns_sleep
** 功能描述: 纳秒级延时
** 
** 参    数: counter: 
**          
** 返 回 值: None
**         
** 作   者: 罗辉联
** 日   期: 2006年5月25日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void kpd_ns_sleep(UWORD32 cpt_loop)
{
  // while (cpt_loop -- != 0);
  __asm
  { 
  	CMP       A1, #0
    BEQ       END_FUNCTION
    LOOP_LINE:        
    SUB       A1, A1, #1
    CMP       A1, #0
    BNE       LOOP_LINE
    END_FUNCTION:        
  }
}	

/*********************************************************************************************************
** 函数名称: kpd_us_sleep
** 功能描述: 微秒级延时
** 
** 参    数: counter: 
**          
** 返 回 值: None
**         
** 作   者: 罗辉联
** 日   期: 2006年5月25日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void kpd_us_sleep(UWORD16 counter)
{
	UWORD16	i = 0;
	UWORD16 base = KPD_SLEEP_TIMER_STANDRAD ;	//MCLK=48M 时大约1us

	for(i = 0; i < counter; i++)
		kpd_ns_sleep(base);
}
	
/**********************************************end of file***********************************************/

⌨️ 快捷键说明

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