请教大家,我这个指针函数工作不正常,请指教
我把按键判断的代码,放在中断中,根据 keysta的状态,判断按键是不是按下去了编写下面的指针函数,结果工作一直不正常,通过指针传递的值一直不对,我找不出哪里不正常,请大家指点,谢谢
void keydriver(unsigned char *p)
{
unsigned char i;
static unsigned char backup={1,1,1,1};
unsigned char keycode={0xff,0xff,0xff,0xff};
for (i=0;i<4;i++)
{
if (backup != keysta)
{
if (backup!=0)
{
*p=keycode;
}
backup=keysta;
}
}
} void keydriver(unsigned char *p)
{
unsigned char i;
static unsigned char backup={1,1,1,1};
unsigned char keycode={0xff,0xff,0xff,0xff};
for (i=0;i<4;i++)
{
if (backup != keysta)
{
if (backup!=0)
{
*p=&keycode;//取keycode的地址。
}
backup=keysta;
}
}
}
或是
void keydriver(unsigned char *p)
{
unsigned char i;
static unsigned char backup={1,1,1,1};
unsigned char keycode={0xff,0xff,0xff,0xff};
for (i=0;i<4;i++)
{
if (backup != keysta)
{
if (backup!=0)
{
p=keycode;//指针变量赋值。
}
backup=keysta;
}
}
}
*p 是位址, keycode 是字元(char), 你把字元指定給位址當然出錯了
这个函数都没必要用指针传参.直接通过全局变量交换就可以,中断里的全局变量加volatile修饰一下.
另外好像没看到消抖的处理,可能会不太稳定,用中断处理按键可以研究一下怎么写个简单的状态机,不判断长按只需要三个状态转移,判断长按的话四个就够了.非常简单,但对以后的编程思维会有不小的帮助 haisens 发表于 2019-9-24 23:15
void keydriver(unsigned char *p)
{
unsigned char i;
谢谢,这两种改法,编译都报错,无效的指针指向
我翻书学习一下:*p代表指针指向的地址的值,我原来那句应该没错啊。 ChrisLove 发表于 2019-9-24 23:54
这个函数都没必要用指针传参.直接通过全局变量交换就可以,中断里的全局变量加volatile修饰一下.
另外好像 ...
谢谢,您 的思路很好
我把消抖程序,加在中断中了 bios 发表于 2019-9-25 16:29
谢谢,这两种改法,编译都报错,无效的指针指向
我翻书学习一下:*p代表指针指向的地址的值,我原来那 ...
不知道你这个函数怎么调用的,你再贴点代码,你是希望从*P返回KEY值吗? haisens 发表于 2019-9-24 23:15
void keydriver(unsigned char *p)
{
unsigned char i;
unsigned char keydriver(void)
直接返回值不就完了 单片机用指针?我认为是没事情干了给单片机找事情干的操作,慢! 建议你用状态方法编写按键程序,不要用教科书上介绍的延时方法。多看书,看看别人写的程序,多实践,以前没编写按键程序,看书觉得很容易,实际编写就不是那么回事了。
页:
[1]