<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        PIC單片機鍵盤矩陣掃描C語言程序

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年03月31日   【字體:

        /***********************************************************************
        *** 功能:鍵盤矩陣掃描
        *** 實驗內容:數碼管顯示相應的按鍵,開始的時候顯示------,按下按鍵以后顯示按鍵的編號
        *** 開發板連接方法: J3接到2-3位置  J2不要接上。
        ***********************************************************************/
        #include<pic.h>              //包含單片機內部資源預定義
        __CONFIG(0xFF32);
        //芯片配置字,看門狗關,上電延時開,掉電檢測關,低壓編程關,加密,4M晶體HS振蕩
        const unsigned char TABLE[] = {0x3f, 0x6, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
        int result=0x00,preres=0x00;
        void delay();                      //delay函數申明
        void init();                       //I/O口初始化函數申明
        void scan();                       //按鍵掃描程序申明
        void display();                       //顯示函數申明

        /****************************************************************************
        * 名    稱:main()
        * 功    能:主程序
        * 入口參數:
        * 出口參數:
        ****************************************************************************/
        void main()
        {
                init();                                //調用初始化子程序
                while (1)                   //循環工作
                {

                        scan();                //調用按鍵掃描子程序
                        display(result);       //調用結果顯示子程序
                }
        }

        /****************************************************************************
        * 名    稱:init()
        * 功    能:初始化
        * 入口參數:
        * 出口參數:
        ****************************************************************************/
        void init()
        {
                ADCON1 = 0X07;               //設置A口為普通I/O口
                TRISB = 0X0F;                                   //設置B口低4位為輸入//高四位為輸出
                TRISD = 0;                                   //portd 輸出
                TRISA = 0;                                   //porta 輸出
                PORTA = 0x00;                                 //先關閉所有顯示
                PORTD = 0x40;
                TRISC = 0Xf0;
                PORTC = 1;

        }

        /****************************************************************************
        * 名    稱:scan()
        * 功    能:按鍵掃描
        * 入口參數:
        * 出口參數:
        * 說    明:便于初學者學習,我們采用一一行的掃面方式
        ****************************************************************************/
        void scan()
        {
                PORTB = 0X7f;                 //B7輸出低電平,其他三位輸出高電平
                asm("nop");                 //插入一定延時,確保電平穩定
                result = PORTB;               //讀回B口低4位結果
                result = result & 0x0f;         //清除高4位
                if (result != 0x0f)            //判斷低4位是否為全1(全1代表沒按鍵按下)?
                {
                        result = result | 0x70;     //否,加上高4位0x70,做為按鍵掃描的結果
                }
                else                        //是,改變低4位輸出,重新判斷是否有按鍵按下
                {
                        PORTB = 0Xbf;               //B6輸出低電平,其他三位輸出高電平
                        asm("nop");               //插入一定延時,確保電平穩定
                        result = PORTB;             //讀回B口高低4位結果
                        result = result & 0x0f;       //清除高4位
                        if (result != 0xf)           //判斷低4位是否為全1(全1代表沒按鍵按下)
                        {
                                result = result | 0xb0;     //否,加上高4位0xb0,做為按鍵掃描的結果
                        }
                        else                      //是,改變低4位輸出,重新掃描
                        {
                                PORTB = 0Xdf;           //B5輸出低電平,其他三位輸出高電平
                                asm("nop");           //插入一定延時,確保電平穩定
                                result = PORTB;         //讀回B口低4位結果
                                result = result & 0x0f;   //清除高4位
                                if (result != 0x0f)      //判斷低4位是否為全1(全1代表沒按鍵按下)
                                {
                                        result = result | 0xd0;  //否,加上高4位0xd0,做為按鍵掃描的結果
                                }
                                else                  //是,改變高4位的輸出,重新掃描
                                {
                                        PORTB = 0Xef;        //B4輸出低電平,其他三位輸出高電平
                                        asm("nop");        //插入一定延時,確保電平穩定
                                        result = PORTB;      //讀回B口低4位結果
                                        result = result & 0x0f; //清除高4位
                                        if (result != 0x0f)   //判斷低四位是否為全1(全1代表沒有按鍵按下)
                                        {
                                                result = result | 0xe0; //否,加上高4位0x0e,做為按鍵掃描的結果
                                        }
                                        else               //是,全部按鍵掃描結束,沒有按鍵按下,置無按鍵按下標志位
                                        {
                                                result = 0xff;    //掃描結果為0xff,做為沒有按鍵按下的標志
                                        }
                                }
                        }
                }
                if(result==0xff)
                        result=preres;
                else
                        preres=result;


        }

        /****************************************************************************
        * 名    稱:display()
        * 功    能:顯示
        * 入口參數:
        * 出口參數:
        ****************************************************************************/
        void display()
        {
                switch (result)
                {
                case 0xe7:
                        PORTD = TABLE[3];PORTA = 0XFF;delay();break;           //K3
                case 0xeb:
                        PORTD = TABLE[2];PORTA = 0XFF;delay();break;           //K2
                case 0xed:
                        PORTD = TABLE[1];PORTA = 0XFF;delay();break;           //K1
                case 0xee:
                        PORTD = TABLE[0];PORTA = 0XFF;delay();break;           //K0
                case 0xd7:
                        PORTD = TABLE[7];PORTA = 0XFF;delay();break;           //K7
                case 0xdb:
                        PORTD = TABLE[6];PORTA = 0XFF;delay();break;           //K6
                case 0xdd:
                        PORTD = TABLE[5];PORTA = 0XFF;delay();break;           //K5
                case 0xde:
                        PORTD = TABLE[4];PORTA = 0XFF;delay();break;           //K4
                case 0xb7:
                        PORTD = TABLE[11];PORTA = 0XFF;delay();break;   //KB
                case 0xbb:
                        PORTD = TABLE[10];PORTA = 0XFF;delay();break;   //KA
                case 0xbd:
                        PORTD = TABLE[9];PORTA = 0XFF;delay();break;           //K9
                case 0xbe:
                        PORTD = TABLE[8];PORTA = 0XFF;delay();break;           //K8
                case 0x77:
                        PORTD = TABLE[15];PORTA = 0XFF;delay();break;   //KF
                case 0x7b:
                        PORTD = TABLE[14];PORTA = 0XFF;delay();break;   //KE
                case 0x7d:
                        PORTD = TABLE[13];PORTA = 0XFF;delay();break;   //KD
                case 0x7e:
                        PORTD = TABLE[12];PORTA = 0XFF;delay();break;   //KC
                case 0x00:
                        PORTD = 0x40; PORTA = 0xFF; delay();      //無按鍵按下顯示------
                }
        }

        /****************************************************************************
        * 名    稱:delay()
        * 功    能:延時
        * 入口參數:
        * 出口參數:
        ****************************************************************************/
        void delay()
        {
                int i;                                 //定義整形變量
                for (i = 0x100;i--;);             //延時
        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮