/***定时器1每1ms扫描一次键盘,按下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=P3^4;//将S1位定义为P3.4引脚 sbit S2=P3^5;//将S2位定义为P3.5引脚 sbit S3=P3^6;//将S3位定义为P3.6引脚 sbit S4=P3^7;//将S4位定义为P3.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(); } /************************************************* 函数功能:主函数 **************************************************/ void main(void)//主函数 { TMOD=0x10;//使用定时器T1的模式1 EA=1;//开总中断 ET1=1;//定时器T1中断允许 TR1=1;//启动定时器T1 TH1=(65536-1000)/256;//定时器T1赋初值,定时1ms。 TL1=(65536-1000)%256;//定时器T1赋初值 keyvalue=0;//按键值初始化为0,什么也不做。 while(1) { switch(keyvalue) { case 1: forward(); break; case 2: backward(); break; case 3: stop(); break; case 4: flash(); break; } } } /************************************************* 函数功能:定时器T1的中断服务子程序 **************************************************/ void Time1_serve(void) interrupt 3 using 0 { P3=0Xf0; TR1=0; if((P3&0xf0)!=0xf0)//判断是否有按键按下 { delay20ms();//延时20ms再去检测 if((P3&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; } } TH1=(65536-1000)/256; TL1=(65536-1000)%256; TR1=1; }