sohappyoh 发表于 2014-6-1 17:11:14

看了“程序模块化及可复用性”想改自己按键程出问题!

看了“单片机编程之 - 程序模块化及可复用性”想改自己的案件程序出现了问题,麻烦大师看看什么原因:
/*
*   @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:01

。。。你不能说说是什么问题吗

sohappyoh 发表于 2014-6-1 19:12:32

lzl000 发表于 2014-6-1 19:06
。。。你不能说说是什么问题吗

PICTURE 发表于 2014-6-1 19:36:07

struct key_t key1=
{
    0,
    0,
    0,
    0,
    KeyScan
};

这样定义试试

sohappyoh 发表于 2014-6-1 21:26:09

PICTURE 发表于 2014-6-1 19:36
struct key_t key1=
{
    0,


肯定不行 我试过了

PICTURE 发表于 2014-6-1 22:11:24

调用的时候这样呢?

    while(1)
    {
      key1.KeyScan(&key1, KEY1_PRESS);
    }
出现错误有什么提示?

sohappyoh 发表于 2014-6-2 10:00:54

PICTURE 发表于 2014-6-1 22:11
调用的时候这样呢?

    while(1)


怎么初始化key1

sohappyoh 发表于 2014-6-2 11:42:34

找到原因了,,多了个const

PICTURE 发表于 2014-6-2 11:48:51

你上面不是已经把 key1 初始化了么?
但是在定义key_t结构体时函数指针*KeyScan的第一个入口参数有个const 做修饰,
void (*KeyScan)(const struct key_t *key, Bool KEY_DOWN);

把初始化的 key1也加一个const修饰一下。

再在主循环里这样子调用函数key1.KeyScan(&key1, KEY1_PRESS);

另外它出错时可以看看出现什么提示。

sohappyoh 发表于 2014-6-2 12:16:53

PICTURE 发表于 2014-6-2 11:48
你上面不是已经把 key1 初始化了么?
但是在定义key_t结构体时函数指针*KeyScan的第一个入口参数有个const...

没问题了,我是看了
单片机编程之 - 程序模块化及可复用性(二)
单片机编程之 - 程序模块化及可复用性(一)
两篇文章,决定把自己的key改写一下,但是我觉得简单问题复杂化了

Gorgon_Meducer 发表于 2014-6-3 11:30:30

推荐把这个虚函数void (*KeyScan)(const struct key_t *key, Bool KEY_DOWN);从接口里面挪掉。
除非你的设定就是每个按键都有一个自己独立的且不同的扫描函数,否则追求这个形式没有意义。
页: [1]
查看完整版本: 看了“程序模块化及可复用性”想改自己按键程出问题!