新聞中心

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

        一鍵多功能按鍵識別技術

        作者: 時間:2011-02-27 來源:網絡 收藏

        1.實驗任務

        如圖4.9.1所示,開關SP1接在P3.7/RD管腳上,在AT89S51P1端口接有四個發光二極管,上電的時候,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.0P1.4端口用8芯排線連接到“八路發光二極管指示模塊”區域中的“L1L8”端口上;要求,P1.0連接到L1P1.1連接到L2P1.2連接到L3P1.3連接到L4上。

        4.程序設計方法

        (1. 設計思想由來

        在我們生活中,我們很容易通過這個叫張三,那個叫李四,另外一個是王五;那是因為每個人有不同的名子,我們就很快認出,同樣,對于要通過一個按鍵來識別每種不同的功能,我們給每個不同的功能模塊用不同的ID號標識,這樣,每按下一次按鍵,ID的值是不相同的,所以單片機就很容易識別不同功能的身份了。

        (2. 設計方法

        從上面的要求我們可以看出,L1L4發光二極管在每個時刻的閃爍的時間是受開關SP1來控制,我們給L1L4閃爍的時段定義出不同的ID號,當L1在閃爍時,ID0;當L2在閃爍時,ID1;當L3在閃爍時,ID2;當L4在閃爍時,ID3;很顯然,只要每次按下開關K1時,分別給出不同的ID號我們就能夠完成上面的任務了。下面給出有關程序設計的框圖。

        5.程序框圖

        4.9.2

        6.匯編源程序

        ID EQU 30H

        SP1 BIT P3.7

        L1 BIT P1.0

        L2 BIT P1.1

        L3 BIT P1.2

        L4 BIT P1.3

        ORG 0

        MOV ID,#00H

        START: JB K1,REL

        LCALL DELAY10MS

        JB K1,REL

        INC ID

        MOV A,ID

        CJNE A,#04,REL

        MOV ID,#00H

        REL: JNB K1,$

        MOV A,ID

        CJNE A,#00H,IS0

        CPL L1

        LCALL DELAY

        SJMP START

        IS0: CJNE A,#01H,IS1

        CPL L2

        LCALL DELAY

        SJMP START

        IS1: CJNE A,#02H,IS2

        CPL L3

        LCALL DELAY

        SJMP START

        IS2: CJNE A,#03H,IS3

        CPL L4

        LCALL DELAY

        SJMP START

        IS3: LJMP START

        DELAY10MS: MOV R6,#20

        LOOP1: MOV R7,#248

        DJNZ R7,$

        DJNZ R6,LOOP1

        RET

        DELAY: MOV R5,#20

        LOOP2: LCALL DELAY10MS

        DJNZ R5,LOOP2

        RET

        END

        7.C語言源程序

        #include AT89X51.H>

        unsigned char ID;

        void delay10ms(void)

        {

        unsigned char i,j;

        for(i=20;i>0;i--)

        for(j=248;j>0;j--);

        }

        void delay02s(void)

        {

        unsigned char i;

        for(i=20;i>0;i--)

        {delay10ms();

        }

        }

        void main(void)

        {while(1)

        {if(P3_7==0)

        {delay10ms();

        if(P3_7==0)

        {

        ID++;

        if(ID==4)

        {

        ID=0;

        }

        while(P3_7==0);

        }

        }

        switch(ID)

        {case 0:

        P1_0=~P1_0;

        delay02s();

        break;

        case 1:

        P1_1=~P1_1;

        delay02s();

        break;

        case 2:

        P1_2=~P1_2;

        delay02s();

        break;

        case 3:

        P1_3=~P1_3;

        delay02s();

        break;

        }

        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 桦南县| 阳城县| 赣州市| 建始县| 榕江县| 巴林左旗| 开平市| 武安市| 九龙坡区| 双柏县| 洛隆县| 册亨县| 叙永县| 江孜县| 大足县| 蓬莱市| 滨海县| 北宁市| 平利县| 北碚区| 仪征市| 临夏市| 紫金县| 枣强县| 海口市| 方山县| 锦屏县| 永嘉县| 马龙县| 九江市| 临潭县| 锡林郭勒盟| 呼玛县| 成都市| 芷江| 敦化市| 老河口市| 蓬安县| 思茅市| 南充市| 韶山市|