新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 9. 一鍵多功能按鍵識別技術

        9. 一鍵多功能按鍵識別技術

        作者: 時間:2016-11-18 來源:網絡 收藏
        1.實驗任務
        如圖4.9.1所示,開關SP1接在P3.7/RD管腳上,在AT89S51單片機的P1端口接有四個發光二極管,上電的時候,L1接在P1.0管腳上的發光二極管在閃爍,當每一次按下開關SP1的時候,L2接在P1.1管腳上的發光二極管在閃爍,再按下開關SP1的時候,L3接在P1.2管腳上的發光二極管在閃爍,再按下開關SP1的時候,L4接在P1.3管腳上的發光二極管在閃爍,再按下開關SP1的時候,又輪到L1在閃爍了,如此輪流下去。
        2.電路原理

        圖4.9.1
        3.系統板上硬件連線
        (1.把“單片機系統”區域中的P3.7/RD端口連接到“獨立式鍵盤”區域中的SP1端口上;
        (2.把“單片機系統”區域中的P1.0-P1.4端口用8芯排線連接到“八路發光二極管指示模塊”區域中的“L1-L8”端口上;要求,P1.0連接到L1,P1.1連接到L2,P1.2連接到L3,P1.3連接到L4上。
        4.程序設計方法
        (1.設計思想由來
        在我們生活中,我們很容易通過這個叫張三,那個叫李四,另外一個是王五;那是因為每個人有不同的名子,我們就很快認出,同樣,對于要通過一個按鍵來識別每種不同的功能,我們給每個不同的功能模塊用不同的ID號標識,這樣,每按下一次按鍵,ID的值是不相同的,所以單片機就很容易識別不同功能的身份了。
        (2.設計方法
        從上面的要求我們可以看出,L1到L4發光二極管在每個時刻的閃爍的時間是受開關SP1來控制,我們給L1到L4閃爍的時段定義出不同的ID號,當L1在閃爍時,ID=0;當L2在閃爍時,ID=1;當L3在閃爍時,ID=2;當L4在閃爍時,ID=3;很顯然,只要每次按下開關K1時,分別給出不同的ID號我們就能夠完成上面的任務了。下面給出有關程序設計的框圖。
        5.程序框圖















        圖4.9.2
        6.匯編源程序
        IDEQU30H
        SP1BITP3.7
        L1BITP1.0
        L2BITP1.1
        L3BITP1.2
        L4BITP1.3
        ORG0
        MOVID,#00H
        START:JBK1,REL
        LCALLDELAY10MS
        JBK1,REL
        INCID
        MOVA,ID
        CJNEA,#04,REL
        MOVID,#00H
        REL:JNBK1,$
        MOVA,ID
        CJNEA,#00H,IS0
        CPLL1
        LCALLDELAY
        SJMPSTART
        IS0:CJNEA,#01H,IS1
        CPLL2
        LCALLDELAY
        SJMPSTART
        IS1:CJNEA,#02H,IS2
        CPLL3
        LCALLDELAY
        SJMPSTART
        IS2:CJNEA,#03H,IS3
        CPLL4
        LCALLDELAY
        SJMPSTART
        IS3:LJMPSTART
        DELAY10MS:MOVR6,#20
        LOOP1:MOVR7,#248
        DJNZR7,$
        DJNZR6,LOOP1
        RET
        DELAY:MOVR5,#20
        LOOP2:LCALLDELAY10MS
        DJNZR5,LOOP2
        RET
        END
        7.C語言源程序
        #include
        unsignedcharID;
        voiddelay10ms(void)
        {
        unsignedchari,j;
        for(i=20;i>0;i--)
        for(j=248;j>0;j--);
        }
        voiddelay02s(void)
        {
        unsignedchari;
        for(i=20;i>0;i--)
        {delay10ms();
        }
        }
        voidmain(void)
        {while(1)
        {if(P3_7==0)
        {delay10ms();
        if(P3_7==0)
        {
        ID++;
        if(ID==4)
        {
        ID=0;
        }
        while(P3_7==0);
        }
        }
        switch(ID)
        {case0:
        P1_0=~P1_0;
        delay02s();
        break;
        case1:
        P1_1=~P1_1;
        delay02s();
        break;
        case2:
        P1_2=~P1_2;
        delay02s();
        break;
        case3:
        P1_3=~P1_3;
        delay02s();
        break;
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 扎鲁特旗| 普安县| 焉耆| 温宿县| 南昌县| 屯门区| 龙口市| 株洲市| 玉门市| 高雄县| 民和| 松原市| 大洼县| 湖口县| 溧阳市| 巴彦县| 合水县| 临湘市| 涡阳县| 兴和县| 陕西省| 紫阳县| 平南县| 铁岭县| 年辖:市辖区| 子洲县| 方城县| 英超| 阳朔县| 视频| 长丰县| 巴中市| 区。| 公主岭市| 沁阳市| 始兴县| 什邡市| 平凉市| 陆良县| 临沧市| 华宁县|