📄 key3a.c
字号:
#ifndef _key_c
#define _key_c
//************************************************************************************
//
//#include <pic.h>
//#include <pic1687x.h>
#include"config.h"
//------------------------------------------------file "key.c"-----------------------------------------------
//#include "KEY.h"
unsigned char is_repeat_key(unsigned char);
void scan_key();
void process_panel_key();
void tmint(void); //
void interrupt clkint(void); //定时器中断函数
void KEYINT(void) ;//按键初始化
//*************************************************
/*====================================================================================================
扫描面板按键程序
====================================================================================================*/
void scan_key()
{
KEYPORT=0xFF;
col1=1;
col2=1;
col3=1;
key = NO_KEY;
col1=0;
col2=1;
col3=1;
if (row1==low) key = KEY1;
if (row2==low) key = KEY4;
if (row3==low) key = KEY7;
// if (row4==low) key = KEYCLEAR;
col1=1;
col2=0;
col3=1;
if (row1==low) key = KEY2;
if (row2==low) key = KEY5;
if (row3==low) key = KEY8;
// if (row4==low) key = KEY0;
col1=1;
col2=1;
col3=0;
if ( row1==low) key = KEY3;
if ( row2==low) key = KEY6;
if ( row3==low) key = KEY9;
// if ( row4==low) key = KEYOK;
}
/*====================================================================================
处理面板按键程序
=====================================================================================*/
void process_panel_key()
{
scan_key();
switch (scan_key_state)
{
case KEY_IDLE_STATE: //按键空闲状态
// case KEY_SHAKE_STATE:
// current_key = AUTO_SEARCH_UP_KEY;
// if (!shake_cancel_timer)
// ;
// {
if (key!=NO_KEY) //如果有按键按下,则进入按键消抖状态。
// ;
{
key_bak = key;
shake_cancel_timer = 1; //消抖时间设定为20ms
scan_key_state = KEY_SHAKE_STATE;
}
else //如果没有按键按下,继续为空闲检测状态。
{
scan_key_state = KEY_IDLE_STATE;
}
// break;
case KEY_SHAKE_STATE: //按键去抖状态
if (!shake_cancel_timer)
{
if (key == key_bak) //消抖后,如果按键未变,进入复合检测状态。
{
scan_key_state = KEY_COMPLEX_STATE; complex_key_timer = 100; //复合判断时间为200ms 小于200ms为原功能,大于200ms为复合功能。
}
else //确认为按键抖动。
{
scan_key_state = KEY_IDLE_STATE;
}
}
break;
case KEY_COMPLEX_STATE: //按键复合处理状态
if (!complex_key_timer)
{
if (key == key_bak) //复合检测时间到,按键仍按下。
{
if (key == SEARCH_UP_KEY) //执行next的复合功能。
{
current_key = AUTO_SEARCH_UP_KEY;
}else if (key == SEARCH_DOWN_KEY) //执行prev的复合功能。
{
current_key = AUTO_SEARCH_DOWN_KEY;
}else //执行没有复合功能的按键。
{
current_key = key;
}
if (is_repeat_key(key)) //检测为可重复按键时,进入重复状态。
{
repeat_key = current_key;
scan_key_state = KEY_REPEAT_STATE;
repeat_key_timer = 20; // 按键重复时间为200ms,如果连续按键,每200ms执行重复按键操作。
}else //检测为不可重复按键时,进入按键抬起等待状态。
{
scan_key_state = KEY_WAIT_UP;
}
}else //按键已经抬起,执行未复合功能。
{
current_key = key_bak;
scan_key_state = KEY_IDLE_STATE;
}
}else
{
if (key != key_bak) //按键抬起,执行未复合功能。
{
current_key = key_bak;
scan_key_state = KEY_IDLE_STATE;
}
}
break;
case KEY_REPEAT_STATE: //按键重复处理状态
if (key == key_bak)
{
if (!repeat_key_timer) //按键重复时间到,再次执行按键功能。
{
repeat_key_timer = 20; // 按键重复时间为200ms,如果连续按键,每200ms执行重复按键操作。
current_key = repeat_key;
}
}else //按键抬起,回到按键空闲检测状态。
{
scan_key_state = KEY_IDLE_STATE;
}
break;
case KEY_WAIT_UP: //按键等待抬起状态
if (key!= key_bak)
{
scan_key_state = KEY_IDLE_STATE; //按键抬起,返回按键空闲检测状态。
}
break;
}
}
/*------------------------------------------------------------------------------------------------*/
unsigned char is_repeat_key(unsigned char r_key) //重复按键检测通行函数。
{
if ((r_key == VOLUME_UP_KEY)||(r_key == VOLUME_DOWN_KEY)||(r_key == SEARCH_UP_KEY)||(r_key == SEARCH_DOWN_KEY))
{
return 1;
}else
{
return 0;
}
}
/*-----------------------------------------------------------------------------------------------*/
void KEYINT(void)//按键初始化
{
T0CS=0;
ledadr=0;
tmint(); //调用定时器初始化程序
GIE=1;
}
//把按键输入的8位数据处理成三个门禁的字节
void Key( ) //按键值处理
{
uint32 Buf;//键值处理缓存
BJCardBuf[0]=KeyBuf[0]*100+KeyBuf[1]*10+KeyBuf[2];
nop;
Buf=(KeyBuf[3]*10000+KeyBuf[4]*1000+KeyBuf[5]*100)+KeyBuf[6]*10+KeyBuf[7];
nop;
BJCardBuf[2]=Buf%256;
BJCardBuf[1]=Buf>>8;
nop;
}
/*
main(void)
{
TRISB=0xF8;//低四位是输入,高四位为输出
// TRISC=0;
// TRISB=0x00;
// TRISC=0x00;
PORTB=0XFF;
// PORTC=0x00;
// RB0=1;RB2=0;//接两个LED,开始为全灭
PCFG3=0;
PCFG2=1;
PCFG1=1;
PCFG0=1;
TRISA=0;
PORTA=0;
T0CS=0;
RA4=0;
ledadr=0;
tmint(); //调用定时器初始化程序
GIE=1;
// scan_key();
nop;
while(1)
{
nop;
process_panel_key();
nop;
if(current_key!=NO_KEY)
{
nop;
nop;
current_key=NO_KEY;
scan_key_state = KEY_IDLE_STATE;
}
nop;
nop;
}//end while
}
*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -