一、学习CH04示例程序,包括gpio.c和4个工程中的main.c。
二、给出 gpio_set(LIGHT_RED,LIGHT_OFF);语句中,LIGHT_RED和LIGHT OFF的值是多少?贴出每一步的查找截图。
GPIO-BlueLight_20230328/_AppPrg/main.c
GPIO-BlueLight_20230328/05_UserBoard/user.h
GPIO-BlueLight_20230328/03_MCU/MCU_drivers/gpio.h
LIGHT OFF的值是1
LIGHT_RED的值是((1<<8)|7)=263
三、用直接地址编程方式,实现红绿蓝三灯轮流闪烁
修改代码
//(1)======启动部分(结尾)==========================================
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_ON);
//(2)======主循环部分(开头)=========================================
for(;;) //for(;;)(开头)
{
//(2.1)主循环次数+1,并判断是否小于特定常数
mMainLoopCount++; //+1
if (mMainLoopCount<=6556677) continue; //如果小于特定常数,继续循环
//(2.2)主循环次数超过特定常数,灯状态进行切换(这样灯会闪烁)
mMainLoopCount=0; //清主循环次数
//切换灯状态
if (mFlag=='B') //若灯状态标志为'B'
{
*gpio_bsrr|=(1<<7); //设置红灯“暗”
*gpio_brr|=(1<<9); //设置蓝灯“亮”
printf("蓝灯:亮\r\n"); //通过调试串口输出灯的状态
mFlag='G'; //改变状态标志
}
else if(mFlag=='G') //若灯状态标志为'G'
{
*gpio_bsrr|=(1<<9); //设置蓝灯“暗”
*gpio_brr|=(1<<8); //设置绿灯“亮”
printf("绿灯:亮\r\n"); //通过调试串口输出灯的状态
mFlag='R'; //改变状态标志
}
else if(mFlag=='R') //若灯状态标志为'R'
{
*gpio_bsrr|=(1<<8); //设置绿灯“暗”
*gpio_brr|=(1<<7); //设置红灯“亮”
printf("红灯:亮\r\n"); //通过调试串口输出灯的状态
mFlag='B'; //改变状态标志
}
} //for(;;)结尾
四、用调用构件方式,实现红绿蓝的八种组合轮流闪烁
//(1)======启动部分(结尾)==========================================
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_ON);
//(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 (mFlag=='R') // 红色
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='G'; //灯的状态标志
gpio_set(LIGHT_RED,LIGHT_ON); //灯“亮”
printf(" LIGHT_RED:ON--\n\n"); //串口输出灯的状态
}
//(2.3.3)如灯状态标志mFlag为'G',改变灯状态及标志
else if (mFlag=='G') // 绿色
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='B'; //灯的状态标志
gpio_set(LIGHT_RED,LIGHT_OFF); //灯“暗”
gpio_set(LIGHT_GREEN,LIGHT_ON); //灯“亮”
printf(" LIGHT_GREEN:ON--\n\n"); //串口输出灯的状态
}
else if (mFlag=='B') // 蓝色
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='Y'; //灯的状态标志
gpio_set(LIGHT_GREEN,LIGHT_OFF); //灯“暗”
gpio_set(LIGHT_BLUE,LIGHT_ON); //灯“亮”
printf(" LIGHT_BLUE:ON--\n\n"); //串口输出灯的状态
}
else if (mFlag=='Y') // 黄色(红绿)
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='P'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_OFF);
gpio_set(LIGHT_RED,LIGHT_ON);
gpio_set(LIGHT_GREEN,LIGHT_ON);
printf(" LIGHT_YELLOW:ON--\n\n"); //串口输出灯的状态
}
else if (mFlag=='P') // 紫色(红蓝)
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='C'; //灯的状态标志
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_RED,LIGHT_ON);
gpio_set(LIGHT_BLUE,LIGHT_ON);
printf(" LIGHT_PURPLE:ON--\n\n"); //串口输出灯的状态
}
else if (mFlag=='C') // 青色(蓝绿)
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='W'; //灯的状态标志
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_ON);
gpio_set(LIGHT_GREEN,LIGHT_ON);
printf(" LIGHT_CYAN:ON--\n\n"); //串口输出灯的状态
}
else if (mFlag=='W') // 白色(红绿蓝)
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='D'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_ON);
gpio_set(LIGHT_GREEN,LIGHT_ON);
gpio_set(LIGHT_RED,LIGHT_ON);
printf(" LIGHT_WHITE:ON--\n\n"); //串口输出灯的状态
}
else if (mFlag=='D') // 暗色
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='R'; //灯的状态标志
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
gpio_set(LIGHT_RED,LIGHT_OFF);
printf(" DARK:ON--\n\n"); //串口输出灯的状态
}
} //for(;;)结尾