问题描述
在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?