專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

PIC單片機(jī)鍵盤矩陣掃描C語言程序

作者:huqin   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年03月31日   【字體:

/***********************************************************************
*** 功能:鍵盤矩陣掃描
*** 實驗內(nèi)容:數(shù)碼管顯示相應(yīng)的按鍵,開始的時候顯示------,按下按鍵以后顯示按鍵的編號
*** 開發(fā)板連接方法: J3接到2-3位置  J2不要接上。
***********************************************************************/
#include<pic.h>              //包含單片機(jī)內(nèi)部資源預(yù)定義
__CONFIG(0xFF32);
//芯片配置字,看門狗關(guān),上電延時開,掉電檢測關(guān),低壓編程關(guān),加密,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函數(shù)申明
void init();                       //I/O口初始化函數(shù)申明
void scan();                       //按鍵掃描程序申明
void display();                       //顯示函數(shù)申明

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

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

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

}

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


}

/****************************************************************************
* 名    稱:display()
* 功    能:顯示
* 入口參數(shù):
* 出口參數(shù):
****************************************************************************/
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()
* 功    能:延時
* 入口參數(shù):
* 出口參數(shù):
****************************************************************************/
void delay()
{
        int i;                                 //定義整形變量
        for (i = 0x100;i--;);             //延時
}

關(guān)閉窗口

相關(guān)文章