要求:利用P0口的低三位组成独立键盘,编写程序读取键盘的输入状态:
利用P1口控制共阳极的八只LED灯,
当1键按下后,LED进行自上而下流水闪烁,
当2键按下后,LED进行自下而上流水闪烁,当3键按下后,LED进行闪烁发光
进行流水灯操作是要求一次流水3秒钟,进行循环5次后,LED全部熄灭:
进行内烁操作是要求闪烁频率为2Hz,闪5次后修止闪烁,LED全部点亮:
以上操作进行过程中,健盘按下后,可随时切换LED发光模式
如图接线:
程序:`
#include<reg51.h>
sbit key0 = P0^0;
sbit key1 = P0^1;
sbit key2 = P0^2;
void delay()
{
unsigned char i,j,k;
for(i=15;i>0;i–)
{
for(j=124;j>0;j–)
{
for(k=200;j>0;j–);
}
}
}
void delayh()
{//同上,0.5s
int d,f,t;
for(d=191;d>0;d–)
{
for(f=125;f>0;f–)
{
for(t=125;t>0;t–);
}
}
}
unsigned char keyscan()
{
unsigned char keyscan_num, temp;
P0 = 0xff ;
temp = P0;
if(~(temp&0xff))
{
if(key0 == 0)
{
keyscan_num = 0;
}
else if(key1 == 0)
{
keyscan_num = 1;
}
else if(key2 == 0)
{
keyscan_num = 2;
}
return keyscan_num;
}
}
void main()
{
unsigned char key_num;
unsigned char a=0,b=0,c=0;
while(1)
{
key_num = keyscan();
switch(key_num)
{
case 0 :goto function0;
case 1 :goto function1;
case 2 :goto function2;
default :
break;
}
//由上往下
function0:
P1 = 0x7f;
delay();
P1 = 0xbf;
delay();
P1 = 0xdf;
delay();
P1 = 0xef;
delay();
P1 = 0xf7;
delay();
P1 = 0xfb;
delay();
P1 = 0xfd;
delay();
P1 = 0xfe;
delay();
a++;
if(a<=5)
{
key_num = keyscan();
switch(key_num)
{
case 0 : goto function0;
case 1 : goto function1;
case 2 : goto function2;
default : goto function0;
break;
}
}
else {break;}
//由下往上
function1 :
P1 = 0xfe;
delay();
P1 = 0xfd;
delay();
P1 = 0xfb;
delay();
P1 = 0xf7;
delay();
P1 = 0xef;
delay();
P1 = 0xdf;
delay();
P1 = 0xbf;
delay();
P1= 0x7f;
delay();
b++;
if(b<=5)
{
key_num = keyscan();
switch(key_num)
{
case 0 : goto function0;
case 1 : goto function1;
case 2 : goto function2;
default : goto function1;
break;
}
}
else {break;}
function2:
P1 = 0x00;
delayh();
c++;
if(c<=5)
{
key_num = keyscan();
switch(key_num)
{
case 0 : goto function0;
case 1 : goto function1;
case 2 : goto function2;
default : goto function2;
break;
}
}
else {P1 = 0x00;}
}
}
`
问题描述:进行仿真的时候最后一个灯直接亮了……