#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表示向左 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); // 等待按键松开 direction = 0; // 设置初始方向为向右 k = 0; i = 0; l = 0; } if(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(); // 延时一段时间以消除抖动 if(P0_0 == 1) { // 再次检测确认按键松开 direction = !direction; // 切换流水灯方向 } } }修改此程序实现按键按下一次流水灯就开始自动循环流水
时间: 2023-12-31 12:04:07 浏览: 97
好的,可以将程序修改如下:
```
#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(); // 延时一段时间以消除抖动
}
}
```
在原有的程序的基础上,增加了一个自动模式的判断。当按键按下时,将自动模式的标志位取反,如果进入自动模式,则初始化流水灯方向、计数器等。在流水灯的控制中,如果处于自动模式或者向右流动的状态,则执行流水灯向右流动的操作,否则执行向左流动的操作。最后,增加了一个无限循环,以保证程序一直运行。
阅读全文