我想为我的 AVR ATmega328 编写一个函数,该函数使用状态空间来消除开关的抖动,以确认按下开关。完成它后,我想概括我的函数,以便将来可以通过少量工作重用它,但这涉及传递我想用作函数参数的引脚,而我无法让它工作。
这就是我现在拥有的:
int debounceSwitch(unsigned char *port, uint8_t mask)
{
int n = 0;
while (1)
{
switch (n)
{
case 0: //NoPush State
_delay_ms(30);
if(!(*port & (1<<mask))){n = n + 1;}
else {return 0;}
break;
case 1: //MaybePush State
_delay_ms(30);
if(!(*port & (1<<mask))){n = n + 1;}
else {n = n - 1;}
break;
case 2: //YesPush State
_delay_ms(30);
if(!(*port & (1<<mask))){return 1;}
else {n = n - 1;}
break;
}
}
}
我有一种预感,我的问题在于我用作参数的数据类型,我似乎在网上得到了不同的答案。
任何帮助将不胜感激!
最佳答案
AVR 端口是特殊的 IO 寄存器,可以使用 IN 和 OUT 指令访问它们。不像内存使用 LDR 等。
从端口定义中可以看出,需要使端口指针可变。当您尝试将 PORT 传递给函数时,编译器也会将其作为警告告诉您。
#define PORTB _SFR_IO8(0x05)
映射到
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
关于c - 将 PIN 状态作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54897476/