单片机定时器1工作模式1中断控制键盘扫描实验的项目工程

/***定时器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;
}

posted @ 2020-03-08 19:44  吃不了就兜着走  阅读(661)  评论(0编辑  收藏  举报