c-在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或OUTPUT中引脚的方向。在INPUT的情况下,模式要求配置用于PULLUP配置以及INPUT
GPIOPinWrite(引脚,状态(
用途:该功能用于将LOW或HIGH状态写入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不闪烁的原因。尽管该代码在代码块中没有显示任何错误。请检查此代码,并帮助找出问题和解决方案。

此代码有几个基本问题。

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

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

关于如何在没有膨胀软件库的情况下做到这一点的详细指南可以在这里找到:
如何从固件访问硬件寄存器?

最新更新