/***外部中断0扫描键盘,按下S1键时,P2口的8位LED正向流水点亮;按下S2键时,P2口的
8位LED反向流水点亮;按下S3键时,P2口的8位LED熄灭;按下S4键时,P2口的8位LED闪烁。***/
#include<reg52.h>//包含51单片机寄存器定义的头文件
#define uchar unsigned char
#define uint int
sbit S1=P1^4;//将S1位定义为P1.4引脚
sbit S2=P1^5;//将S2位定义为P1.5引脚
sbit S3=P1^6;//将S3位定义为P1.6引脚
sbit S4=P1^7;//将S4位定义为P1.7引脚
uchar keyvalue;//储存按键值
uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/*************************************************
函数功能:流水灯延时
**************************************************/
void led_delay(void)
{
uchar i,j;
for(i=0;i<200;i++)
for(j=0;j<200;j++);
}
/*************************************************
函数功能:软件消抖延时
**************************************************/
void delay20ms(void)
{
uchar i,j;
for(i=0;i<100;i++)
for(j=0;j<100;j++);
}
/*************************************************
函数功能:正向流水点亮LED
**************************************************/
void forward(void)
{
// P2=0xfe; //第一个灯亮
// led_delay();
// P2=0xfd; //第二个灯亮
// led_delay();
// P2=0xfb; //第三个灯亮
// led_delay();
// P2=0xf7; //第四个灯亮
// led_delay();
// P2=0xef; //第五个灯亮
// led_delay();
// P2=0xdf; //第六个灯亮
// led_delay();
// P2=0xbf; //第七个灯亮
// led_delay();
// P2=0x7f; //第八个灯亮
// led_delay();
// P2=0xff;
// P2=0xfe; //第一个灯亮
// led_delay();
uint i;
for(i=0;i<8;i++)
{
P2=table[i];
led_delay();
}
}
/*************************************************
函数功能:反向流水点亮LED
**************************************************/
void backward(void)
{
// P2=0x7f; //第八个灯亮
// led_delay();
// P2=0xbf; //第七个灯亮
// led_delay();
// P2=0xdf; //第六个灯亮
// led_delay();
// P2=0xef; //第五个灯亮
// led_delay();
// P2=0xf7; //第四个灯亮
// led_delay();
// P2=0xfb; //第三个灯亮
// led_delay();
// P2=0xfd; //第二个灯亮
// led_delay();
// P2=0xfe; //第一个灯亮
// led_delay();
uint i;
for(i=7;i>=0;i--)
{
P2=table[i];
led_delay();
}
}
/*************************************************
函数功能:关闭所有LED
**************************************************/
void stop(void)
{
P2=0xff;//关闭8个LED
}
/*************************************************
函数功能:闪烁点亮LED
**************************************************/
void flash(void)
{
P2=0xff;//关闭8个LED
led_delay();
P2=0x00;//点亮8个LED
led_delay();
}
/*************************************************
函数功能:外部中断0的中断初始化程序
**************************************************/
void outside0_init()//外部中断0初始化
{
EA=1; //开总中断
EX0=1; //打开外部中断0
IT0=1; //设置为下降沿触发
}
/*************************************************
函数功能:外部中断0的中断服务子程序
**************************************************/
void outside0_serve(void) interrupt 0
{
P1=0Xf0;
EX0=0;
if((P1&0xf0)!=0xf0)//判断是否有按键按下
{
delay20ms();//延时20ms再去检测
if((P1&0xf0)!=0xf0)//再判断是否有按键按下
{
if(S1==0)//按键S1被按下
keyvalue=1;
if(S2==0)//按键S2被按下
keyvalue=2;
if(S3==0)//按键S3被按下
keyvalue=3;
if(S4==0)//按键S4被按下
keyvalue=4;
}
}
EX0=1;
}
/*************************************************
函数功能:主函数
**************************************************/
void main(void)//主函数
{
outside0_init();//外部中断0初始化
keyvalue=0;//按键值初始化为0
while(1)
{
switch(keyvalue)
{
case 1:
forward();
break;
case 2:
backward();
break;
case 3:
stop();
break;
case 4:
flash();
break;
}
}
}