新增三个协程应用例程!
例程3:矩阵按键非堵塞消抖实验
例程2:蜂鸣器声音变调实验
例程1:简易交通灯实验
10a 驱动数码管做简单交通信号灯.zip
(251.02 KB, 下载次数: 23)
例程2:蜂鸣器声音变调实验
10b 驱动蜂鸣器做变调歌曲.zip
(242.52 KB, 下载次数: 28)
例程3:矩阵按键非堵塞消抖实验
10c 使用多线程完成按键消抖和显示.zip
(250.29 KB, 下载次数: 31)
以下是核心源代码;
例程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结束,循环执行
- }
复制代码
|