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

📄 keypad.c

📁 实现PID算法的C语言程序
💻 C
字号:

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

		键盘

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


#include <reg52.H>
#include <rtx51tny.h>

#include "Typedef.H"
#include "UserDef.H"

#include "disp.h"

/* 按键对照表 */
static INT32U code KeyMap[][2] = {
//	扫描码	虚键码
	0xFFFF,	VK_NULL,
	0xFFEF,	VK_0,
	0xFFFD,	VK_1,
	0xFFDF,	VK_2,
	0xFDFF,	VK_3,
	0xFFFB,	VK_4,
	0xFFBF,	VK_5,
	0xFBFF,	VK_6,
	0xFFF7,	VK_7,
	0xFF7F,	VK_8,
	0xF7FF,	VK_9,
	0xEFFF,	VK_ADD,
	0xDFFF,	VK_SUB,
	0xBFFF, VK_MUL,
	0x7FFF, VK_DIV,
	0xFEFF,	VK_EQU,
	0xFFFE, VK_CLR,
};


/* 端口定义 */
sbit KP_Col0 = P1^0;
sbit KP_Col1 = P1^1;
sbit KP_Col2 = P1^2;
sbit KP_Col3 = P1^3;
sbit KP_Row0 = P1^4;
sbit KP_Row1 = P1^5;
sbit KP_Row2 = P1^6;
sbit KP_Row3 = P1^7;

/*  公共全局变量 */

/*  私有全局变量 */
static INT8U sig_targ;	// 接收键盘信号的任务

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

		按键任务

****************************************************/
static void TaskKey(void) _task_ TASK_KEY
{ 
	INT8U n;
	INT8U cnt = 0;				//按键消抖计数器
	INT16U PrevImg = 0x0FFF;	//上次的扫描码
	INT8U PrevKey = VK_NULL;
	INT16U img;

	float df;
	INT8U d8;
	INT16U d16;
	INT32U d32;
	INT32S d32S;

	while (1) 
	{ 	
		os_wait(K_TMO,10,0);

		img = 0;

		//获取扫描码
		P1 = 0xFF;
		KP_Col0 = 0;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 1;
		img |= (P1>>4); img <<= 4;
		KP_Col0 = 1;KP_Col1 = 0;KP_Col2 = 1;KP_Col3 = 1;
		img |= (P1>>4); img <<= 4;
		KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 0;KP_Col3 = 1;
		img |= (P1>>4);	img <<= 4;
		KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 0;
		img |= (P1>>4);

		//按键消抖:连续5次不变的按键扫描值可确认为一个稳定的按键动作
		if (PrevImg != img)
		{
			cnt = 0;
			PrevImg = img;
			continue;
		}

		PrevImg = img;
		cnt ++;
		if (cnt < 5)
		{
			continue;
		}

		cnt = 0;

		//按键扫描码转换为虚键码
		for (n=0;n<(sizeof(KeyMap)/8);n++)
		{
			if (KeyMap[n][0] == img)
			{
				break;
			}
		}

		if ( n < (sizeof(KeyMap)/8) )		//检索到匹配值,有合法按键按下,发送按键消息 
		{
			if (PrevKey != KeyMap[n][1])	//只在按键值变化时发送消息
			{
				PrevKey = KeyMap[n][1];

				switch (KeyMap[n][1])
				{
					case VK_0:   			//演示:清屏
						DISP_REQ;
						dm.type = DTYPE_CLS;
						os_send_signal(sig_targ);
						break;
					case VK_1:				//演示:显示单个字符
						DISP_REQ;
						dm.type = DTYPE_CHAR;
						dm.font = 1; 
						dm.x = 4;
						dm.y = 20;
						d8 = '*';
						dm.DData = &d8;
						os_send_signal(sig_targ);
						break;
					case VK_2:		   		//演示:显示字符串
						DISP_REQ;
						dm.type = DTYPE_STR;
						dm.font = 1; 
						dm.x = 4;
						dm.y = 20;
						dm.DData = "Hello";
						os_send_signal(sig_targ);
						break;
					case VK_3:				//演示:显示汉字
						DISP_REQ;
						dm.type = DTYPE_HZ;
						dm.x = 4;
						dm.y = 20;
						d8 = 0;
						dm.DData = &d8;
						os_send_signal(sig_targ);
						break;
					case VK_4:				//演示:显示浮点数
						DISP_REQ;
						dm.type = DTYPE_FLOAT;
						dm.font = 1; 
						dm.x = 4;
						dm.y = 20;
						dm.len = 6;
						df = 1.2345;
						dm.DData = &df;
						os_send_signal(sig_targ);
						break;
					case VK_5:				//演示:显示8位无符号整数
						DISP_REQ;
						dm.type = DTYPE_INT8U;
						dm.font = 1; 
						dm.x = 4;
						dm.y = 20;
						dm.len = 3;
						d8 = 147;
						dm.DData = &d8;
						os_send_signal(sig_targ);
						break;
					case VK_6:				//演示:显示16位无符号整数
						DISP_REQ;
						dm.type = DTYPE_INT16U;
						dm.font = 1; 
						dm.x = 4;
						dm.y = 20;
						dm.len = 4;
						d16 = 6789;
						dm.DData = &d16;
						os_send_signal(sig_targ);
						break;
					case VK_7:				//演示:显示32位无符号整数
						DISP_REQ;
						dm.type = DTYPE_INT32U;
						dm.font = 1; 
						dm.x = 4;
						dm.y = 20;
						dm.len = 8;
						d32 = 258369;
						dm.DData = &d32;
						os_send_signal(sig_targ);
						break;
					case VK_8:				//演示:显示32位有符号整数
						DISP_REQ;
						dm.type = DTYPE_INT32S;
						dm.font = 1; 
						dm.x = 4;
						dm.y = 20;
						dm.len = 8;
						d32S = -69258;
						dm.DData = &d32S;
						os_send_signal(sig_targ);
						break;
				}
			}
		}
	} 
} 


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

		任务创建函数

		signal_target_task 	 接收键盘信号的任务编号

****************************************************/
void TaskCreate_Key(INT8U signal_target_task)
{
	sig_targ = signal_target_task;
	os_create_task(TASK_KEY);
}

⌨️ 快捷键说明

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