| 新增三个协程应用例程! 例程3:矩阵按键非堵塞消抖实验
 例程2:蜂鸣器声音变调实验
 例程1:简易交通灯实验
 
 
  10a 驱动数码管做简单交通信号灯.zip
(251.02 KB, 下载次数: 165) 例程2:蜂鸣器声音变调实验
 
 
  10b 驱动蜂鸣器做变调歌曲.zip
(242.52 KB, 下载次数: 155) 例程3:矩阵按键非堵塞消抖实验
 
 
  10c 使用多线程完成按键消抖和显示.zip
(250.29 KB, 下载次数: 160) 
 
 以下是核心源代码;
 例程1:简易交通灯实验
 
 复制代码while(1)
{
        task_start(0);//线程0,用于刷新显示
        task_for(seg_num = 0, seg_num++)
        {
                _show_buff[0] = seg_data[show_buff[seg_num]];//段码刷新,1有效
                _show_buff[1] = ~(1<<seg_num);//位选,0有效
                task_delay(1);//延时一下,防止刷新过快太暗淡
                spi_printf(SPI0, Buff_Mode, _show_buff, 2);
                task_wait(!get_spi_state(SPI0));//等待SPI传输完成
                RCK = 1;RCK = 0;//触发刷新
        }
        task_break(seg_num < 8);
        task_end(1);//线程0结束,循环执行
        task_start(1);//用于控制红路灯1
        //红绿灯1:10s红灯,7s绿灯,3s黄灯
        YELLOW1 = 1;RED1 = 0;//关闭黄灯,打开红灯
        task_for(traffic_lights1 = 10, traffic_lights1--)
        {
                show_buff[0] = (traffic_lights1/10)==0?17:traffic_lights1/10;//遇0消隐
                show_buff[1] = traffic_lights1%10;
                task_delay(1000);
        }
        task_break(traffic_lights1>0);
        RED1 = 1;GREEN1 = 0;//关闭红灯,打开绿灯
        task_for(traffic_lights1 = 7, traffic_lights1--)
        {
                show_buff[0] = (traffic_lights1/10)==0?17:traffic_lights1/10;//遇0消隐
                show_buff[1] = traffic_lights1%10;
                task_delay(1000);
        }
        task_break(traffic_lights1>0);
        GREEN1 = 1;YELLOW1 = 0;//关闭绿灯,打开黄灯
        task_for(traffic_lights1 = 3, traffic_lights1--)
        {
                show_buff[0] = (traffic_lights1/10)==0?17:traffic_lights1/10;//遇0消隐
                show_buff[1] = traffic_lights1%10;
                task_delay(500);
                YELLOW1 = 1;
                task_delay(500);
                YELLOW1 = 0;//闪烁黄灯
        }
        task_break(traffic_lights1>0);
        task_end(1);//线程1结束,循环执行
        task_start(2);//用于控制红路灯2
        //红绿灯2:7s绿灯,3s黄灯,10s红灯
        RED2 = 1;GREEN2 = 0;// 关闭红灯,打开绿灯
        task_for(traffic_lights2 = 7, traffic_lights2--)
        {
                show_buff[6] = (traffic_lights2/10)==0?17:traffic_lights2/10;//遇0消隐
                show_buff[7] = traffic_lights2%10;
                task_delay(1000);
        }
        task_break(traffic_lights2>0);
        GREEN2 = 1;YELLOW2 = 0;// 关闭绿灯,打开黄灯
        task_for(traffic_lights2 = 3, traffic_lights2--)
        {
                show_buff[6] = (traffic_lights2/10)==0?17:traffic_lights2/10;//遇0消隐
                show_buff[7] = traffic_lights2%10;
                task_delay(500);
                YELLOW2 = 1;
                task_delay(500);
                YELLOW2 = 0;//闪烁黄灯
        }
        task_break(traffic_lights2>0);
        YELLOW2 = 1;RED2 = 0;// 关闭黄灯,打开红灯
        task_for(traffic_lights2 = 10, traffic_lights2--)
        {
                show_buff[6] = (traffic_lights2/10)==0?17:traffic_lights2/10;//遇0消隐
                show_buff[7] = traffic_lights2%10;
                task_delay(1000);
        }
        task_break(traffic_lights2>0);
        task_end(1);//线程1结束,循环执行
}
 
 例程2:蜂鸣器声音变调实验
 
 复制代码while(1)
{
        task_start(0);//线程0开始,蜂鸣器鸣叫
        Beep = ~Beep;
        task_delay(x_delay);
        task_end(1);//线程0结束,循环执行
        task_start(1);//线程1开始,控制蜂鸣器变调
        task_for(x_delay = 0, x_delay++)
        {
                task_delay(1000);//缓慢上升100us*1000=100ms
        }
        task_break(x_delay < 20);
        task_for(x_delay = 20, x_delay--)
        {
                task_delay(300);//迅速下降100us*300=30ms
        }
        task_break(x_delay > 0);
        task_end(1);//线程1结束,循环执行
}
 
 例程3:矩阵按键非堵塞消抖实验
 
 复制代码while(1)
{
        task_start(0);//线程0,用于刷新显示
        task_for(seg_num = 0, seg_num++)
        {
                _show_buff[0] = seg_data[show_buff[seg_num]];//段码刷新,1有效
                _show_buff[1] = ~(1<<seg_num);//位选,0有效
                task_delay(1);//延时一下,防止刷新过快太暗淡
                spi_printf(SPI0, Buff_Mode, _show_buff, 2);
                task_wait(!get_spi_state(SPI0));//等待SPI传输完成
                RCK = 1;RCK = 0;//触发刷新
        }
        task_break(seg_num < 8);
        task_end(1);//线程0结束,循环执行
        
        task_start(1);//线程1,用于扫描按键
        P06 = 0;P07 = 1;//先扫描0~3按键
        task_delay(1);//等待电平稳定
        if((P0&0x0f) != 0x0f)//判断有按键按下
        {
                task_delay(2);//延时2ms,按键消抖
                if((P0&0x0f) != 0x0f)//判断有按键按下
                {
                        key_scanf = P0&0x0f;//记录按键值
                }
        }
        P06 = 1;P07 = 0;//再扫描4~7按键
        task_delay(1);//等待电平稳定
        if((P0&0x0f) != 0x0f)//判断有按键按下
        {
                task_delay(2);//延时2ms,按键消抖
                if((P0&0x0f) != 0x0f)//判断有按键按下
                {
                        key_scanf = P0&0x0f|0x10;//记录按键值,添加标记
                }
        }
        task_end(1);//线程1结束,循环执行
        task_start(2);//线程2,用于显示键值
        show_buff[6] = key_scanf/16;//显示键值
        show_buff[7] = key_scanf%16;//显示键值
        task_delay(100);//延时100ms刷新一次
        task_end(1);//线程2结束,循环执行
}
 
 
 
 |