zoukankan      html  css  js  c++  java
  • 单片机外部中断0下降沿触发控制键盘扫描实验的项目工程

    /***外部中断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;
        }
       }
     }

  • 相关阅读:
    在HTML中使用css3实现雪人动画效果
    不一样的函数防抖和节流
    2020全球C++及系统软件技术大会成功落下帷幕
    详解flex布局做骰子案例
    LeetCode-环形链表|+环形链表||
    03:成绩排序
    02:奇数单增序列
    谁考了第k名
    【23.59%】【hdu 5883】The Best Path
    【30.53%】【hdu 5878】I Count Two Three
  • 原文地址:https://www.cnblogs.com/AChenWeiqiangA/p/12444434.html
Copyright © 2011-2022 走看看