AVRWARE++开发笔记6:8路直接I/O口控制LED灯实验
2019-07-13 来源:eefocus
本文只针对于初学者,高手请绕过!
1、实验目的
利用单片机的IO口,直接控制LED灯,学会LED灯的控制方法。
2、实验内容
编写一段程序,使LED0~7灯以200ms为间隔从两边同时向中间亮,最终全亮延时200ms然后熄灭。
3、硬件原理
8路直接I/O口控制LED灯硬件原理图如下图所示,使用排线与端子P4相连,则单片机相应端口的0-7引脚与端子P4的LED0-LED7引脚相连接(例如,使用排线将P10与P4端子相连接,则PD0引脚接LED0,PD1引脚接LED1,...PD7引脚接LED7)。端子P4的9、10引脚接5V VCC,则从图中可以看出LED是低电平点亮,单片机相应的引脚发送低电平,LED亮,单片机相应的引脚发送高电平,LED灯灭。
4、实验参考程序及注解
更改映射层1_AbstractionLayer_HAL.h文件
//PortD
#define IO_PD_DIR 0b11111111 //此处指明0-7 8个引脚均为输出
#define IO_PD_OUT 0b11111111 //此处指明0-7 8个引脚默认初始状态为高电平,也就是说在上电时,
/LED0-LED7引脚给高电平,三极管不导通,发光二极管灯灭
////////////////////////////////////////////////////////////////////////////////////
//功能宏定义
#define LED0BIT0
#define LED1BIT1
#define LED2BIT2
#define LED3BIT3
#define LED4BIT4
#define LED5BIT5
#define LED6BIT6
#define LED7BIT7
#define LED0_OPENCLRBIT(PORTD,LED0)
#define LED0_SHUTSETBIT(PORTD,LED0)
#define LED0_TURNCPLBIT(PORTD,LED0)
#define LED1_OPENCLRBIT(PORTD,LED1)
#define LED1_SHUTSETBIT(PORTD,LED1)
#define LED1_TURNCPLBIT(PORTD,LED1)
#define LED2_OPENCLRBIT(PORTD,LED2)
#define LED2_SHUTSETBIT(PORTD,LED2)
#define LED2_TURNCPLBIT(PORTD,LED2)
#define LED3_OPENCLRBIT(PORTD,LED3)
#define LED3_SHUTSETBIT(PORTD,LED3)
#define LED3_TURNCPLBIT(PORTD,LED3)
#define LED4_OPENCLRBIT(PORTD,LED4)
#define LED4_SHUTSETBIT(PORTD,LED4)
#define LED4_TURNCPLBIT(PORTD,LED4)
#define LED5_OPENCLRBIT(PORTD,LED5)
#define LED5_SHUTSETBIT(PORTD,LED5)
#define LED5_TURNCPLBIT(PORTD,LED5)
#define LED6_OPENCLRBIT(PORTD,LED6)
#define LED6_SHUTSETBIT(PORTD,LED6)
#define LED6_TURNCPLBIT(PORTD,LED6)
#define LED7_OPENCLRBIT(PORTD,LED7)
#define LED7_SHUTSETBIT(PORTD,LED7)
#define LED7_TURNCPLBIT(PORTD,LED7)
#define ALL_LED_OPEN //打开所有LEDLED0_OPEN;LED1_OPEN;LED2_OPEN;LED3_OPEN;LED4_OPEN;LED5_OPEN;LED6_OPEN;LED7_OPEN
#define ALL_LED_SHUT //关闭所有LEDLED0_SHUT;LED1_SHUT;LED2_SHUT;LED3_SHUT;LED4_SHUT;LED5_SHUT;LED6_SHUT;LED7_SHUT
更改逻辑层0_logiclayer_main.c文件
//主程序
int main(void)
{
//目标初始化,该函数会自动初始化相应的外设文件
TARGET_Init();
//后台主循环
while(1)
{
//在这里完成自己的项目逻辑
LED0_OPEN;
LED7_OPEN;
TARGET_Delayms(200,1);
LED0_SHUT;
LED7_SHUT;
TARGET_Delayms(200,1);
LED1_OPEN;
LED6_OPEN;
TARGET_Delayms(200,1);
LED1_SHUT;
LED6_SHUT;
TARGET_Delayms(200,1);
LED2_OPEN;
LED5_OPEN;
TARGET_Delayms(200,1);
LED2_SHUT;
LED5_SHUT;
TARGET_Delayms(200,1);
LED3_OPEN;
LED4_OPEN;
TARGET_Delayms(200,1);
LED3_SHUT;
LED4_SHUT;
TARGET_Delayms(200,1);
ALL_LED_OPEN;
TARGET_Delayms(200,1);
ALL_LED_SHUT;
TARGET_Delayms(200,1);
//喂狗语句,大部分工程项目都不应去除
#if WDT_MODE!=0
TARGET_WatchDogReset();
#endif
}
return 0;//永不执行
}