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

📄 key.c

📁 带有LCD
💻 C
字号:
/****************************************************
*Copyright (c) 2007, 新芝股份
*All rights reserved.
*
*文件名称:usart.c
*
*当前版本:1.1
*作者:黄文剑
*完成日期:2007.10.10
*修改记录改PORTC为键盘接口,原来是PORTB
*
*取代版本:1.0
*原作者:
*完成日期:2007.9.26
****************************************************/
#include <stdio.h>
#include <pic.h>
#include "key.h"
#include "D:\ql200\com\com.h"

unsigned char	key_flag = 0;
unsigned char keypad_old = 0;
unsigned char keypad_new = 0;
/*****************************************************
Function Name:		Key_Init
Function Description:	Initiate the KEY, include RPBU, global interrupt enable, RB interrupt enable
Input Parameters:		None
Output Parameters:	None
Return Value:			None
Example of Use Case:	None			
*****************************************************/
void Key_Init(void)
{
/*
	TRISB = 0xF0;
	RBPU = 0;
	PORTB = 0x00;
	GIE = 1;
	RBIE = 1;
*/
	ADCON1 = 0x07;
	TRISA = 0x00;
	PORTA = 0x00;
}

/*****************************************************
Function Name:		Key_ScanMatrix
Function Description:	Scan key matrix
Input Parameters:		None
Output Parameters:	None
Return Value:			None
Example of Use Case:	None			
*****************************************************/
unsigned char Key_ScanMatrix(void)
{
	unsigned char		value_portc = 0x00;
	unsigned char		value_key = 0x00;
	
	TRISC = 0xF0;
	PORTC = 0x00;
	NOP();
	NOP();
	value_portc = PORTC;
	value_portc &= 0xF0;
	value_key = value_portc;
	if(value_key != 0xF0)     //  value_key !=F0,得到键值,否则误中断 
	{
		TRISC = 0x0F;
		PORTC = 0x00;
		NOP();
		NOP();
		value_portc = PORTC;
		value_portc &= 0x0F;
		value_key |= value_portc;
	}
	return value_key;
}

/*****************************************************
Function Name:		Keypad_Scan
Function Description:	Scan keypad
Input Parameters:		None
Output Parameters:	None
Return Value:			unsigned char: key original value
Example of Use Case:	None			
*****************************************************/
KEY_PARAM Keypad_Scan(void)
{
	unsigned char 	key_num = 0;
	unsigned char		key_value = 0;
	KEY_PARAM		key;
	
	key_value = Key_ScanMatrix();
	if(key_flag == 0)
	{
		if(key_value == 0xF0)
		{
			key_num = 0xFF;
		}
		else
		{
			keypad_old = key_value;
			Delay_10ms_ISR(2);
			key_value = Key_ScanMatrix();
			if(key_value == 0xF0)
			{
				key_num = 0xFF;
			}
			else
			{
				keypad_new = key_value;
				if(keypad_old == keypad_new)
				{
					key_num = keypad_old;
					key.code = keypad_old;
					key.state = KEY_PRESS;
					key_flag = 1;
				}
				else
				{
					key_num = 0xFF;
				}
				
			}
		}			
	}
	else
	{
		key_value = Key_ScanMatrix();
		if(key_value == 0xF0)
		{
			Delay_10ms_ISR(2);
			key_value = Key_ScanMatrix();
			if(key_value == 0xF0)
			{
				key_num = keypad_old;
				key.code = keypad_old;
				key.state = KEY_RELEASE;
				key_flag = 0;
			}
		}
		else
		{
			key_num = 0xFF;
		}
	}
	if(key_num == 0xFF)
	{
		key.code = 0xFF;
		key.state = KEY_RELEASE;
	}
	return key;	
}

/*****************************************************
Function Name:		Keypad_HighISR
Function Description:	Keypad Interrupt Service Rountine, this function only is called by ISR
Input Parameters:		None
Output Parameters:	None
Return Value:			KEY_VALUE: key map value
Example of Use Case:	None			
*****************************************************/
KEY_VALUE Keypad_HighISR(void)
{
	unsigned char 	key_org_value = 0;
	unsigned char 	key_map_value = 0;
	KEY_PARAM		key;

	key = Keypad_Scan();
#pragma switch direct
	switch(key.code)
	{
		case 0xE7:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_0;
			}
			break;
		case 0xEB:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_1;
			}			
			break;
		case 0xED:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_2;
			}			
			break;
		case 0xEE:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_3;
			}			
			break;
		case 0xD7:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_4;
			}			
			break;
		case 0xDB:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_5;
			}			
			break;
		case 0xDD:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_6;
			}			
			break;
		case 0xDE:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_UP;
			}
			break;
		case 0xB7:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_7;
			}			
			break;
		case 0xBB:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_8;
			}			
			break;
		case 0xBD:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_LEFT;
			}
			break;
		case 0xBE:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_RIGHT;
			}
			break;
		case 0x77:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_9;
			}			
			break;
		case 0x7B:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_ENTER;
			}
			break;
		case 0x7D:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_BACK;
			}
			break;
		case 0x7E:
			if(key.state == KEY_RELEASE)
			{
				key_map_value = KEY_NONE;
			}
			else
			{
				key_map_value = KEY_DOWN;
			}
			break;		
		case 0xFF:
			key_map_value = KEY_ERROR;
			break;
		default:
			key_map_value = KEY_NONE;
			break;			
	}
	return key_map_value;
}

⌨️ 快捷键说明

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