矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2471|回复: 10

请教大家,我这个指针函数工作不正常,请指教

[复制链接]
     
发表于 2019-9-24 21:39:22 | 显示全部楼层 |阅读模式
我把按键判断的代码,放在中断中,根据 keysta[i]的状态,判断按键是不是按下去了
编写下面的指针函数,结果工作一直不正常,通过指针传递的值一直不对,我找不出哪里不正常,请大家指点,谢谢

void keydriver(unsigned char *p)
{
unsigned char i;
static unsigned char backup[4]={1,1,1,1};
unsigned char keycode[4]={0xff,0xff,0xff,0xff};

for (i=0;i<4;i++)
  {
    if (backup[i] != keysta[i])
          {
           if (backup[i]!=0)
           {
            *p=keycode[i];
           }
            backup[i]=keysta[i];
          }                    
  }
}
     
发表于 2019-9-24 23:15:54 | 显示全部楼层
void keydriver(unsigned char *p)
{
unsigned char i;
static unsigned char backup[4]={1,1,1,1};
unsigned char keycode[4]={0xff,0xff,0xff,0xff};

for (i=0;i<4;i++)
  {
    if (backup[i] != keysta[i])
          {
           if (backup[i]!=0)
           {
            *p=&keycode[i];//取keycode[i]的地址。
           }
            backup[i]=keysta[i];
          }                    
  }
}
或是
void keydriver(unsigned char *p)
{
unsigned char i;
static unsigned char backup[4]={1,1,1,1};
unsigned char keycode[4]={0xff,0xff,0xff,0xff};

for (i=0;i<4;i++)
  {
    if (backup[i] != keysta[i])
          {
           if (backup[i]!=0)
           {
            p=keycode[i];//指针变量赋值。
           }
            backup[i]=keysta[i];
          }                    
  }
}
回复 支持 反对

使用道具 举报

     
发表于 2019-9-24 23:47:00 | 显示全部楼层
*p 是位址, keycode[i] 是字元(char), 你把字元指定給位址當然出錯了

回复 支持 反对

使用道具 举报

     
发表于 2019-9-24 23:54:14 | 显示全部楼层
这个函数都没必要用指针传参.直接通过全局变量交换就可以,中断里的全局变量加volatile修饰一下.
另外好像没看到消抖的处理,可能会不太稳定,用中断处理按键可以研究一下怎么写个简单的状态机,不判断长按只需要三个状态转移,判断长按的话四个就够了.非常简单,但对以后的编程思维会有不小的帮助
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-9-25 16:29:16 | 显示全部楼层
haisens 发表于 2019-9-24 23:15
void keydriver(unsigned char *p)
{
unsigned char i;

谢谢,这两种改法,编译都报错,无效的指针指向
我翻书学习一下:*p代表指针指向的地址的值,我原来那句应该没错啊。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-9-25 16:33:10 | 显示全部楼层
ChrisLove 发表于 2019-9-24 23:54
这个函数都没必要用指针传参.直接通过全局变量交换就可以,中断里的全局变量加volatile修饰一下.
另外好像 ...

谢谢,您 的思路很好
我把消抖程序,加在中断中了
回复 支持 反对

使用道具 举报

     
发表于 2019-9-25 17:50:14 | 显示全部楼层
bios 发表于 2019-9-25 16:29
谢谢,这两种改法,编译都报错,无效的指针指向
我翻书学习一下:*p代表指针指向的地址的值,我原来那 ...

不知道你这个函数怎么调用的,你再贴点代码,你是希望从*P返回KEY值吗?
回复 支持 反对

使用道具 举报

     
发表于 2019-10-1 16:29:43 | 显示全部楼层
haisens 发表于 2019-9-24 23:15
void keydriver(unsigned char *p)
{
unsigned char i;

unsigned char keydriver(void)
直接返回值不就完了
回复 支持 反对

使用道具 举报

     
发表于 2019-10-1 16:49:38 | 显示全部楼层
单片机用指针?我认为是没事情干了给单片机找事情干的操作,慢!
回复 支持 反对

使用道具 举报

     
发表于 2019-10-1 19:55:37 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2019-10-1 22:27:34 | 显示全部楼层
建议你用状态方法编写按键程序,不要用教科书上介绍的延时方法。多看书,看看别人写的程序,多实践,以前没编写按键程序,看书觉得很容易,实际编写就不是那么回事了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-29 16:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表