在atmega328p上执行某些LED闪烁的任务

问题描述

在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(引脚,模式)
目的:该功能用于配置引脚的模式。
引脚:需要配置的Atmega328P端口引脚。
模式:输入或输出中引脚的方向。如果是INPUT,则要求该模式为 配置为与INPUT一起进行PULLUP配置。
GPIOPinWrite(引脚,状态)
目的:该功能用于将LOW或HIGH状态写入GPIO引脚。
引脚: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不闪烁的原因。尽管代码代码块中未显示任何错误。 请检查此代码,并请帮助找出问题和解决方案。

解决方法

此代码有几个基本问​​题。

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

只需忘记在非常基础的内容之上编写bloatware函数层,字符串比较和其他不相关的内容即可。而是将所有内容写在一条易于读取的行上:DDRD = PD7 | PD6 | PD3 | PD2;等,并假设这些应作为输出。拉入寄存器也一样。

在没有膨胀软件库的情况下如何执行此操作的详细指南可以在这里找到:
How to access a hardware register from firmware?