第六章作业2

1、用构件调用方式实现

(1)先初始化三种颜色的灯

     gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_OFF); //初始化绿灯

     gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF);   //初始化红灯

     gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_OFF);  //初始化蓝灯

(2)添加实现代码

ch = uart_re1(UART_User,&flag);

// 若接收到字符flag为1,未接收到则为0

if(flag){

    // 收到字符时的处理

    if(ch == 'G'){

        gpio_set(LIGHT_GREEN,LIGHT_ON);   // 亮绿灯

        gpio_set(LIGHT_RED,LIGHT_OFF);    // 关闭红灯

        gpio_set(LIGHT_BLUE,LIGHT_OFF);   // 关闭蓝灯

    } else if(ch == 'R'){

        gpio_set(LIGHT_RED,LIGHT_ON);     // 亮红灯

        gpio_set(LIGHT_GREEN,LIGHT_OFF);  // 关闭绿灯

        gpio_set(LIGHT_BLUE,LIGHT_OFF);   // 关闭蓝灯

    } else if(ch == 'B'){

        gpio_set(LIGHT_BLUE,LIGHT_ON);    // 亮蓝灯

        gpio_set(LIGHT_RED,LIGHT_OFF);    // 关闭红灯

        gpio_set(LIGHT_GREEN,LIGHT_OFF);  // 关闭绿灯

    } else {

        // 默认情况下关闭所有LED灯

        gpio_set(LIGHT_RED,LIGHT_OFF);    // 关闭红灯

        gpio_set(LIGHT_GREEN,LIGHT_OFF);  // 关闭绿灯

        gpio_set(LIGHT_BLUE,LIGHT_OFF);   // 关闭蓝灯

    }

    printf("%c\n",ch+1); // 显示下一个字符

}

当输入R时,亮红灯;

当输入B时,亮蓝灯

当输入G时,亮绿灯;

其余情况,灯不亮

2、UART部分用直接地址方式实现(即不调用uart.c中的函数,其他部分如GPIO、中断设置可调用函数)

uint8_t receivedChar;  // 定义接收到的字符变量

// (1.5)用户外设模块初始化

gpio_init(LIGHT_BLUE, GPIO_OUTPUT, LIGHT_OFF);  // 初始化蓝灯为关闭状态

gpio_init(LIGHT_RED, GPIO_OUTPUT, LIGHT_OFF);   // 初始化红灯为关闭状态

gpio_init(LIGHT_GREEN, GPIO_OUTPUT, LIGHT_OFF); // 初始化绿灯为关闭状态

for (;;) {

    // 检查接收缓冲区是否不满,如果不满,则尝试接收字符

    if (*uart_isr & (0x1UL << 5U)) {

        // 读取接收到的字符,并将其强制转换为 char 类型

        receivedChar = (char)(*uart_tdr & 0xFF);

       

        // 等待发送缓冲区变为空闲状态

        for (volatile uint32_t j = 0; j <= 30000; j++) {

            if (*uart_isr & (0x1UL << 7UL)) {

                // 发送缓冲区为空,发送接收到的字符加1

                *uart_tdr = receivedChar + 1;

                break;

            }

        }

       

        // 根据接收到的字符点亮相应的LED灯

        if (receivedChar == 'B') {

            // 如果接收到 'B',则点亮蓝灯,关闭其他灯

            gpio_set(LIGHT_BLUE, LIGHT_ON);

            gpio_set(LIGHT_RED, LIGHT_OFF);

            gpio_set(LIGHT_GREEN, LIGHT_OFF);

        } else if (receivedChar == 'R') {

            // 如果接收到 'R',则点亮红灯,关闭其他灯

            gpio_set(LIGHT_RED, LIGHT_ON);

            gpio_set(LIGHT_GREEN, LIGHT_OFF);

            gpio_set(LIGHT_BLUE, LIGHT_OFF);

        } else if (receivedChar == 'G') {

            // 如果接收到 'G',则点亮绿灯,关闭其他灯

            gpio_set(LIGHT_GREEN, LIGHT_ON);

            gpio_set(LIGHT_RED, LIGHT_OFF);

            gpio_set(LIGHT_BLUE, LIGHT_OFF);

        } else {

            // 如果接收到其他字符,则关闭所有灯

            gpio_set(LIGHT_RED, LIGHT_OFF);

            gpio_set(LIGHT_GREEN, LIGHT_OFF);

            gpio_set(LIGHT_BLUE, LIGHT_OFF);

        }

    }

}

可以看到和第一种实现方式一样,

输入’R’,‘G’,‘B’,对应颜色灯亮。

输出其他字符时,不亮灯

4babcdbe6f9f7

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值