看了“程序模块化及可复用性”想改自己按键程出问题!
看了“单片机编程之 - 程序模块化及可复用性”想改自己的案件程序出现了问题,麻烦大师看看什么原因:/*
* @Project:
* @
* @CPU Frec:INT RC 8MHz
*
*/
#include "common.h"
#include "key.h"
#define SHORT_PRESS_COUNT_NUM_MIN 5
#define SHORT_PRESS_COUNT_NUM_OV 20
#define LONG_PRESS_COUNT 200
#define LONG_PRESS_COUNT_K3 100
#define LONG_PRESS_COUNT_K4 100
#define KEY1_PRESS ((~KEY1_PINS) & KEY1_PIN)
#define KEY2_PRESS ((~KEY2_PINS) & KEY2_PIN)
#define KEY3_PRESS ((~KEY3_PINS) & KEY3_PIN)
#define KEY4_PRESS ((~KEY4_PINS) & KEY4_PIN)
#define KEY5_PRESS ((~KEY5_PINS) & KEY5_PIN)
struct key_t
{
uint8 short_press_flag:1;
uint8 long_press_flag:1;
//uint8 double_click_flag:1;
uint8 key_old_flag:1;
uint8 key_cnt;
void (*KeyScan)(const struct key_t *key, Bool KEY_DOWN);
};
void KeyScan(struct key_t *key, Bool KEY_DOWN)
{
if(KEY_DOWN)
{
if((key->key_cnt<250) && (~key->key_old_flag)) key->key_cnt++;
if(key->key_cnt>LONG_PRESS_COUNT)//按住时间达到长按时间
{
key->long_press_flag = 1;//设置方案标志
key->key_old_flag = 1;;//设置按键旧状态标记
key->key_cnt = 0;
}
}
else
{
if(key->key_cnt>SHORT_PRESS_COUNT_NUM_MIN &&
key->key_cnt<SHORT_PRESS_COUNT_NUM_OV)//计数值在短按的范围
{
key->short_press_flag = 1;//设置短按标志
}
key->key_old_flag = 0;//去除按键旧状态标记
key->key_cnt = 0;
}
}
struct key_t key1=
{
0,
0,
0,
0,
KeyScan(key1, KEY1_PRESS)
};
void main()
{
while(1)
{
key1.KeyScan(key1, KEY1_PRESS);
}
} 。。。你不能说说是什么问题吗 lzl000 发表于 2014-6-1 19:06
。。。你不能说说是什么问题吗
struct key_t key1=
{
0,
0,
0,
0,
KeyScan
};
这样定义试试 PICTURE 发表于 2014-6-1 19:36
struct key_t key1=
{
0,
肯定不行 我试过了 调用的时候这样呢?
while(1)
{
key1.KeyScan(&key1, KEY1_PRESS);
}
出现错误有什么提示? PICTURE 发表于 2014-6-1 22:11
调用的时候这样呢?
while(1)
怎么初始化key1
找到原因了,,多了个const 你上面不是已经把 key1 初始化了么?
但是在定义key_t结构体时函数指针*KeyScan的第一个入口参数有个const 做修饰,
void (*KeyScan)(const struct key_t *key, Bool KEY_DOWN);
把初始化的 key1也加一个const修饰一下。
再在主循环里这样子调用函数key1.KeyScan(&key1, KEY1_PRESS);
另外它出错时可以看看出现什么提示。 PICTURE 发表于 2014-6-2 11:48
你上面不是已经把 key1 初始化了么?
但是在定义key_t结构体时函数指针*KeyScan的第一个入口参数有个const...
没问题了,我是看了
单片机编程之 - 程序模块化及可复用性(二)
单片机编程之 - 程序模块化及可复用性(一)
两篇文章,决定把自己的key改写一下,但是我觉得简单问题复杂化了 推荐把这个虚函数void (*KeyScan)(const struct key_t *key, Bool KEY_DOWN);从接口里面挪掉。
除非你的设定就是每个按键都有一个自己独立的且不同的扫描函数,否则追求这个形式没有意义。
页:
[1]