#include "STC8H.h" #include "intrins.h" code unsigned char m[]={0x10,0x08,0x04,0x02,0x01}; code unsigned char n[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB}; unsigned char j=0,k=0,i=0,l=0; sbit P2_5=P2^5; sbit P2_6=P2^6; sbit P2_7=P2^7; sbit P0_0=P0^0; char direction = 0; // 流水灯方向,0表示向右,1表示向左 char auto_mode = 0; // 自动模式,0表示手动模式,1表示自动模式 void delay() { char i,j; for(i=0;i<10;i++) for(j=0;j<50;j++); } void main() { P0M1 = 0x0E; P0M0 = 0x01; // 将P0_0设置为输入模式 P1M1 = 0x00; P1M0 = 0xFC; P2M0 = 0X1F; P2M1 = 0X00; P3M1 = 0xFC; P3M0 = 0x00; P2 = 0Xe0; while(1) { // 等待按键按下 while(P0_0 == 1); delay(); // 延时一段时间以消除抖动 if(P0_0 == 0) { // 再次检测确认按键按下 while(P0_0 == 0); // 等待按键松开 auto_mode = !auto_mode; // 切换自动模式 if(auto_mode) { // 如果进入自动模式,则初始化流水灯方向、计数器等 direction = 0; k = 0; i = 0; l = 0; } } if(auto_mode || direction == 0) { // 如果是自动模式或向右流动 P2 = m[k]; k++; if(k > 4) { k = 0; P2_5 = 0; P2_6 = 1; } } else { // 向左流动 P2 = m[4-k]; k++; if(k > 4) { k = 0; P2_5 = 1; P2_6 = 0; } } P1 = n[i]; i++; if(i > 5) { i = 0; P1 = 0XFF; P3 = n[l]; l++; if(l > 5) { l = 0; P3 = 0XFF; } } // 等待按键松开 while(P0_0 == 0); delay(); // 延时一段时间以消除抖动 } }修改此程序实现按键按下一次五盏流水灯就开始自动流水
时间: 2023-12-31 15:04:15 浏览: 131
好的,根据您的要求,我修改了程序,实现按键按下一次五盏流水灯就开始自动流水。
```
#include "STC8H.h"
#include "intrins.h"
code unsigned char m[]={0x10,0x08,0x04,0x02,0x01};
code unsigned char n[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};
unsigned char j=0,k=0,i=0,l=0;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P0_0=P0^0;
char direction = 0; // 流水灯方向,0表示向右,1表示向左
char auto_mode = 0; // 自动模式,0表示手动模式,1表示自动模式
void delay() {
char i,j;
for(i=0;i<10;i++)
for(j=0;j<50;j++);
}
void main() {
P0M1 = 0x0E;
P0M0 = 0x01; // 将P0_0设置为输入模式
P1M1 = 0x00;
P1M0 = 0xFC;
P2M0 = 0X1F;
P2M1 = 0X00;
P3M1 = 0xFC;
P3M0 = 0x00;
P2 = 0Xe0; // 初始化流水灯状态
while(1) {
// 等待按键按下
while(P0_0 == 1);
delay(); // 延时一段时间以消除抖动
if(P0_0 == 0) { // 再次检测确认按键按下
while(P0_0 == 0); // 等待按键松开
auto_mode = !auto_mode; // 切换自动模式
if(auto_mode) { // 如果进入自动模式,则初始化流水灯方向、计数器等
direction = 0;
k = 0;
i = 0;
l = 0;
P2_5 = 0; // 将流水灯方向设置为向右
} else { // 如果是手动模式,则将流水灯关闭
P2 = 0xe0;
}
}
if(auto_mode || direction == 0) { // 如果是自动模式或向右流动
P2 = m[k];
k++;
if(k > 4) {
k = 0;
P2_5 = 0;
P2_6 = 1; // 向右流动时,将P2_5设置为低电平,P2_6设置为高电平,反之亦然
}
} else { // 向左流动
P2 = m[4-k];
k++;
if(k > 4) {
k = 0;
P2_5 = 1;
P2_6 = 0; // 向左流动时,将P2_5设置为高电平,P2_6设置为低电平,反之亦然
}
}
P1 = n[i];
i++;
if(i > 5) {
i = 0;
P1 = 0XFF;
P3 = n[l];
l++;
if(l > 5) {
l = 0;
P3 = 0XFF;
}
}
// 等待按键松开
while(P0_0 == 0);
delay(); // 延时一段时间以消除抖动
}
}
```
修改后的程序中,在按键按下后,如果是手动模式,则将流水灯关闭;如果是自动模式,则将流水灯方向设置为向右,并初始化计数器等变量。同时,在每次循环中,如果是自动模式或向右流动,则将流水灯向右流动,否则将流水灯向左流动。
阅读全文