2.
对其定义进行查看
可以看到LIGHT_RED的值为(PTB_NUM|7)和LIGHT_OFF值为1(低电平点亮)
再对PTB_NUM的定义进行查找
可知PTB_NUM为0b100000000 则PTB_NUM|7为0x0b1 0000 0111
3.
根据定义可知红绿蓝引脚分别为7、8、9
对代码进行修改增加如下:
*gpio_mode &= ~(3<<18); //0b11111111111100111111111111111111;
*gpio_mode |=(1<<18); //0b00000000000001000000000000000000;
*gpio_mode &= ~(3<<16);
*gpio_mode |=(1<<16);
*gpio_mode &= ~(3<<14);
*gpio_mode |=(1<<14);
主循环:
uint8_t flag = 0;//判断是否已经亮过
for(;;) //for(;;)(开头)
{
//(2.1)主循环次数+1,并判断是否小于特定常数
mMainLoopCount++; //+1
if (mMainLoopCount<=6556677) continue; //如果小于特定常数,继续循环
//(2.2)主循环次数超过特定常数,灯状态进行切换(这样灯会闪烁)
mMainLoopCount=0; //清主循环次数
//切换灯状态
if(mFlag == 'A' && flag == 0) //判断mFlag为R时候蓝灯亮
{
*gpio_brr|=(1<<9); //设置灯“亮”
printf("蓝灯:亮\r\n"); //通过调试串口输出灯的状态
flag = 1;
continue;
}
if(mFlag == 'A' && flag == 1) //判断mFlag为R时候红灯亮
{
*gpio_bsrr|=(1<<9); //设置灯“灭”
printf("蓝灯:灭\r\n"); //通过调试串口输出灯的状态
mFlag='R'; //改变状态标志
flag = 0;
continue;
}
if(mFlag == 'R' && flag == 0) //判断mFlag为R时候红灯亮
{
*gpio_brr|=(1<<7); //设置红灯“亮”
printf("红灯:亮\r\n"); //通过调试串口输出灯的状态
flag = 1;
continue;
}
if(mFlag == 'R' && flag == 1) //判断mFlag为R时候红灯亮
{
*gpio_bsrr|=(1<<7); //设置灯“灭”
printf("红灯:灭\r\n"); //通过调试串口输出灯的状态
mFlag='G'; //改变状态标志
flag = 0;
continue;
}
if(mFlag == 'G' && flag == 0) //判断mFlag为R时候绿灯亮
{
*gpio_brr|=(1<<8); //设置绿灯“亮”
printf("绿灯:亮\r\n"); //通过调试串口输出灯的状态
flag = 1;
continue;
}
if(mFlag == 'G' && flag == 1) //判断mFlag为R时候绿灯灭
{
*gpio_bsrr|=(1<<8); //设置灯“灭”
printf("绿灯:灭\r\n"); //通过调试串口输出灯的状态
mFlag='A'; //改变状态标志
flag = 0;
continue;
}
} //for(;;)结尾
可以三种颜色的灯交替变换。
4.
Main函数修改如下:
uint32_t mMainLoopCount; //主循环使用的记录主循环次数变量
uint8_t mFlag; //主循环使用的临时变量
uint8_t colornum; //灯排列组合的编号,一共有八种颜色
//调用gpio_init对灯进行初始化
gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_ON); //初始化蓝灯
gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_ON); //初始化绿灯
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_ON); //初始化红灯
printf("------------------------广州大学------------------------\r\n");
printf("32106100049 ---------- zhang jintao\n");
//(1)======启动部分(结尾)==========================================
//(2)======主循环部分(开头)=========================================
for(;;) //for(;;)(开头)
{
if(colornum > 7)
{
colornum = 0;
}
//(2.1)主循环次数+1,并判断是否小于特定常数
mMainLoopCount++; //+1
if (mMainLoopCount<=6556677) continue; //如果小于特定常数,继续循环
//(2.2)主循环次数超过特定常数,灯状态进行切换(这样灯会闪烁)
mMainLoopCount=0; //清主循环次数
//切换灯状态
if(colornum == 0)//第一种组合
{
colornum++;
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
printf("灯的颜色为:黑色\n");
continue;
}
if(colornum == 1)//第二种组合
{
colornum++;
gpio_set(LIGHT_RED,LIGHT_ON);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
printf("灯的颜色为:红色\n");
continue;
}
if(colornum == 2)//第三种组合
{
colornum++;
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_ON);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
printf("灯的颜色为:绿色\n");
continue;
}
if(colornum == 3)//第四种组合
{
colornum++;
gpio_set(LIGHT_RED,LIGHT_ON);
gpio_set(LIGHT_GREEN,LIGHT_ON);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
printf("灯的颜色为:黄色\n");
continue;
}
if(colornum == 4)//第五种组合
{
colornum++;
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_ON);
printf("灯的颜色为:蓝色\n");
continue;
}
if(colornum == 5)//第六种组合
{
colornum++;
gpio_set(LIGHT_RED,LIGHT_ON);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_ON);
printf("灯的颜色为:紫色\n");
continue;
}
if(colornum == 6)//第七种组合
{
colornum++;
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_ON);
gpio_set(LIGHT_BLUE,LIGHT_ON);
printf("灯的颜色为:青色\n");
continue;
}
if(colornum == 7)//第八种组合
{
colornum++;
gpio_set(LIGHT_RED,LIGHT_ON);
gpio_set(LIGHT_GREEN,LIGHT_ON);
gpio_set(LIGHT_BLUE,LIGHT_ON);
printf("灯的颜色为:白色\n");
continue;
}
} //for(;;)结尾