keil51,按下开关k1,让8只LED灯加一显示;按下开关K2让8只LED减一显示?
没有具体的电路图,就只以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;
}
}
}
}
}