-1

使用 atmega328p 上的两个开关和两个 LED 构建模块化程序。遵循以下条件:

Switch-I   Switch-II   LED 1 state   LED 2 state
 open         open         LOW           LOW
 open         close        LOW           HIGH
 close        open         HIGH          LOW
 close        close    Toggle LED     Toggle LED

我们还要做两个函数:
GPIOConfig(Pin, mode)
目的:该函数用于配置引脚的模式。
Pin:需要配置的 Atmega328P 端口引脚。
模式:INPUT 或 OUTPUT 引脚的方向。在 INPUT 的情况下,模式需要与 INPUT 一起配置为 PULLUP 配置。
GPIOPinWrite(pin, state)
用途:该函数用于向 GPIO 引脚写入 LOW 或 HIGH 状态。
引脚:Atmega328P 引脚用于写入 LOW 或 HIGH 状态。状态:低或
高这是我编写的代码:

#include"GPIO.h"
#include<stdint.h>
#include<avr/io.h>
#include<util/delay.h>
#define SET_BIT(PORT,BIT) PORT|= (1<<BIT)
#define CLR_BIT(PORT,BIT) PORT&= ~(1<<BIT)
//#define TOGGLE_BIT(PORT,BIT) PORT^= (1<<BIT)
void GPIOConfig(uint8_t PORT,uint8_t PIN);
void GPIOPinWrite(uint8_t PIN,char* STATE);
int main()
{
    GPIOConfig(DDRD,PD7);
    GPIOConfig(DDRD,PD6);
    GPIOConfig(DDRD,PD3);
    GPIOConfig(DDRD,PD2);
    //GPIOConfig();// Insert code
    while(1)
    {
     //GPIOPinRead();
     uint8_t PIN_READ=0x00; // 00000000
     if(PIN_READ==PIND)
        if ((PIN_READ & (1<<PD2)) && PIN_READ & (1<<PD3)) // (00000100)& (00000100) //Pooling
        {
            while(1)
            {
           GPIOPinWrite(PD7,"HIGH");
           GPIOPinWrite(PD6,"HIGH");
           _delay_ms(1000);
           GPIOPinWrite(PD7,"LOW");
           GPIOPinWrite(PD6,"LOW");
           _delay_ms(1000);
            }
        }
        else if((PIN_READ & (1<<PD2)))//&& (PIN_READ & ~(1<<PD3)))
        {
            GPIOPinWrite(PD7,"HIGH");
        }
        else if((PIN_READ & (1<<PD3)))// && (PIN_READ & (1<<PD2)))
        {
            GPIOPinWrite(PD6,"HIGH");
        }
        else
        {
            GPIOPinWrite(PD7,"LOW");
            GPIOPinWrite(PD6,"LOW");
        }
    }
    return 0;
}
void GPIOConfig(uint8_t PORT,uint8_t PIN)
{
if(PIN==PD6 || PIN==PD7)
{
    SET_BIT(PORT,PIN);
}
else if(PIN==PD2 || PIN==PD3)
{
    SET_BIT(PORT,PIN);         // PD7,PD6 as output - LED is connected
    CLR_BIT(PORTD,PIN);        // Making it a pull up configuration
}
}
void GPIOPinWrite(uint8_t PIN,char* STATE)
{
if(STATE=="HIGH")
    SET_BIT(PORTD,PIN);
else if(STATE=="LOW")
    CLR_BIT(PORTD,PIN);
}

根据我的说法,逻辑是正确的,但变量和引脚的减速和初始化不正确,这就是我的 LED 不闪烁的原因。尽管代码在代码块中没有显示任何错误。请检查此代码,并请帮助找出问题和解决方案。

4

1 回答 1

3

这段代码有几个基本问​​题。

in main() 应该是对实际寄存器的DDRD引用,从某个寄存器映射头中获取。然后将此寄存器的传递给接受uint8_t PORT. 与实际寄存器的连接丢失,您的函数最终操作一些局部变量而不是实际寄存器。

只需忘记在非常基本的东西之上编写膨胀软件函数层、字符串比较和其他不相关的东西。而是将所有内容写在一个可读的行上:DDRD = PD7 | PD6 | PD3 | PD2;等,假设这些应该是输出。拉取寄存器也是如此。

可以在此处找到有关如何在没有 bloatware 库的情况下执行此操作的详细指南:
如何从固件访问硬件寄存器?

于 2020-09-08T07:38:59.273 回答