(四)開關控制的 跑馬燈 以及流水燈 電路圖以及程序


電路圖:

 

目的:

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、實際用彈性開關,比較好,具體自己體會,一按下松開對程序沒影響,

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM