久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 12271|回復(fù): 15
打印 上一主題 下一主題
收起左側(cè)

4個(gè)獨(dú)立按鍵控制4個(gè)LED亮滅的單片機(jī)程序問(wèn)題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:17109 發(fā)表于 2017-10-29 21:05 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 ll13536121668 于 2017-11-2 17:32 編輯

4只獨(dú)立按鍵控制4只LED亮和滅,按下按鍵,LED亮,再按下,LED滅。因?yàn)槲覀兒芏喽际前赐臧存I,松開(kāi)手LED才亮。 我現(xiàn)在是想一按按鍵,LED就亮或滅,這個(gè)又怎么寫(xiě)呢?while(!key1)   ,while(!key2)   ,while(!key3)   ,while(!key4  )這句是松手之后,LED亮或滅,但是,如果去掉這一句松手檢測(cè),那按鍵就不靈活了,有時(shí)行,有時(shí)不行,有時(shí)要按很多次才亮或者滅,請(qǐng)朋友們幫幫忙,要怎樣改才正確?謝謝。下面是程序

#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端口
/**************************臨時(shí)變量定義****************************/
uchar keyflag_1=0;   //按鍵標(biāo)志位        
uchar keyflag_2=0;   //按鍵標(biāo)志位        
uchar keyflag_3=0;   //按鍵標(biāo)志位        
uchar keyflag_4=0;   //按鍵標(biāo)志位         
/*************************毫秒延時(shí)函數(shù)****************************/
void delayms(uint z)
{
        uint x,y;
        for(x=0;x<=76;x++)
                for(y=0;y<=z;y++);
}
/**************************按鍵掃描子程序****************************/
void keyscan()
{
        if(key1==0)                                //第一個(gè)按鍵按下
        {
                delayms(5);                        //進(jìn)行短暫延時(shí)消除按鍵的抖動(dòng)
                if(key1==0)                        //第一個(gè)按鍵確實(shí)按下
                {
               
                        keyflag_1++;   //鍵一按下,標(biāo)志位加一
                        while(!key1);        //松手檢測(cè)
                }
        }
        if(keyflag_1==1){led1=0;} //點(diǎn)亮LED1        
        if(keyflag_1==2){led1=1;keyflag_1=0; } //關(guān)閉LED1

        if(key2==0)                                //第二個(gè)按鍵按下
        {
                delayms(5);                        //進(jìn)行短暫延時(shí)消除按鍵的抖動(dòng)
                if(key2==0)                        //第二個(gè)按鍵確實(shí)按下
                {
                           keyflag_2++;   //鍵一按下,標(biāo)志位加一
                        while(!key2);        //松手檢測(cè)
                }
        }
    if(keyflag_2==1){led2=0;} //點(diǎn)亮LED2        
        if(keyflag_2==2){led2=1;keyflag_2=0; } //關(guān)閉LED2

        if(key3==0)                                //第三個(gè)按鍵按下
        {
                delayms(5);                        //進(jìn)行短暫延時(shí)消除按鍵的抖動(dòng)
                if(key3==0)                        //第三個(gè)按鍵確實(shí)按下
                {
                        keyflag_3++;   //鍵一按下,標(biāo)志位加一
                        while(!key3);        //松手檢測(cè)
                }
        }
        if(keyflag_3==1){led3=0;} //點(diǎn)亮LED3        
        if(keyflag_3==2){led3=1;keyflag_3=0; } //關(guān)閉LED3

        if(key4==0)                                //第四個(gè)按鍵按下
        {
                delayms(5);                        //進(jìn)行短暫延時(shí)消除按鍵的抖動(dòng)
                if(key4==0)                        //第四個(gè)按鍵確實(shí)按下
                {
                        keyflag_4++;   //鍵一按下,標(biāo)志位加一
                        while(!key4);        //松手檢測(cè)
                }
        }
        if(keyflag_4==1){led4=0;} //點(diǎn)亮LED4        
        if(keyflag_4==2){led4=1;keyflag_4=0; } //關(guān)閉LED4
}
void main()
{
        while(1)        //程序循環(huán)執(zhí)行
        {
                keyscan();                //按鍵掃描,子函數(shù)

        }
}


學(xué)習(xí)4路無(wú)線開(kāi)關(guān).zip

68.86 KB, 下載次數(shù): 14

遙控學(xué)習(xí).pdf

50.62 KB, 下載次數(shù): 9

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:10193 發(fā)表于 2017-10-29 22:12 | 只看該作者
每次按鍵被識(shí)別后,執(zhí)行l(wèi)led1-4取反不就可以了嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:10193 發(fā)表于 2017-10-29 22:15 | 只看該作者
uchar keyflag_1=0;   //按鍵標(biāo)志位        
uchar keyflag_2=0;   //按鍵標(biāo)志位        
uchar keyflag_3=0;   //按鍵標(biāo)志位        
uchar keyflag_4=0;   //按鍵標(biāo)志位       這些變量定義的類型也有問(wèn)題,第三次key_flag==3怎么執(zhí)行?
回復(fù)

使用道具 舉報(bào)

地板
ID:242952 發(fā)表于 2017-10-29 22:23 | 只看該作者
很好,很好,很好啊。
回復(fù)

使用道具 舉報(bào)

5#
ID:17109 發(fā)表于 2017-10-30 09:12 | 只看該作者
gb302 發(fā)表于 2017-10-29 22:12
每次按鍵被識(shí)別后,執(zhí)行l(wèi)led1-4取反不就可以了嗎?

要什樣取反執(zhí)行l(wèi)led1-4 呢
回復(fù)

使用道具 舉報(bào)

6#
ID:212797 發(fā)表于 2017-10-30 09:12 | 只看該作者
學(xué)習(xí)了新思路。在這我也分享一下我通常處理這種問(wèn)題的方法:
1、如果只有亮滅兩種情況的話,可以考慮使用LED = ~LED;
2、如果情況大于三種以上,可以考慮求余方法,key_count % 3 == 0;key_count % 3 == 1;key_count % 3 == 2;
回復(fù)

使用道具 舉報(bào)

7#
ID:17109 發(fā)表于 2017-10-30 09:16 | 只看該作者
gb302 發(fā)表于 2017-10-29 22:12
每次按鍵被識(shí)別后,執(zhí)行l(wèi)led1-4取反不就可以了嗎?

可以俢改后截圖看看嗎
回復(fù)

使用道具 舉報(bào)

8#
ID:213173 發(fā)表于 2017-10-30 11:29 | 只看該作者
不用寫(xiě)那么多,給你改了一下,你試試。
#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端口

void keyscan()                                        //按鍵掃描程序
{
        static bit sign=0;                //按鍵有效標(biāo)志
        static uint count=0;                //消抖計(jì)數(shù)變量                       
        uchar num=0;                                //臨時(shí)變量
        if((P2&0xf0)!=0xf0)        //檢測(cè)按鍵有效
        {
                count++;                                //消抖計(jì)數(shù)
                if(count>=500)                        //100~1000,根據(jù)主循環(huán)周期調(diào)整約10~20ms
                {                       
                        count=500;
                        if(sign==0)                //測(cè)試按鍵有效標(biāo)志0
                        {
                                sign=1;                                //按鍵有效標(biāo)志置1
                                num=(P2&0xf0);                //保存P2高4位值xxxx 0000,x為0或1
                                switch(num)
                                {
                                        case 0xe0: led1=~led1; break;
                                        case 0xd0: led2=~led2; break;
                                        case 0xb0: led3=~led3; break;
                                        case 0x70: led4=~led4; break;
                                        default: break;
                                }
                        }
                }
        }
        else                                                //鍵抬起
        {
                sign=0;                                //按鍵有效標(biāo)志清0
                count=0;                                //消抖計(jì)數(shù)清0
        }
}

void main()
{

        while(1)        //程序循環(huán)執(zhí)行
        {
                keyscan();   //按鍵掃描,子函數(shù)

        }
}
回復(fù)

使用道具 舉報(bào)

9#
ID:123289 發(fā)表于 2017-10-30 19:47 | 只看該作者
有此一問(wèn),說(shuō)明樓主并未真正掌握防止鍵彈動(dòng)的原理,或者是學(xué)習(xí)太死板。
建議樓主好好回顧并弄清這個(gè)原理,再出手,估計(jì)你自己就能解決了。
想不通,可以語(yǔ)音問(wèn)我。
畫(huà)出框圖,再寫(xiě)程序,試試。
回復(fù)

使用道具 舉報(bào)

10#
ID:244379 發(fā)表于 2017-10-30 21:49 | 只看該作者
去單片機(jī)的書(shū)上找
回復(fù)

使用道具 舉報(bào)

11#
ID:244582 發(fā)表于 2017-10-31 15:40 | 只看該作者
樓主在學(xué)習(xí)的過(guò)程中過(guò)于死板了,應(yīng)靈活的去變通,可以用流程圖去分析!
回復(fù)

使用道具 舉報(bào)

12#
ID:213173 發(fā)表于 2017-11-2 11:25 | 只看該作者

回復(fù)

使用道具 舉報(bào)

13#
ID:213173 發(fā)表于 2017-11-2 14:07 | 只看該作者
//這個(gè)程序是按你的電路圖和元件編號(hào)重新改的,簡(jiǎn)潔明了,有詳細(xì)注釋。沒(méi)有讀懂前不要改變電路和程序。
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
#define key (P1 & 0x0f)                                //按鍵端口宏定義(P1的低4位)
//sbit key1=P1^3;                //按鍵1定義
//sbit key2=P1^2;                //按鍵2定義
//sbit key3=P1^1;                //按鍵3定義
//sbit key4=P1^0;                //按鍵4定義
sbit led1=P1^4;                //led1端口
sbit led2=P1^5;                //led2端口
sbit led3=P1^6;                //led3端口
sbit led4=P1^7;                //led4端口

void keyscan()                //按鍵掃描程序
{
        static bit sign=0;        //按鍵有效標(biāo)志
        static uint count=0;      //消抖計(jì)數(shù)變量                        
        uchar num=0;              //臨時(shí)變量
        if(key!=0x0f)                        //檢測(cè)有鍵按下
        {
                count++;              //消抖計(jì)數(shù)
                if(count>=1000)        //100~1000,根據(jù)主循環(huán)周期調(diào)整約10~20ms
                {                        
                        count=1000;                        //防止溢出
                        if(sign==0)       //測(cè)試按鍵有效標(biāo)志0
                        {
                                sign=1;         //按鍵有效標(biāo)志置1
                                num=key;        //保存P1低4位值0000 xxxx ,x為0或1
                                switch(num)
                                {
                                        case 0x0e: led4=~led4; break;
                                        case 0x0d: led3=~led3; break;
                                        case 0x0b: led2=~led2; break;
                                        case 0x07: led1=~led1; break;
                                        default: break;
                                }
                        }
                }
        }
        else                    //鍵抬起
        {
                sign=0;              //按鍵有效標(biāo)志清0
                count=0;             //消抖計(jì)數(shù)清0
        }
}

void main()
{       
        while(1)        //程序循環(huán)執(zhí)行
        {
                keyscan();   //按鍵掃描,子函數(shù)       
        }
}
回復(fù)

使用道具 舉報(bào)

14#
ID:243394 發(fā)表于 2017-11-2 15:29 | 只看該作者
C語(yǔ)言不會(huì),匯編的話是在判斷按鍵有沒(méi)有放開(kāi),沒(méi)有放開(kāi)就去執(zhí)行亮燈程序,然后在回來(lái)判斷按鍵有沒(méi)有放開(kāi),放開(kāi)就執(zhí)行下一條程序。
回復(fù)

使用道具 舉報(bào)

15#
ID:47286 發(fā)表于 2017-11-2 15:53 | 只看該作者
不用while等待按鍵松開(kāi) 直接寫(xiě)個(gè)死延時(shí) 用for 死等20ms然后看按鍵狀態(tài) 如果還是按下 就認(rèn)為有效 然后執(zhí)行l(wèi)ed亮或滅 這樣就和你是否松開(kāi)按鍵沒(méi)關(guān)系了
回復(fù)

使用道具 舉報(bào)

16#
ID:17109 發(fā)表于 2017-11-4 20:57 | 只看該作者
dzbj 發(fā)表于 2017-11-2 15:53
不用while等待按鍵松開(kāi) 直接寫(xiě)個(gè)死延時(shí) 用for 死等20ms然后看按鍵狀態(tài) 如果還是按下 就認(rèn)為有效 然后執(zhí)行l(wèi)e ...

這個(gè)程序什樣改才精準(zhǔn)運(yùn)行呢    樓主能夠修改程序粘貼上傳看看嗎謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久免费精品国产小说色大师 | 超碰日本 | 国际精品久久 | 国内精品视频免费观看 | 天天玩天天干天天操 | 久久高清 | 国产精品欧美一区二区三区不卡 | 亚洲国产免费 | 亚洲精品久久久久中文字幕欢迎你 | 亚州av| 国产农村妇女毛片精品久久麻豆 | 毛片免费观看 | 日韩国产一区二区三区 | 中文字幕免费视频 | 91av小视频| 国产欧美日韩综合精品一区二区 | 91精品国产91久久久久游泳池 | 国产欧美一区二区三区在线看 | 男女网站视频 | 亚洲中午字幕 | 91成人在线 | 在线一区二区三区 | 91久久久久久久 | 欧美日韩久久精品 | 91天堂网 | 日日夜夜精品视频 | 久久久久91 | 中文字幕一页二页 | 欧美在线播放一区 | 色视频欧美 | 性生生活大片免费看视频 | 老外几下就让我高潮了 | 精品久久香蕉国产线看观看亚洲 | 日韩欧美一区二区三区四区 | 国产日韩一区二区 | 91精品国产美女在线观看 | 久久久久国产精品一区二区 | 天天曰天天曰 | 欧美中文在线 | 国产日韩精品一区二区三区 | 黑人巨大精品欧美黑白配亚洲 |