keil51,按下开关k1,让8只LED灯加一显示;按下开关K2让8只LED减一显示?

供稿:hz-xin.com     日期:2025-01-14
单片机上电后8个led灯闪烁,按下k1一个灯从左右移动,按下k2两个灯左右移动,

没有具体的电路图,就只以P1口作为基本输驱动口进行说明。主程序需要一个delay函数进行led亮灭的延时。当然你首先要先进行P1口和开关按键的预定义,这个要看你板子的原理图。
void delay(int l)

{

int
a,b;

for(a=0;a<l;a++)

{

for(b=0;b<10000;b++);

}
}
void main()

{
int m=0;

//设置开关为P3.7和P3.8,低有效
while(1)
{
if(P3.7 ==0)

{
m = 0;
}
else if(P3.8 ==0)

{
m = 1;

}
if (m == 0)
{
P1.0=1;
delay(10);
P1.0=0;
delay(10);
P1.1=1;

...//以此类推到P1.7

}
else if(m ==1)

{
P1.0=1;

P1.1=1;

delay(10);

P1.0=0;

P1.1=0;

delay(10);

P1.2 =1;

P1.3 =1;

delay(10);

...//同理以此类推即可

}
}
}

中断处理函数感觉有些问题,for循环之前使用P1=0x0f;然后将for内的P1=0x0f;改为 P1= ~ P1; 同时for 循环中应该需要调用延时函数 Delay(10); 这里的值看你自己设置,保证能分辨闪烁即可

我也是刚自学单片机,今天看到你写的要求,我自己写的程序,调试OK了。

你可以自己对照到你的原理图,把单片机的引脚改一下。

#include <reg52.h>

#include <intrins.h>

#define uint unsigned int


sbit key_s2 = P3^0;//独立按键S2

sbit key_s3 = P3^1;//独立按键S3


void delay(uint z)   //延时函数

{

   uint x,y;

   for(x=z; x>0;x--)

     for(y=114;y>0;y--);

}

   

void main()

{

uint temp,tempa,num=0;

temp = 0xff; //赋初值 1111 1111 LED熄灭

tempa = 0x80;     // 赋初值 1000 0000

P1 = temp; //LED熄灭


while(1)

{

if(key_s2 == 0)        //判断S2是否被按下

    {

delay(20);

if(key_s2 == 0)     

{

num++;  

while(!key_s2); //松手检测

    if(num < 9 || num!=0 )

{

temp = temp << 1;  // 初值 1111 1110  向左移1位

    P1 = temp;

}

else

{

num = 9;

temp = 0x00;

P1 = temp;

}

}

  }

  if(key_s3 == 0)          //判断S3是否被按下

    {

delay(20);

if(key_s3 == 0)     

{

    num--;  

while(!key_s3); //松手检测    

    if(num > 0 || num!=9)

{

P1 = temp;

temp = temp>>1;    // tempa右移1位 

temp  = temp|tempa;   // temp和tempa按位 或 

P1 = temp;

}

else

    {

num = 0;

temp = 0xff;

P1 = temp;

}

}

}

}

}