|
本帖最后由 ll13536121668 于 2017-11-2 17:32 編輯
阿里旺旺圖片20171102103509.jpg (70.86 KB, 下載次數: 39)
下載附件
2017-11-2 11:45 上傳
4只獨立按鍵控制4只LED亮和滅,按下按鍵,LED亮,再按下,LED滅。因為我們很多都是按完按鍵,松開手LED才亮。 我現在是想一按按鍵,LED就亮或滅,這個又怎么寫呢?while(!key1) ,while(!key2) ,while(!key3) ,while(!key4 )這句是松手之后,LED亮或滅,但是,如果去掉這一句松手檢測,那按鍵就不靈活了,有時行,有時不行,有時要按很多次才亮或者滅,請朋友們幫幫忙,要怎樣改才正確?謝謝。下面是程序
#include <reg52.h>
//定義一下,方便使用
#define uchar unsigned char
#define uint unsigned int
sbit key1=P2^4; //按鍵1定義
sbit key2=P2^5; //按鍵2定義
sbit key3=P2^6; //按鍵3定義
sbit key4=P2^7; //按鍵4定義
sbit led1=P3^0; //led1端口
sbit led2=P3^1; //led2端口
sbit led3=P3^2; //led3端口
sbit led4=P3^3; //led4端口
/**************************臨時變量定義****************************/
uchar keyflag_1=0; //按鍵標志位
uchar keyflag_2=0; //按鍵標志位
uchar keyflag_3=0; //按鍵標志位
uchar keyflag_4=0; //按鍵標志位
/*************************毫秒延時函數****************************/
void delayms(uint z)
{
uint x,y;
for(x=0;x<=76;x++)
for(y=0;y<=z;y++);
}
/**************************按鍵掃描子程序****************************/
void keyscan()
{
if(key1==0) //第一個按鍵按下
{
delayms(5); //進行短暫延時消除按鍵的抖動
if(key1==0) //第一個按鍵確實按下
{
keyflag_1++; //鍵一按下,標志位加一
while(!key1); //松手檢測
}
}
if(keyflag_1==1){led1=0;} //點亮LED1
if(keyflag_1==2){led1=1;keyflag_1=0; } //關閉LED1
if(key2==0) //第二個按鍵按下
{
delayms(5); //進行短暫延時消除按鍵的抖動
if(key2==0) //第二個按鍵確實按下
{
keyflag_2++; //鍵一按下,標志位加一
while(!key2); //松手檢測
}
}
if(keyflag_2==1){led2=0;} //點亮LED2
if(keyflag_2==2){led2=1;keyflag_2=0; } //關閉LED2
if(key3==0) //第三個按鍵按下
{
delayms(5); //進行短暫延時消除按鍵的抖動
if(key3==0) //第三個按鍵確實按下
{
keyflag_3++; //鍵一按下,標志位加一
while(!key3); //松手檢測
}
}
if(keyflag_3==1){led3=0;} //點亮LED3
if(keyflag_3==2){led3=1;keyflag_3=0; } //關閉LED3
if(key4==0) //第四個按鍵按下
{
delayms(5); //進行短暫延時消除按鍵的抖動
if(key4==0) //第四個按鍵確實按下
{
keyflag_4++; //鍵一按下,標志位加一
while(!key4); //松手檢測
}
}
if(keyflag_4==1){led4=0;} //點亮LED4
if(keyflag_4==2){led4=1;keyflag_4=0; } //關閉LED4
}
void main()
{
while(1) //程序循環執行
{
keyscan(); //按鍵掃描,子函數
}
}
|
-
-
學習4路無線開關.zip
2017-11-2 17:31 上傳
點擊文件名下載附件
68.86 KB, 下載次數: 14
-
-
遙控學習.pdf
2017-11-2 17:32 上傳
點擊文件名下載附件
50.62 KB, 下載次數: 9
|