嵌入式课程作业4

问题2

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

此处所使用的LIGHT_RED和LiGHT_OFF是用户化的宏,它们在user.h中定义,需要进入CH04中,进入GPIO-BlueLight_20230328文件中的05_UserBoard,双击打开user.h文件,查看其定义如下:

分别为箭头所指的两个定义值,此处LIGHT_RED中还有一定义值PTB_NUM未知

在如下图箭头所示的路径中,找到该定义值

即PTB_NUM被定义为 0b 1 0000 0000,则LIGHT_RED被定义为0b 1 0000 0111

问题3

用GPIO端口的直接地址编程方式,实现红绿蓝三灯轮流闪烁。

//GZHU 32106100059 CKS
    printf("GZHU CKS\r\n");
    for(;;)     //for(;;)(开头)
    {
        
     
            //(2.1)主循环次数+1,并判断是否小于特定常数
            mMainLoopCount++;                         //+1
            if (mMainLoopCount<=6556677)  continue;   //如果小于特定常数,继续循环
            //(2.2)主循环次数超过特定常数,灯状态进行切换(这样灯会闪烁)
            mMainLoopCount=0;      //清主循环次数
            mFlag=0;
        if(mFlag==0)//红灯
        {
        
            //切换灯状态
            *gpio_brr|=(1<<7);     //设置灯“亮”
            printf("红灯:亮\r\n");  //通过调试串口输出灯的状态
            for(int i=0;i<10000000;i++)
            {}
            *gpio_bsrr|=(1<<7);     //设置灯“暗”
        printf("红灯:暗\r\n");   //通过调试串口输出灯的状态
        for(int i=0;i<10000000;i++)
            {}
            mFlag=1;
            }
            if(mFlag==1)//绿灯
            {
        
            *gpio_brr|=(1<<8);     //设置灯“亮”
            printf("绿灯:亮\r\n");  //通过调试串口输出灯的状态
            for(int i=0;i<10000000;i++)
            {}
            *gpio_bsrr|=(1<<8);     //设置灯“暗”
            printf("绿灯:暗\r\n");   //通过调试串口输出灯的状态
            for(int i=0;i<10000000;i++)
            {}
            mFlag=2;
            }
            if(mFlag==2)//蓝灯
            {
        
            *gpio_brr|=(1<<9);     //设置灯“亮”
            printf("蓝灯:亮\r\n");  //通过调试串口输出灯的状态
            for(int i=0;i<10000000;i++)
            {}
            *gpio_bsrr|=(1<<9);     //设置灯“暗”
            printf("蓝灯:暗\r\n");   //通过调试串口输出灯的状态
            for(int i=0;i<10000000;i++)
            {}
            }
        }      //for(;;)结尾

此处将原有的mFlag变量改为数字0,1,2,分别代表红绿蓝三色。

结果如下:

问题4

直接依照原有例子进行改写,使用gpio进行灯光切换。

在开头加入如下定义

uint32_t Count;     //灯的闪烁次数
uint32_t Color;     //灯的颜色

Count=0;       //灯的闪烁次数
Color=0;		 //灯的颜色

在主程序中写入如下内容 

printf("GZHU,32106100059,CKS\n");
	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 (Color==0)                    //判断灯的状态标志
		{
			Count++;                   
			gpio_set(LIGHT_BLUE,LIGHT_ON);  //蓝灯“亮”
			gpio_set(LIGHT_GREEN,LIGHT_OFF);//绿灯“暗”
			gpio_set(LIGHT_RED,LIGHT_OFF);	 //红灯“暗”
			printf("灯的闪烁次数:%d\n",Count);
			printf("蓝灯:亮,绿灯:暗,红灯:暗\n");   //串口输出灯的状态
			Color++; 
			continue;
		}
		if (Color==1)                    //判断灯的状态标志
		{
			Count++;  				
			gpio_set(LIGHT_BLUE,LIGHT_OFF);  //蓝灯“暗”
			gpio_set(LIGHT_GREEN,LIGHT_ON);//绿灯“亮”
			gpio_set(LIGHT_RED,LIGHT_OFF);	 //红灯“暗”
			printf("灯的闪烁次数:%d\n",Count);
			printf(" 蓝灯:暗,绿灯:亮,红灯:暗\n");   //串口输出灯的状态
			Color++;	
			continue;
		}
		if (Color==2)                    //判断灯的状态标志
		{
			Count++;  
			gpio_set(LIGHT_BLUE,LIGHT_ON);  //蓝灯“亮”
			gpio_set(LIGHT_GREEN,LIGHT_ON);//绿灯“亮”
			gpio_set(LIGHT_RED,LIGHT_OFF);	 //红灯“暗”
			printf("灯的闪烁次数:%d\n",Count);
			printf(" 蓝灯:亮,绿灯:亮,红灯:暗\n");   //串口输出灯的状态
			Color++;
			continue;
		}
		if (Color==3)                    //判断灯的状态标志
		{
			Count++;  
					
			gpio_set(LIGHT_BLUE,LIGHT_OFF);  //蓝灯“暗”
			gpio_set(LIGHT_GREEN,LIGHT_OFF);//绿灯“暗”
			gpio_set(LIGHT_RED,LIGHT_ON);	 //红灯“亮”
			printf("灯的闪烁次数:%d\n",Count);
			printf(" 蓝灯:暗,绿灯:暗,红灯:亮\n");   //串口输出灯的状态
			Color++;
			continue;
		}
		if (Color==4)                    //判断灯的状态标志
		{
			Count++;  
			gpio_set(LIGHT_BLUE,LIGHT_ON);  //蓝灯“亮”
			gpio_set(LIGHT_GREEN,LIGHT_OFF);//绿灯“暗”
			gpio_set(LIGHT_RED,LIGHT_ON);	 //红灯“亮”
			printf("灯的闪烁次数:%d\n",Count);
			printf("蓝灯:亮,绿灯:暗,红灯:亮\n");   //串口输出灯的状态
			Color++;
			continue;
		}
		if (Color==5)                    //判断灯的状态标志
		{
			Count++;  
			gpio_set(LIGHT_BLUE,LIGHT_OFF);  //蓝灯“暗”
			gpio_set(LIGHT_GREEN,LIGHT_ON);//红灯“亮”
			gpio_set(LIGHT_RED,LIGHT_ON);	 //绿灯“亮”
			printf("灯的闪烁次数:\n",Count);
			printf(" 蓝灯:暗,绿灯:亮,红灯:亮\n");   //串口输出灯的状态
			Color++;
			continue;
		}
		if (Color==6)                    //判断灯的状态标志
		{
			Count++;  
			gpio_set(LIGHT_BLUE,LIGHT_ON);  //蓝灯“亮”
			gpio_set(LIGHT_GREEN,LIGHT_ON);//红灯“亮”
			gpio_set(LIGHT_RED,LIGHT_ON);	 //绿灯“亮”
			printf("灯的闪烁次数: %d\n",Count);
			printf(" 蓝灯:亮,绿灯:亮,红灯:亮\n");   //串口输出灯的状态
			Color++;
			continue;
		}
		if (Color==7)                    //判断灯的状态标志
		{
			Color=0;//灯光重置
			gpio_set(LIGHT_BLUE,LIGHT_OFF);  //蓝灯“暗”
			gpio_set(LIGHT_GREEN,LIGHT_OFF);//红灯“暗”
			gpio_set(LIGHT_RED,LIGHT_OFF);	 //绿灯“暗”
			printf("蓝灯:暗,绿灯:暗,红灯:暗\n");   //串口输出灯的状态
		}
	}  //for(;;)结尾

所得结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值