有没有哪位朋友知道怎样写,用独立按键手动切换LED花样,独立按键是P3.7,谢谢大家了,题目如下
#include <REGX51.H>
#define Led P2
unsigned int time=0; //延时时长变量
sbit key=P3^7;
void InitTimer0(void) //10ms
{
TMOD = 0x01; //定时器模式1
//赋值
TH0 = 0xDC;
TL0 = 0x00;
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
}
void delay(unsigned int ms_10) //延时函数
{
if(key==0)
{
time=0;
}
time=ms_10; //给time赋予具体延时时间的数值
TR0 = 1; //打开定时器0
while(time); //等待延时结束
TR0 = 0; //关闭定时器0
}
void light_water() //流水灯函数
{
int i=0,Led_H=0,Led_L=0,temp=0x06,num=0; //Led_H存储P2高8位Led_L存储P2低8位
Led=0x01;
delay(50);//100ms
for(i=0;i < 7;i++) //单个左移
{
Led=Led<<1; //P2数值左移
delay(50);//100ms
}
for(i=0;i < 7;i++) //单个右移
{
Led=Led>>1; //P2数值右移
delay(50);//100ms
}
for(i=0;i < 7;i++) //依次向左点亮
{
Led=Led<<1|0x01; //P2数值左移并将最低位置为1
delay(50);//100ms
}
for(i=0;i < 7;i++) //依次向右点亮
{
Led=Led>>1; //P2数值右移,依次将位1清零
delay(50);//100ms
}
Led=0x00;
for(i=0;i < 7;i++) //两端向内依次点亮
{
Led_L=Led<<1|0x01&0x0f; //取出P2的低4位,并将其左移最低位置1
Led_H=((Led&0xf0)>>1)^0x80; //取出P2的高4位,并将其右移最高位置1
Led=Led|Led_L; //将低4位赋予P2
Led=Led|Led_H; //将高4位赋予P2
delay(50);//100ms
}
for(i=0;i < 7;i++) //由内向两端依次点亮
{
Led_L=(Led&0x0f)>>1; //取P2低4位并右移
Led_H=(Led&0xf0)<<1; //取P2高4位并左移
Led=Led&Led_L; //将低4位赋予P2
Led=Led^Led_H; //将高4位赋予P2
delay(50);//100ms
}
Led=0x00;
for(i=0;i < 10;i++) //依次向左点亮2个灯
{
num=Led<<1|0x01; //P2数值左移并最低位置1
if(num>=0x06) //第2、3个灯亮后,以2个灯为主体向左移动
{
Led=num&temp;
temp=temp<<1;
}
else
Led=num;
delay(50);//100ms
}
Led=0x00;
temp=0xc0;
for(i=0;i < 10;i++) //依次向右点亮2个灯
{
num=Led>>1|0x80; //将P2数值右移并最高位置1
if(num>=temp) //第6、7个灯亮时以两个灯为整体向右移动
{
Led=num&temp;
temp=temp>>1;
}
else
Led=num;
delay(50);//100ms
}
}
void main(void)
{
InitTimer0(); //定时器初始化
while(1)
{
light_water();
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xDC;
TL0 = 0x00;
time--;
if(time < 0)
{
time = 0; //time为0时不在减
}
}
主程序里检测按键输入,根据按键输入设置显示模式,把模式的值存入一个全局变量。
在定时器中断里,根据当前的时刻和模式,计算出每个LED的状态,并输出。
【以下回答由 GPT 生成】
#include <REGX51.H>
#define Led P2
unsigned int time=0; //延时时长变量
sbit key=P3^7;
void InitTimer0(void) //10ms
{
TMOD = 0x01; //定时器模式1
//赋值
TH0 = 0xDC;
TL0 = 0x00;
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
}
void delay(unsigned int ms_10) //延时函数
{
if(key==0)
{
time=0;
}
time=ms_10; //给time赋予具体延时时间的数值
TR0 = 1; //打开定时器0
while(time); //等待延时结束
TR0 = 0; //关闭定时器0
}
void light_water() //流水灯函数
{
int i=0,Led_H=0,Led_L=0,temp=0x06,num=0; //Led_H存储P2高8位Led_L存储P2低8位
Led=0x01;
delay(50);//100ms
for(i=0;i < 7;i++) //单个左移
{
Led=Led<<1; //P2数值左移
delay(50);//100ms
}
for(i=0;i < 7;i++) //单个右移
{
Led=Led>>1; //P2数值右移
delay(50);//100ms
}
for(i=0;i < 7;i++) //依次向左点亮
{
Led=Led<<1|0x01; //P2数值左移并将最低位置为1
delay(50);//100ms
}
for(i=0;i < 7;i++) //依次向右点亮
{
Led=Led>>1|0x80; //P2数值右移并将最高位置为1
delay(50);//100ms
}
for(i=0;i<100;i++) //快速闪烁
{
Led = 0xff;
delay(5);//100ms
Led = 0x00;
delay(5);//100ms
}
}
void main()
{
InitTimer0(); //初始化定时器
while(1)
{
if(key == 0) //检测按键是否被按下
{
delay(1); //延时去抖
if(key == 0) //再次检测按键是否被按下
{
light_water(); //调用流水灯函数
}
}
}
}
【相关推荐】