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