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

📄 key.c

📁 用KEIL开发的出租车计费系统
💻 C
字号:
/**************************************************************************
  
                   		Key Check
  
   File Name:       key.c
   Author:          Lin Qian
   Created:         2007/07/27
   Modified:		NO
   Revision: 		1.0
  
***************************************************************************/
#define __KEY
#include "INC\\main.h"
#undef __KEY


// 矩阵式键盘扫描 ******************************
#if MatrixKeyScan_en
uchar MatrixKeyScan (void)
// 返回: 被按下的按键的行列码; 无按键按下则返回0x00.
{
	uchar scancode,tmpcode;
	
	PORT = 0xf8;	// 发全0行扫描码
	
	if( (PORT & 0xf8) != 0xf8  &&  (PORT & 0xf8) != 0xf0 )	// 若有键按下
	{
		DelayXms(10);	// 延时去抖动
		
		if( (PORT & 0xf8) != 0xf8  &&  (PORT & 0xf8) != 0xf0)
		// 延时后再判断一次,去除抖动影响
		{
			scancode = 0xfe;	// 逐行扫描码初值
			
			while( (scancode & 0x08) != 0 )	// 逐行扫描
			{
				PORT = scancode;	// 输出行扫描码
				
				if( (PORT & 0xf8) != 0xf8  &&  (PORT & 0xf8) != 0xf0 )
				// 本行有键按下
				{
					tmpcode = (PORT & 0xf8) | 0x07;

					/* 返回特征字节码,为1的位即对应于行和列 */
					return( (~scancode+~tmpcode) & 0xf7 );
				}
				else
					scancode = (scancode<<1)|0x01;	// 行扫描码左移一位
			}
		}
	}
	return 0;	// 无键按下,返回值为0 	
}
#endif

// 矩阵式键盘解码 ******************************
#if MatrixKeyDecode_en
uchar MatrixKeyDecode (uchar key)
// 功能: 根据行列码翻译为按键信息
// key: 行列码.
// 返回: 解码值
{
//	uchar keychar;

	switch( key )
	{
		case 0x11:	// 1行1列,数字3: "复位"
//			keychar = '3';
			Reset();
			break;

		case 0x21:	// 1行2列,数字6: "读取"
//			keychar = '6';
			LoadDistCost();		// 读取里程数和总价
			LoadMenu_Succeed("      LOAD      ");	// 显示读取成功
			break;

		case 0x41:	// 1行3列,数字9: "存储"
//			keychar = '9';
			SaveDistCost();		// 存储里程数和总价
			LoadMenu_Succeed("      SAVE      ");	// 显示存储成功
			break;

		case 0x81:	// 1行4列,字符"#": "确定"
//			keychar = '#';
			Confirm();
			break;

		case 0x12:	// 2行1列,数字2: "停止"
//			keychar = '2';
			Stop();		// 停止计费
			break;

		case 0x22:	// 2行2列,数字5: "MIN"
//			keychar = '5';
			AdjustClockMin();
			break;

		case 0x42:	// 2行3列,数字8: "夜价"
//			keychar = '8';
			AdjustNightPrice();
			break;

		case 0x82:	// 2行4列,数字0: "-:
//			keychar = '0';
			Minus();
			break;

		case 0x14:	// 3行1列,数字1: "启动"
//			keychar = '1';
			Start();	// 启动计费
			break;

		case 0x24:	// 3行2列,数字4: "HOUR"
//			keychar = '4';
			AdjustClockHour();
			break;

		case 0x44:	// 3行3列,数字7: "日价"
//			keychar = '7';
			AdjustDayPrice();
			break;

		case 0x84:	// 3行4列,字符"*": "+"
//			keychar = '*';
			Plus();
			break;

		default:	
//			keychar = 0;
			break;
	}

	return 1;
}
#endif

// 检测直接型按键状态 ******************************
#if CheckKey_en
bit CheckKey (bit key, bit press)
// key: 需要检测的按键位		press:按键被按下时的状态值
// 返回值:1->按键被按下		0->按键未被按下
{
	if( key == press)		// 判断按键是否被按下 
		{	DelayXms(10);	// 去抖延时

			if (key == press)
				return 1;
			else
				return 0;
		}
	else
		return 0;
}
#endif

// 按键处理 *******************************
#if KeyDisposal_en
void KeyDisposal (void)
// 功能: 对直接式按键和矩阵式按键进行检测和处理.
{
// --- 变量定义 ---
	static bit anti_reinput;
	uchar matrixkey;

// --- 直接式按键处理 ---
	// 检测按键,是否对里程数和总价清零
  	if( CheckKey(keyLoadDefault, 0) )
	{
		LoadDefault();	// 装载默认值
		while( keyLoadDefault == 0 );	// 等待按键弹起
	}

// --- 矩阵式按键处理 ---
	matrixkey = MatrixKeyScan();	// 调用键盘扫描函数
	if( matrixkey  &&  !anti_reinput )
	{
		MatrixKeyDecode(matrixkey);		// 按键解码
		anti_reinput = 1;	// 防止因按键未松开引起的重复输入
	}
	else if( !matrixkey )		// 按键松开, 防重输入标记位清零
			anti_reinput = 0;
}
#endif

//************************************************************************

⌨️ 快捷键说明

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