c - 将 PIN 状态作为函数参数传递

标签 c embedded avr atmega

我想为我的 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/

相关文章:

c - 指向成员属性的指针

Coccinelle:将有序结构声明更改为无序

c - 用于并行的 OpenMP get_num_threads

c - Linux录像机最高效的文件写入方法

c - C 语言文件 I/O 程序 : Segmention Fault (core dumped)

c - 为什么PWM信号输出不出来?

c - 在不使用 "-g"标志进行编译的情况下使用 gdb

c++ - 如何防止需要复制传递给 avr-gcc C++ 构造函数的字符串?

c - FFT bin 宽度说明

c - 使用枚举设置标志时的 AVR C 随机行为