嵌入式作业04

1.学习示例程序gpio.c和main.c

2.给出gpio_set(LIGHT_RED,LIGHT_OFF);语句中,LIGHT_RED和LIGHT_OFF的值是多少?

打开文件usr.h查阅可知

LIGHT_RED的值是PTB_NUM|7;

LIGHT_OFF的值是0。

打开文件gpio.h可知

PTB_NUM定义为0b10000 0000,
所以LIGHT_RED的值PTB_NUM|7 = 0b10000 0111

3.用直接地址编程方式,实现红绿蓝三灯轮流闪烁

导入工程

添加定义

修改main函数结构,改成红绿蓝三色顺序轮流闪烁:

红:

绿:

蓝:

 //切换灯状态
        if(mColor==0)
        {
        if (mFlag=='A')   //若灯状态标志为'A'
        	{
        	    *gpio_mode &= ~(3 << 14);  // 将B口7脚对应的位清零
				*gpio_mode |= (1 << 14);   // 设为输出引脚
		    	*gpio_brr|=(1<<7);     //设置灯“亮”
            	printf("红灯:亮\r\n");  //通过调试串口输出灯的状态
            	mFlag='L';             //改变状态标志
        	}
       		else                   //否则,若灯状态标志不为'A'    
        	{
		    	*gpio_bsrr|=(1<<7);     //设置灯“暗”
            	printf("红灯:暗\r\n");   //通过调试串口输出灯的状态
            	mFlag='A';              //改变状态标志
            	mColor++;
            	continue;
        	}
        
    		
        }
        if(mColor==1)
        {
    		if (mFlag=='A')   //若灯状态标志为'A'
        	{
        	    *gpio_mode &= ~(3 << 16);  // 将B口8脚对应的位清零
				*gpio_mode |= (1 << 16);   // 设为输出引脚 
		    	*gpio_brr|=(1<<8);     //设置灯“亮”
            	printf("绿灯:亮\r\n");  //通过调试串口输出灯的状态
            	mFlag='L';             //改变状态标志
        	}
       		else                   //否则,若灯状态标志不为'A'    
        	{
		    	*gpio_bsrr|=(1<<8);     //设置灯“暗”
            	printf("绿灯:暗\r\n");   //通过调试串口输出灯的状态
            	mFlag='A';              //改变状态标志
            	mColor++;
            	continue;
        	}
        }
        if(mColor==2)
        {
    		if (mFlag=='A')   //若灯状态标志为'A'
        	{
        	    *gpio_mode &= ~(3<<18);  //0b11111111111100111111111111111111; 
    			*gpio_mode |=(1<<18);    //0b00000000000001000000000000000000;
		    	*gpio_brr|=(1<<9);     //设置灯“亮”
            	printf("蓝灯:亮\r\n");  //通过调试串口输出灯的状态
            	mFlag='L';             //改变状态标志
        	}
       		else                   //否则,若灯状态标志不为'A'    
        	{
		    	*gpio_bsrr|=(1<<9);     //设置灯“暗”
            	printf("蓝灯:暗\r\n");   //通过调试串口输出灯的状态
            	mFlag='A';              //改变状态标志
            	mColor=0;
            	continue;
        	}
        }
    }     //for(;;)结尾

运行结果:

红绿蓝三色闪烁:

4、用调用构建方式,实现红绿蓝的八种组合轮流闪烁

导入工程

修改工程代码结构,实现三色组合(即七色)闪烁:

#define GLOBLE_VAR
#include "includes.h"      //包含总头文件
 
//----------------------------------------------------------------------
//声明使用到的内部函数
//main.c使用的内部函数声明处
 
//----------------------------------------------------------------------
//主函数,一般情况下可以认为程序从此开始运行(实际上有启动过程,参见书稿)
int main(void)
{
//(1)======启动部分(开头)==========================================
//(1.1)声明main函数使用的局部变量
	uint32_t mMainLoopCount;  //主循环次数变量
	uint8_t  mFlag;           //灯的状态标志
	uint32_t mLightCount;     //灯的状态切换次数
	uint32_t mColor;//七色标志
 
//(1.2)【不变】关总中断
	DISABLE_INTERRUPTS;
 
//(1.3)给主函数使用的局部变量赋初值
    mMainLoopCount=0;    //主循环次数变量
	mFlag='A';           //灯的状态标志
	mLightCount=0;       //灯的状态切换次数
	mColor=0;//七色标志
 
//(1.4)给全局变量赋初值
   
//(1.5)用户外设模块初始化
	gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_ON);	//初始化蓝灯
	gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_ON);	//初始化绿灯
	gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_ON);		//初始化红灯
   
//(1.6)使能模块中断
    
   
//(1.7)【不变】开总中断
	ENABLE_INTERRUPTS;
	
	printf("------------------------------------------------------\n");   
    printf("金葫芦提示:构件法输出控制小灯亮暗   \n");
    printf("    第一次用构件方法点亮的蓝色发光二极管,\n");
    printf("    这是进行应用编程的第一步,可以在此基础上,\n");
    printf("   “照葫芦画瓢”地继续学习实践。\n");
    printf("    例如:改为绿灯;调整闪烁频率等。\n");
    printf("------------------------------------------------------\n"); 
    
    //asm ("bl .");
    
    //for(;;) {  }     //在此打桩,理解蓝色发光二极管为何亮起来了?
    
        
//(1)======启动部分(结尾)==========================================
 
//(2)======主循环部分(开头)========================================
	for(;;)   //for(;;)(开头)
	{
//(2.1)主循环次数变量+1
        mMainLoopCount++;
//(2.2)未达到主循环次数设定值,继续循环
		if (mMainLoopCount<=12888999)  continue;
//(2.3)达到主循环次数设定值,执行下列语句,进行灯的亮暗处理
//(2.3.1)清除循环次数变量
		mMainLoopCount=0; 
//(2.3.2)如灯状态标志mFlag为'L',灯的闪烁次数+1并显示,改变灯状态及标志
		if (mColor==0)                    //判断灯的状态标志
		{
			mLightCount++;  
			mColor++;
			printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
			mFlag='A';                       //灯的状态标志
			gpio_set(LIGHT_BLUE,LIGHT_ON);  //蓝灯“亮”
			gpio_set(LIGHT_GREEN,LIGHT_OFF);//绿灯“暗”
			gpio_set(LIGHT_RED,LIGHT_OFF);	 //红灯“暗”
			printf(" LIGHT_BLUE:ON\nLIGHT_GREEN:OFF\nLIGHT_RED:OFF\n蓝色灯\n");   //串口输出灯的状态
			continue;
		}
		if (mColor==1)                    //判断灯的状态标志
		{
			mLightCount++;  
			mColor++;
			printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
			mFlag='A';                       //灯的状态标志
			gpio_set(LIGHT_BLUE,LIGHT_OFF);  //蓝灯“暗”
			gpio_set(LIGHT_GREEN,LIGHT_ON);//绿灯“亮”
			gpio_set(LIGHT_RED,LIGHT_OFF);	 //红灯“暗”
			printf(" LIGHT_BLUE:OFF\nLIGHT_GREEN:ON\nLIGHT_RED:OFF\n绿色灯\n");   //串口输出灯的状态
			continue;
		}
		if (mColor==2)                    //判断灯的状态标志
		{
			mLightCount++;  
			mColor++;
			printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
			mFlag='A';                       //灯的状态标志
			gpio_set(LIGHT_BLUE,LIGHT_ON);  //蓝灯“亮”
			gpio_set(LIGHT_GREEN,LIGHT_ON);//绿灯“亮”
			gpio_set(LIGHT_RED,LIGHT_OFF);	 //红灯“暗”
			printf(" LIGHT_BLUE:ON\nLIGHT_GREEN:ON\nLIGHT_RED:OFF\n青色灯\n");   //串口输出灯的状态
			continue;
		}
		if (mColor==3)                    //判断灯的状态标志
		{
			mLightCount++;  
			mColor++;
			printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
			mFlag='A';                       //灯的状态标志
			gpio_set(LIGHT_BLUE,LIGHT_OFF);  //蓝灯“暗”
			gpio_set(LIGHT_GREEN,LIGHT_OFF);//绿灯“暗”
			gpio_set(LIGHT_RED,LIGHT_ON);	 //红灯“亮”
			printf(" LIGHT_BLUE:OFF\nLIGHT_GREEN:OFF\nLIGHT_RED:ON\n红色灯\n");   //串口输出灯的状态
			continue;
		}
		if (mColor==4)                    //判断灯的状态标志
		{
			mLightCount++;  
			mColor++;
			printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
			mFlag='A';                       //灯的状态标志
			gpio_set(LIGHT_BLUE,LIGHT_ON);  //蓝灯“亮”
			gpio_set(LIGHT_GREEN,LIGHT_OFF);//绿灯“暗”
			gpio_set(LIGHT_RED,LIGHT_ON);	 //红灯“亮”
			printf(" LIGHT_BLUE:ON\nLIGHT_GREEN:OFF\nLIGHT_RED:ON\n紫色灯\n");   //串口输出灯的状态
			continue;
		}
		if (mColor==5)                    //判断灯的状态标志
		{
			mLightCount++;  
			mColor++;
			printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
			mFlag='A';                       //灯的状态标志
			gpio_set(LIGHT_BLUE,LIGHT_OFF);  //蓝灯“暗”
			gpio_set(LIGHT_GREEN,LIGHT_ON);//红灯“亮”
			gpio_set(LIGHT_RED,LIGHT_ON);	 //绿灯“亮”
			printf(" LIGHT_BLUE:OFF\nLIGHT_GREEN:ON\nLIGHT_RED:ON\n黄色灯\n");   //串口输出灯的状态
			continue;
		}
		if (mColor==6)                    //判断灯的状态标志
		{
			mLightCount++;  
			mColor++;
			printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
			mFlag='A';                       //灯的状态标志
			gpio_set(LIGHT_BLUE,LIGHT_ON);  //蓝灯“亮”
			gpio_set(LIGHT_GREEN,LIGHT_ON);//红灯“亮”
			gpio_set(LIGHT_RED,LIGHT_ON);	 //绿灯“亮”
			printf(" LIGHT_BLUE:ON\nLIGHT_GREEN:ON\nLIGHT_RED:ON\n白色灯\n");   //串口输出灯的状态
			continue;
		}
		if (mColor==7)                    //判断灯的状态标志
		{
			mColor=0;
			mFlag='L';                       //灯的状态标志
			gpio_set(LIGHT_BLUE,LIGHT_OFF);  //蓝灯“暗”
			gpio_set(LIGHT_GREEN,LIGHT_OFF);//红灯“暗”
			gpio_set(LIGHT_RED,LIGHT_OFF);	 //绿灯“暗”
			printf(" LIGHT_BLUE:OFF\nLIGHT_GREEN:OFF\nLIGHT_RED:OFF\n灭灯\n");   //串口输出灯的状态
		}
	}  //for(;;)结尾
//(2)======主循环部分(结尾)========================================
}   //main函数(结尾)

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值