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

📄 keycon.h

📁 4×8键盘编码程序
💻 H
字号:
/**************************************************************
 *文件名:keycon.h
 *作者:刘峰雷     版本:1.0     日期:2004.6.8
 *描述:实现键盘的译码
 *************************************************************/

#ifndef _KEYCON_H_
#define _KEYCON_H_

#include "typeredef.h"

/*************产生键盘部分的片选信号****************/
#define KeyAdd (volatile UINT8 *)0x4FE00000	  

/*******************延迟函数************************/
void delay(UINT32 time)
{
	UINT32 k = 0;
	
	while(k <= time)
	{
	    k++;
	}
}

/****************************************************
 *检查键盘行的状态——是否有键按下。
 *若有键按下,返回false;否则,返回true。
 ***************************************************/
UINT32 key_status_check(void)
{
	UINT32 key_line;
	
	key_line = *KeyAdd;
	if((key_line & 0xff) == 0xff)
	{
	    return true;
	}
	else
	{
	    return false;
	}
}

/****************************************************
 *获得键盘上面有键按下的行的行号。行号为0~7。
 *否则返回值8。
 ***************************************************/
UINT8 key_line_check(void)
{
	UINT8 key_line;
	
	key_line = *KeyAdd;
	if((key_line & 0x01) == 0x0)	  /*若key_line的第0位为1,则返回行号0*/
	{
	    return 0;
	}
	
	if((key_line & 0x02) == 0x0)	  /*若key_line的第1位为1,则返回行号1*/
	{
	    return 1;
	}
	
	if((key_line & 0x04) == 0x0)	  /*若key_line的第2位为1,则返回行号2*/
	{
	    return 2;
	}
	
	if((key_line & 0x08) == 0x0)	  /*若key_line的第3位为1,则返回行号3*/
	{
	    return 3;
	}
	
	if((key_line & 0x10) == 0x0)	  /*若key_line的第4位为1,则返回行号4*/
	{
	    return 4;
	}
	
	if((key_line & 0x20) == 0x0)	  /*若key_line的第5位为1,则返回行号5*/
	{
	    return 5;
	}
	
	if((key_line & 0x40) == 0x0)	  /*若key_line的第6位为1,则返回行号6*/
	{
	    return 6;
	}
	
	if((key_line & 0x80) == 0x0)	  /*若key_line的第7位为1,则返回行号7*/
	{
	    return 7;
	}
	
	return 8;						  /*默认情况下返回8*/
}

/****************************************************
 *实现参数i的低四位的循环左移
 ***************************************************/
UINT8 crol1(unsigned char i)
{	
	UINT8 k;
	
	k = i & 0x08;                     /*屏蔽掉除第三位外的其他位*/
	k = k >> 3;                       /*k右移3位*/
	i = i << 1;                       /*i左移1位*/
	i = i & 0x0f;                     /*获取低四位*/
	i = i | k;                        /*实现i低四位左移一位*/
	return i;
}

/***********************************************************************
 *获得4×8(4列8行)矩阵键盘所按下的键的序号
 *各个键对应的序号如下所示:
 * Display_Format MeasSetup Catalog/Sys		 0x08 0x04  0x00
 * 软键1  7  8  9   Enter_key		         0x1F 0x01  0x1E  0x1A  0x0F
 * 软键2  4  5  6   Back_key	             0x1B 0x0D  0x09  0x05  0x0B
 * 软键3  1  2  3   DCBias_key	             0x17 0x19  0x15  0x11  0x07
 * 软键4  0  . -/+  TRIG_key	 ===>        0x13 0x12  0x1D  0x16  0x03
 *      up						                        0x0E
 * left    right		                          0x06		  0x02
 *     down 					                        0x0A
 **********************************************************************/
#define softkey_1         0x13		  /*软键1键值*/
#define softkey_2         0x17		  /*软键2键值*/
#define softkey_3         0x1B		  /*软键3键值*/
#define softkey_4 		  0x1F		  /*软键4键值*/
#define numkey_0          0x12		  /*数字0键值*/
#define numkey_1          0x19		  /*数字1键值*/
#define numkey_2          0x15		  /*数字2键值*/
#define numkey_3          0x11		  /*数字3键值*/
#define numkey_4          0x0D		  /*数字4键值*/
#define numkey_5          0x09		  /*数字5键值*/
#define numkey_6          0x05		  /*数字6键值*/
#define numkey_7          0x01		  /*数字7键值*/
#define numkey_8          0x1E		  /*数字8键值*/
#define numkey_9          0x1A		  /*数字9键值*/
#define key_dot           0x1D		  /*小数点键值*/
#define key_minus_plus    0x16		  /*正负号键值*/
#define arrowkey_up       0x0E		  /*向上光标键键值*/
#define arrowkey_down     0x0A		  /*向下光标键键值*/
#define arrowkey_left     0x06		  /*向左光标键键值*/
#define arrowkey_right    0x02		  /*向右光标键键值*/
#define enter_key         0x0F		  /*回车键键值*/
#define back_key          0x0B		  /*backspace键键值*/
#define dcbias_key        0x07		  /*直流偏置键键值*/
#define trig_key          0x03		  /*触发键键值*/
#define disp_format       0x08		  /*disp/format键键值*/
#define meas_setup        0x04		  /*meassetup键键值*/
#define catalog_sys       0x00		  /*catalog/sys键键值*/

/**********************************************************
*获取键值
**********************************************************/
UINT8 get_key(void)					  
{
	UINT8 key_code, row, column = 0, mask = 0x0;

	*KeyAdd = mask;
	while(1)
	{
		while(key_status_check());    /*判断有无键按下。*/
		delay(5000);			      /*延迟一段时间。*/
		if(key_status_check())        /*再次判断是否有键按下。*/
		{
		    continue;                 /*若无,则继续循环;*/
		}
		else
		{
		    break;				      /*若有,则中断循环。*/
		}
	}
									  /*分析按键所在的列号*/
	mask = 0x0e;
	while(1)
	{
		*KeyAdd = mask;
		if(key_status_check())	      /*判断该列是否有键按下。*/
		{
			mask = crol1(mask);	      /*若无,则mask移位,column加1,继续判断。*/
			column++;			
			if(column >= 4)
				column = 0;
			continue;
		}
		else
		{
		    break;				      /*若有,则中断循环*/		 
		}
	}
	
	row = key_line_check();		      /*计算按键所在的行号*/
	while(!key_status_check());	      /*等待键释放*/
	
    /***********************************************/
    /*计算键值:键值 = 行号 × 4 + 列号          */
    /***********************************************/
	switch(row)
	{
		case 0:
		key_code = 0 + column;
		break;
		
		case 1:
		key_code = 4 + column;
		break;
		
		case 2:
		key_code = 8 + column;
		break;
		
		case 3:
		key_code = 12 + column;
		break;
		
		case 4:
		key_code = 16 + column;
		break;
		
		case 5:
		key_code = 20 + column;
		break;
		
		case 6:
		key_code = 24 + column;
		break;
		
		case 7:
		key_code = 28 + column;
		break;
	}
	return key_code;
}

#endif  /*_KEYCON_H_*/







⌨️ 快捷键说明

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