红绿蓝灯闪烁
要完成红绿蓝灯闪烁,注意调整灯的状态标志和灯的控制逻辑。
//======================================================================
//文件名称:main.c(应用工程主函数)
//框架提供:SD-Arm(sumcu.suda.edu.cn)
//版本更新:20191108-20200419
//功能描述:见本工程的..\01_Doc\Readme.txt
//移植规则:【固定】
//======================================================================
#define GLOBLE_VAR
#include "includes.h" //包含总头文件//----------------------------------------------------------------------
//声明使用到的内部函数
//main.c使用的内部函数声明处//----------------------------------------------------------------------
//主函数,一般情况下可以认为程序从此开始运行(实际上有启动过程,参见书稿)
int main(void)
{
//(1)======启动部分(开头)==========================================
//(1.1)声明main函数使用的局部变量uint32_t mMainLoopCount; //主循环次数变量uint8_t mFlag; //灯的状态标志uint32_t mLightCount; //灯的状态切换次数//(1.2)【不变】关总中断DISABLE_INTERRUPTS;//(1.3)给主函数使用的局部变量赋初值mMainLoopCount=0; //主循环次数变量mFlag='R'; //灯的状态标志,初始为红灯mLightCount=0; //灯的闪烁次数//(1.4)给全局变量赋初值//(1.5)用户外设模块初始化gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_ON); //初始化红灯gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_OFF); //初始化绿灯gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_OFF); //初始化蓝灯//(1.6)使能模块中断//(1.7)【不变】开总中断ENABLE_INTERRUPTS;printf("------------------------------------------------------\n"); printf("金葫芦提示:构件法输出控制小灯亮暗 \n");printf(" 交通灯依次闪烁:红灯、绿灯、蓝灯。\n");printf("------------------------------------------------------\n"); //asm ("bl .");//for(;;) { } //在此打桩,理解交通灯为何亮起来了?//(1)======启动部分(结尾)==========================================//(2)======主循环部分(开头)========================================for(;;) //for(;;)(开头){
//(2.1)主循环次数变量+1mMainLoopCount++;
//(2.2)未达到主循环次数设定值,继续循环if (mMainLoopCount<=12888999) continue;
//(2.3)达到主循环次数设定值,执行下列语句,进行灯的亮暗处理
//(2.3.1)清除循环次数变量mMainLoopCount=0;
//(2.3.2)根据灯状态标志mFlag控制灯的状态if (mFlag=='R') //判断灯的状态标志{mLightCount++; printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);mFlag='G'; //改变状态为绿灯gpio_set(LIGHT_RED,LIGHT_OFF); //红灯“灭”gpio_set(LIGHT_GREEN,LIGHT_ON); //绿灯“亮”printf(" LIGHT_GREEN:ON--\n"); //串口输出灯的状态}else if(mFlag=='G'){mFlag='B'; //改变状态为蓝灯gpio_set(LIGHT_GREEN,LIGHT_OFF); //绿灯“灭”gpio_set(LIGHT_BLUE,LIGHT_ON); //蓝灯“亮”printf(" LIGHT_BLUE:ON--\n"); //串口输出灯的状态}else {mFlag='R'; //改变状态为红灯gpio_set(LIGHT_BLUE,LIGHT_OFF); //蓝灯“灭”gpio_set(LIGHT_RED,LIGHT_ON); //红灯“亮”printf(" LIGHT_RED:ON--\n"); //串口输出灯的状态}}
//(2)======主循环部分(结尾)====================================//main函数(//======以下为主函数调用的子函数===========================================//========================================================================
/*知识要素:(1)main.c是一个模板,该文件所有代码均不涉及具体的硬件和环境,通过调用构件实现对硬件的干预。(2)本文件中对宏GLOBLE_VAR进行了定义,所以在包含"includes.h"头文件时,定义全局变量,在其他文件中包含"includes.h"头文件时,编译时会自动增加extern*/
看清楚在for(;;)循环里:
#include "includes.h"int main(void)
{uint32_t mMainLoopCount = 0;uint8_t mFlag = 'R';DISABLE_INTERRUPTS;gpio_init(LIGHT_RED, GPIO_OUTPUT, LIGHT_ON);gpio_init(LIGHT_GREEN, GPIO_OUTPUT, LIGHT_OFF);gpio_init(LIGHT_BLUE, GPIO_OUTPUT, LIGHT_OFF);ENABLE_INTERRUPTS;for (;;){mMainLoopCount++;if (mMainLoopCount <= 12888999) continue;mMainLoopCount = 0;if (mFlag == 'R'){gpio_set(LIGHT_RED, LIGHT_OFF);gpio_set(LIGHT_GREEN, LIGHT_ON);mFlag = 'G';}else if (mFlag == 'G'){gpio_set(LIGHT_GREEN, LIGHT_OFF);gpio_set(LIGHT_BLUE, LIGHT_ON);mFlag = 'B';}else{gpio_set(LIGHT_BLUE, LIGHT_OFF);gpio_set(LIGHT_RED, LIGHT_ON);mFlag = 'R';}}
}