📄 key.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 + -