打印
[STC单片机]

还是按键问题,已经快一个月了,求论坛大神...

[复制链接]
2944|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
qin552011373| | 2016-8-29 09:54 | 只看该作者
什么问题不写,程序逻辑不描述,只有神能帮你。

使用特权

评论回复
板凳
一个小黄人|  楼主 | 2016-8-29 09:55 | 只看该作者
/****按键扫描************/
static uchar8 KeyGet()
{
        static  uchar8 Key_Num;
         Key_Num++;
          if(Key_Num==1)
                {
                        Key1=(key_down);
                         if(!Key2) return Key_ValueIncPlus;
                         if(!Key3) return Key_ValueIncCut;
                         if(!Key4) return Key_ValueStop;
                         if(!Key5) return Key_ValueProgram;
                         
                         return key_up;
                 }
                if(Key_Num==2)
                        {
                        
                        Key2=(key_down);
                         if(!Key1) return Key_Value5;
                         if(!Key3) return Key_Value6;
                         if(!Key4) return Key_Value7;
                         if(!Key5) return Key_Value8;

                         return key_up;
                         }
                if(Key_Num==3)
                        {
                        Key3=(key_down);
                 
                         if(!Key1) return Key_Value9;
                         if(!Key2) return Key_Value10;
                         if(!Key4) return Key_Value11;
                         if(!Key5) return Key_Value12;
                        }
                  if(Key_Num>3)
                          Key_Num=0;
       
}


这是我的按键扫描程序,本人小白,扫描程序写出来之后如果只是扫一行,可以扫到按键,扫多行,就是上面的程序,一个按键扫不到,求大神指点,已经卡了快一个月了......

使用特权

评论回复
地板
一个小黄人|  楼主 | 2016-8-29 10:14 | 只看该作者
qin552011373 发表于 2016-8-29 09:54
什么问题不写,程序逻辑不描述,只有神能帮你。

写了啊....

使用特权

评论回复
5
一个小黄人|  楼主 | 2016-8-29 10:18 | 只看该作者
一个小黄人 发表于 2016-8-29 09:55
/****按键扫描************/
static uchar8 KeyGet()
{

我的按键板子是这个原理图,程序是单纯的中断按键扫描,10ms扫描一次,扫到按键返回一个值,现在的问题是,如果单纯的这样写

/****按键扫描************/
static uchar8 KeyGet()

                        Key1=(key_down);
                         if(!Key2) return Key_ValueIncPlus;
                         if(!Key3) return Key_ValueIncCut;
                         if(!Key4) return Key_ValueStop;
                         if(!Key5) return Key_ValueProgram;
                         
                         return key_up;
}

可以扫到按键,如果多扫描几行,就扫不到按键...不知道说清楚了没有....

使用特权

评论回复
6
sting_yang| | 2016-8-29 11:42 | 只看该作者

Key1=(key_down);
Key2=(key_down);
Key3=(key_down);
只有down,没有up

使用特权

评论回复
7
一个小黄人|  楼主 | 2016-8-29 13:29 | 只看该作者
sting_yang 发表于 2016-8-29 11:42
Key1=(key_down);
Key2=(key_down);
Key3=(key_down);

加了也不行,我用万用表测过电压,电压一直是高电平....

使用特权

评论回复
8
justtest111| | 2016-8-29 13:38 | 只看该作者
一个小黄人 发表于 2016-8-29 13:29
加了也不行,我用万用表测过电压,电压一直是高电平....

你到底是程序问题还是硬件问题?一直高电平是什么鬼?
按键扫描用状态机啊。

使用特权

评论回复
9
lr_xgm| | 2016-8-29 13:42 | 只看该作者
这样的按键电路还没用过

使用特权

评论回复
10
一个小黄人|  楼主 | 2016-8-29 13:53 | 只看该作者
justtest111 发表于 2016-8-29 13:38
你到底是程序问题还是硬件问题?一直高电平是什么鬼?
按键扫描用状态机啊。 ...

程序问题...下面是我后来改的,还是不行/****按键扫描************/
static uchar8 KeyGet()
{
        static uchar8 Key_Num=0;
         
                  switch(Key_Num)
                {
                        case 0:                          //扫描第一行
                        Key1=(key_down);
                         if(!Key2) return Key_ValueIncPlus;
                         if(!Key3) return Key_ValueIncCut;
                         if(!Key4) return Key_ValueStop;
                         if(!Key5) return Key_ValueProgram;
                        Key1=!(key_down);
                         return key_up;
                         Key_Num++;
                         break;
                         case 1:                         //扫描第二行
                        Key2=(key_down);
                         if(!Key1) return Key_Value5;
                         if(!Key3) return Key_Value6;
                         if(!Key4) return Key_Value7;
                         if(!Key5) return Key_Value8;
                        Key2=!(key_down);
                         return key_up;
                         Key_Num++;
                         break;
                         case 2:                         //扫描第三行
                        Key3=(key_down);
                         if(!Key1) return Key_Value9;
                         if(!Key2) return Key_Value10;
                         if(!Key4) return Key_Value11;
                         if(!Key5) return Key_Value12;
                        Key3=!(key_down);
                         return key_up;
                         Key_Num++;
                         break;

使用特权

评论回复
11
一个小黄人|  楼主 | 2016-8-29 13:56 | 只看该作者
justtest111 发表于 2016-8-29 13:38
你到底是程序问题还是硬件问题?一直高电平是什么鬼?
按键扫描用状态机啊。 ...

扫描我用的是状态机,状态机能用,我的意思就是说,扫描按键返回值得不到....

使用特权

评论回复
12
justtest111| | 2016-8-29 14:13 | 只看该作者
一个小黄人 发表于 2016-8-29 13:56
扫描我用的是状态机,状态机能用,我的意思就是说,扫描按键返回值得不到.... ...

#define key_state_0        0
#define key_state_1        1
#define key_state_2        2
#define key_state_3        3
extern char key_return,key_return_1,key_input;        
char key_press,key_val;// key_return = 0;
static char key_state = 0, key_time = 0;
void read_key_n(void)
{            
                key_press = GPIO_ReadInputData(GPIOC)&0X0F;// 读按键I/O电平               
                switch (key_state)
                 {   
                        case key_state_0:                                // 按键初始态
                                if (key_press)
                                {
                                 key_state = key_state_1;        // 键被按下,状态转换到键确认态
                                }
                                key_return = 0;
                                break;
                        case key_state_1:                                // 按键确认态
                                if (key_press)
                     {
                       key_state = key_state_2;        // 按键仍按下,状态转换到计时1
                       key_time = 0;                                // 清另按键时间计数器
                     }
                                else key_state = key_state_0;        // 按键已抬起,转换到按键初始态
                                key_return = 0;
                                break;
                        case key_state_2:
                                if (!key_press)
                     {
                      key_state = key_state_0;        // 按键已释放,转换到按键初始态
                      key_return = 1;                        // 输出“1”
                                }
                                else if (++key_time >= 100)                // 按键时间计数
                                {
                                        key_state = key_state_3;        // 按下时间>1s,状态转换到计时2
                                        key_time = 0;                                // 清按键计数器
                                        key_return = 2;                        // 输出“2”        
                                }
                                break;
                        case key_state_3:
                                if (!key_press)
                                  {
                                    key_state = key_state_0; //按键已释放,转换到按键初始态
                                        key_return = 0;        
                                        }
                                else
                                {
                                    
                                        if (++key_time >= 50)                // 按键时间计数
                                        {
                                                key_time = 0;                        // 按下时间>0.5s,清按键计数器
                                                key_return = 2;                // 输出“2”
                                        }
                                }
                                break;
                    default:key_return = 0;break;
                }
            //return key_return;
}

使用特权

评论回复
13
一个小黄人|  楼主 | 2016-8-29 14:23 | 只看该作者
justtest111 发表于 2016-8-29 14:13
#define key_state_0        0
#define key_state_1        1
#define key_state_2        2

你这个状态机我写了,我就是读不到按键值,兄弟,帮助别人不要一下贴代码,先看下问题

使用特权

评论回复
14
落叶行健ywm| | 2016-8-29 15:14 | 只看该作者
把自己的问题整理下,硬件描述,自己软件想法,想得到什么结果。先学会如何提问。否则一般根本不会回答你的。不会花时间看这样的问题的!

使用特权

评论回复
15
604603487| | 2016-8-29 15:16 | 只看该作者
电路太高深,没看懂

使用特权

评论回复
16
hcfatjh| | 2016-8-29 15:53 | 只看该作者
把上拉电阻去掉,IO要能够改变配置

uint32_t key_value=0;
K1 输出高电平;
K2-K6 配置下拉输入;
//扫描 K2 K3 K4
如果 K2为高电平 key_value|=(1<<0);
如果 K3为高电平 key_value|=(1<<1);
如果 K4为高电平 key_value|=(1<<2);
Key2 输出高电平;
K1,K3-K6 配置下拉输入;
//扫描 K1 K3 K4
如果 K1为高电平 key_value|=(1<<3);
如果 K3为高电平 key_value|=(1<<4);
如果 K4为高电平 key_value|=(1<<5);
Key3 输出高电平;
K1 K2,K4-K6 配置下拉输入;
//扫描 K1 K2 K4
如果 K1为高电平 key_value|=(1<<6);
如果 K3为高电平 key_value|=(1<<7);
如果 K4为高电平 key_value|=(1<<8);
Key4 输出高电平;
K1-K3,K5-K6 配置下拉输入;
//扫描 K1-K3
如果 K1为高电平 key_value|=(1<<9);
如果 K2为高电平 key_value|=(1<<10);
如果 K3为高电平 key_value|=(1<<11);
Key5 输出高电平;
K1-K4,K6 配置下拉输入;
//扫描 K1-K4,K6
如果 K1为高电平 key_value|=(1<<12);
如果 K2为高电平 key_value|=(1<<13);
如果 K3为高电平 key_value|=(1<<14);
如果 K4为高电平 key_value|=(1<<15);
Key6 输出高电平;
K1-K5 配置下拉输入;
//扫描 K1-K5
如果 K1为高电平 key_value|=(1<<16);
如果 K2为高电平 key_value|=(1<<17);
如果 K3为高电平 key_value|=(1<<18);
如果 K4为高电平 key_value|=(1<<19);
return(key_value);

少于两个键按下可以识别,三个或三个以上还没去做分析

使用特权

评论回复
17
一个小黄人|  楼主 | 2016-8-29 17:26 | 只看该作者
hcfatjh 发表于 2016-8-29 15:53
把上拉电阻去掉,IO要能够改变配置

uint32_t key_value=0;

大兄弟,你这样也不行...因为你只拉高没有拉低,按键不停扫描,你这样肯定有错的

使用特权

评论回复
18
一个小黄人|  楼主 | 2016-8-29 19:05 | 只看该作者
604603487 发表于 2016-8-29 15:16
电路太高深,没看懂

大兄弟,有没有5*5的按键程序啊.

使用特权

评论回复
19
七颗咖啡豆| | 2016-8-29 21:40 | 只看该作者
本帖最后由 七颗咖啡豆 于 2016-8-29 22:03 编辑

000

使用特权

评论回复
20
menfiss| | 2016-8-29 22:05 | 只看该作者
用6引脚得到4*6矩阵键盘接口,成功之后记得申请个专利。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

66

帖子

1

粉丝