这个程序怎么修改才能实现,初始状态或按下KEY1键(松开后保持),只点亮一只LED灯,每隔1秒(定时)右循环显示(中断),移到LED8后回到LED1。按下KEY2键…按下KEY3…
#include
#include
#define LED P1
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;//定义按钮引脚
sbit BEEP=P0^0;//定义蜂鸣器引脚
sbit P0_1=P0^1;
void BEEP_0();//蜂鸣器响函数
unsigned char i=0;
unsigned int j=0;
unsigned int k;
unsigned char Lamp_1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char Lamp_2[]={0xfa,0xf5,0xeb,0xd7,0xaf,0x5f};
unsigned char Lamp_3[]={0xfe,0xf9,0xe3,0x0f,0x7f,0x9f,0xc7,0xf0};
void time0() interrupt 1
{
j++;
if(j==5000)
{
P0_1=~P0_1;
if(K==0)
{ while(KEY1==0);
LED=Lamp_1[i];
i++;
if(i<8)
i=0;
}
if(K==1)
{
while(KEY2==0);
LED=Lamp_2[i];
i++;
if(i<8)
i=0;
}
if(K==2)
{
while(KEY3==0);
LED=Lamp_3[i];
i++;
if(i<8)
i=0;
}
j=0;
}
}
void main()
{
TMOD=0x21; //定时器0在模式2下工作
TL0=0x38; //定时器每200us产生一次溢出
TH0=0x38; //自动重装的值
ET0=1; //使能定时器0中断
EA=1; //使能总中断
TR0=1; //开始计时
while(1)
{
if(KEY1==0)
K=0;
if(KEY2==0)
K=1;
if(KEY3==0)
K=2;
}
}
修改后的代码,你试试,看看可不可以解决你的问题。
#include <reg51.h>
#include <stdio.h>
#define LED P1
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;//定义按钮引脚
sbit BEEP=P0^0;//定义蜂鸣器引脚
sbit P0_1=P0^1;
void BEEP_0();//蜂鸣器响函数
unsigned char i=0;
unsigned int j=0;
unsigned int k;
unsigned char ledState = 0x7E;
unsigned char Lamp_1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void time0() interrupt 1
{
j++;
if(j==1000) // 修改为每隔1秒
{
P0_1=~P0_1;
if(K==0)
{
LED = ledState;
ledState = (ledState << 1) | ((ledState >> 7) & 0x01);
ledState |= 0x7F; // 确保只有一个 LED 点亮
}
if(K==1)
{
// ...
}
if(K==2)
{
// ...
}
j=0;
}
}
void main()
{
TMOD=0x21; //定时器0在模式2下工作
TL0=0x38; //定时器每200us产生一次溢出
TH0=0x38; //自动重装的值
ET0=1; //使能定时器0中断
EA=1; //使能总中断
TR0=1; //开始计时
while(1)
{
if(KEY1==0)
{
while(KEY1==0);
K=0;
}
if(KEY2==0)
{
while(KEY2==0);
K=1;
}
if(KEY3==0)
{
while(KEY3==0);
K=2;
}
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:抱歉,没有具体的问题我无法提供任何解决方案。请提供具体的问题。