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

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

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

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

/***********************************************************************
*** 功能:鍵盤矩陣掃描
*** 實(shí)驗(yàn)內(nèi)容:數(shù)碼管顯示相應(yīng)的按鍵,開始的時(shí)候顯示------,按下按鍵以后顯示按鍵的編號(hào)
*** 開發(fā)板連接方法: J3接到2-3位置  J2不要接上。
***********************************************************************/
#include<pic.h>              //包含單片機(jī)內(nèi)部資源預(yù)定義
__CONFIG(0xFF32);
//芯片配置字,看門狗關(guān),上電延時(shí)開,掉電檢測(cè)關(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ù):
* 說(shuō)    明:便于初學(xué)者學(xué)習(xí),我們采用一一行的掃面方式
****************************************************************************/
void scan()
{
        PORTB = 0X7f;                 //B7輸出低電平,其他三位輸出高電平
        asm("nop");                 //插入一定延時(shí),確保電平穩(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");               //插入一定延時(shí),確保電平穩(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");           //插入一定延時(shí),確保電平穩(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");        //插入一定延時(shí),確保電平穩(wěn)定
                                result = PORTB;      //讀回B口低4位結(jié)果
                                result = result & 0x0f; //清除高4位
                                if (result != 0x0f)   //判斷低四位是否為全1(全1代表沒有按鍵按下)
                                {
                                        result = result | 0xe0; //否,加上高4位0x0e,做為按鍵掃描的結(jié)果
                                }
                                else               //是,全部按鍵掃描結(jié)束,沒有按鍵按下,置無(wú)按鍵按下標(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();      //無(wú)按鍵按下顯示------
        }
}

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

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 爱爱综合网 | 蜜桃黄网| 午夜视频在线播放 | 成人欧美一区二区三区色青冈 | 亚洲免费网| 久久亚洲精品国产精品紫薇 | 成人h视频| 超碰97在线免费 | 亚洲一区二区久久 | 在线天堂免费中文字幕视频 | 日韩2020狼一二三 | 国产精品欧美一区二区 | 国产精品日韩欧美一区二区三区 | 亚洲电影一区二区三区 | 国产不卡视频在线 | 亚洲国产精品va在线看黑人 | 成人一级黄色毛片 | 91精品福利 | 一区二区三区久久久 | 精品国产一区二区三区性色av | 一级做a爰片久久毛片免费看 | 亚洲精品国产偷自在线观看 | 中文字幕视频三区 | 中文字幕一区二区三区精彩视频 | 性一交一乱一伦视频免费观看 | 国产精品自拍av | 亚洲国产精品区 | 成人在线免费电影 | 成人免费在线观看 | 日本久久久久久 | 一区二区三区在线观看视频 | 日本天天操 | 日韩中文视频 | 欧美精品久久 | 97人人澡人人爽91综合色 | 日韩精品无码一区二区三区 | 午夜视频一区二区三区 | 一区二区三区免费 | 精品美女视频在线观看免费软件 | 中文字幕专区 | 国产精品色 |