📄 key.c
字号:
//
// 名称:
// 编写:niechao
// 日期:2012.08
// 修改:无
// 内容:按键操作程序
#include<reg52.h>
#include"timer0_1ms.h"
#include"led.h"
//按键端口定义
sbit io_set_key = P1^0 ;
sbit io_sht_key = P1^1 ;
sbit io_add_key = P1^2 ;
sbit io_sub_key = P1^3 ;
//按键初始化 主函数调用
void KeyInit(void)
{
io_set_key = 1 ;
io_sht_key = 1 ;
io_add_key = 1 ;
io_sub_key = 1 ;
}
//按键键码值
#define set_key_value 10
#define sht_key_value 20
#define add_key_value 30
#define sub_key_value 40
#define key_null 50
unsigned char a=0; //短按状态反馈给led。c
unsigned char *Pflag; //短按状态
unsigned char b=0; //长按状态反馈给led。c
unsigned char *Lflag; //长按状态
//------------------------------------------------
// 判断哪个按键按的
//------------------------------------------------
unsigned char KeyScan(void)
{
if(io_set_key == 0)return set_key_value ;
if(io_sht_key == 0)return sht_key_value ;
if(io_add_key == 0)return add_key_value ;
if(io_sub_key == 0)return sub_key_value ;
return key_null ;
}
//------------------------------------------------
// 长按短按键值返回
//------------------------------------------------
static state(unsigned char *PKeyValue,unsigned char *LKeyValue )
//指向短按 指向长按
{
static unsigned char count ;
if (KeyScan()!=50 )
{
if (OUT1)
{
OUT1=0; //系统160MS时标到复位
if (KeyScan()!=50 ) //是否有按键按下
{
*PKeyValue = 1 ; //返回短按
count++;
led_show(); //短按复位前先显示
*PKeyValue = 0 ;
}
if (OUT2 == 1 ) //2S时标到
{
if (count > 12 ) //2S时标到内大于12次计数为长按
//不可能有2S按12次的按神?
{
*LKeyValue = 1 ; //返回长按
}
}
}
}
if ((count >= 0) && (*LKeyValue ==1) ) //每40ms查询当长按按键按下后释放
//用于复位短按计数和长按标志
{
if (KeyScan()==50 ) //按键是否释放
{
count = 0 ;
*LKeyValue = 0 ;
OUT2 = 0 ;
}
}
}
//------------------------------------------------
// 通过指针间接赋值短按状态 长按状态
//------------------------------------------------
void getkey(void)
{
Pflag = &a; //短按状态通过将 短按状态a地址 赋值 给 指针 Pflag
//在state(unsigned char *PKeyValue,unsigned char *LKeyValue )函数间接修改短按状态a值
Lflag = &b; //长按状态通过将 长按状态a地址 赋值 给 指针 Lflag
//在state(unsigned char *PKeyValue,unsigned char *LKeyValue )函数间接修改短按状态b值
state(Pflag,Lflag);
}
//------------------------------------------------
// 判断哪个按键按下返回对应码值
// 此程序模版是在第二次调用时
// 无法复位20MS等时间标志位或复位标志位
// 影响使用其他时间标志 后发现可通过多 计时器时间标志求余
// 如想得到10Ms 通过现用20MS ( (20MS计数常量 % 2) >0 )结果为真
// 就是10ms的计数
//------------------------------------------------
/*void state(unsigned int *PKeyValue,unsigned int *LKeyValue )
//指向短按 指向长按
{
static unsigned char count ;
if (KeyScan()!=50 )
{
if (OUT)
{
StateChange(); //系统20MS时标到复位
if (KeyScan()!=50 ) //是否有按键按下
{
PKeyValue = KEY_STATE_PRESS ; //返回短按
if (OUT) //20ms到了是否还有按键按下
{
if (KeyScan()!=50) //是否有按键按下
{
count++;
if (count > 40)
{
count = 0;
LKeyValue = KEY_STATE_LONG; //返回长按
}
}
}
}
}
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -