- /***定时器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;
- }
复制代码
|