(四)开关控制的 跑马灯 以及流水灯 电路图以及程序

电路图:

 

目的:

K1  开始跑马灯 左->右

K2  停止

K3   跑马灯  右-> 左

K4   流水灯

参考程序:

#include<reg52.h>
#include<intrins.h>
#define uchar8 unsigned char 
#define uint16 unsigned int 
#define     LED  P1 

sbit  key1=P2^0;
sbit  key2=P2^1;
sbit  key3=P2^2;
sbit  key4=P2^3;

/*****************************/
// 函数名称: DelayMS( )
// 函数功能: 延时
// 入口函数: 延时毫秒
// 出口函数: 无
/*************************                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            *******************/
void DelayMs(uint16 val)
{
       uint16  i,j;
       for( i=0;i<val;i++)
           for(j=0;j<113;j++);

}

/****************************/
// 函数名称:  keyscan( )
// 函数功能:  检测按键
// 入口函数:  无
// 出口函数:  keyscan_num
/*****************************/
uchar8 keyscan()
{
      uchar8 keyscan_num,temp;
      P2=0xff;    // 置电平
      temp=P2;  //  读P2口电平,送入 temp 中(因为这时候可能改变按键了)
      
      // if(~(temp&0xff))  不会用,先不看,用下面的
      if(temp!=0xff)    // 说明有键按下
      {
        
            if(key1==0)
            {
             keyscan_num=1;
            }
              else if(key2==0)
            {
              keyscan_num=2;
            }
            else if(key3==0)
            {
              keyscan_num=3;
            }
            else  if(key4==0)
            {
            
               keyscan_num=4;
            }
            else
           {
              keyscan_num=2;
       
            }

           
       } 
       return keyscan_num;
}


void main()
{
    
      uchar8  key_num , temp , i ;

      while(1)
      {
      
        key_num = keyscan();   // 将按键扫描的键值送入 key_num 中
        switch(key_num)
        {
           case 1:     goto function0;
           case 2:     goto function1;
           case 3:     goto function2;
           case 4:     goto function3;
           default: break ;    

        }
        
        function0:   // 跑马灯 从左向右走

         temp=0x01;  // 0000 0001
         for(i=0;i<8;i++)
         {
           LED= ~temp;
           DelayMs(1000);
           temp=temp<<1;  
        
         }  
         key_num = keyscan();   // 将按键扫描的键值送入 key_num 中
         switch(key_num)
         {
           case 1:     goto function0;
           case 2:     goto function1;
           case 3:     goto function2;
           case 4:     goto function3;
           default:  goto function0;
           break ;    

         }
    


        function1:      //停止

        LED=0xff;
        key_num = keyscan();   // 将按键扫描的键值送入 key_num 中
         switch(key_num)
         {
           case 1:     goto function0;
           case 2:     goto function1;
           case 3:     goto function2;
           case 4:     goto function3;
           default:  goto function1;
           break ;    

         }

        function2:       // 从右向左
            temp=0x80;     // 1000 0000
            for(i=0;i<8;i++)
            {
               LED= ~temp;
               DelayMs(1000);
               temp=temp>>1;  
            
            }
            key_num = keyscan();   // 将按键扫描的键值送入 key_num 中
             switch(key_num)
             {
               case 1:     goto function0;
               case 2:     goto function1;
               case 3:     goto function2;
               case 4:     goto function3;
               default:  goto function2;
               break ;    
    
             }
    

                  
        function3:         // 流水灯

           LED=0xff  ;       //  这里端口全被设置为 1111 1111 ,相当于 全灭
           
           for(i=0;i<8;i++)
           {
              
              LED=LED<<1;    // 选择了左移循环
              DelayMs(1000);
              
           }
           
            key_num = keyscan();   // 将按键扫描的键值送入 key_num 中
             switch(key_num)
             {
               case 1:     goto function0;
               case 2:     goto function1;
               case 3:     goto function2;
               case 4:     goto function3;
               default:  goto function3;
               break ;    
    
             }
    

              
      }


}

 

 

 

 

分析以及相关疑点:

1、按键按下,是遵循实验现象了,但是不太好,按其他键不能立即响应,当然我们不要求

2、实际用弹性开关,比较好,具体自己体会,一按下松开对程序没影响,

 

posted on 2015-12-23 17:11  无悔这一生。  阅读(4762)  评论(0编辑  收藏  举报

导航