電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 1676|回復(fù): 0
收起左側(cè)

單片機(jī)C語(yǔ)言實(shí)例-165-矩陣鍵盤(pán)(LCD)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-2-11 15:02:29 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)C語(yǔ)言實(shí)例-165-矩陣鍵盤(pán)(LCD)

/********************************************************************
* 文件名  : 矩陣鍵盤(pán)LCD.c
* 描述    :  該文件實(shí)現(xiàn)了 4 * 4 鍵盤(pán)的試驗(yàn)。通過(guò)1602液晶來(lái)顯示當(dāng)前的按鍵值。                 
* 創(chuàng)建人  : 東流,2009年4月10日
* 版本號(hào)  : 2.0
*********************************************************************/
#include<reg51.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char

uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

//這三個(gè)引腳參考資料
sbit E=P2^7;                //1602使能引腳
sbit RW=P2^6;                //1602讀寫(xiě)引腳       
sbit RS=P2^5;                //1602數(shù)據(jù)/命令選擇引腳


/********************************************************************
* 名稱(chēng) : Delay_1ms()
* 功能 : 延時(shí)子程序,延時(shí)時(shí)間為 1ms * x
* 輸入 : x (延時(shí)一毫秒的個(gè)數(shù))
* 輸出 : 無(wú)
***********************************************************************/
void Delay_1ms(uint i)//1ms延時(shí)
{
        uchar x,j;
        for(j=0;j<i;j++)
        for(x=0;x<=148;x++);       
}

/********************************************************************
* 名稱(chēng) : delay()
* 功能 : 延時(shí),延時(shí)時(shí)間大概為5US。
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/

void delay()
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}
/********************************************************************
* 名稱(chēng) : bit Busy(void)
* 功能 : 這個(gè)是一個(gè)讀狀態(tài)函數(shù),讀出函數(shù)是否處在忙狀態(tài)
* 輸入 : 輸入的命令值
* 輸出 : 無(wú)
***********************************************************************/
bit Busy(void)
{
        bit busy_flag = 0;
        RS = 0;
        RW = 1;
        E = 1;
        delay();
        busy_flag = (bit)(P0 & 0x80);
        E = 0;
        return busy_flag;
}
/********************************************************************
* 名稱(chēng) : wcmd(uchar del)
* 功能 : 1602命令函數(shù)
* 輸入 : 輸入的命令值
* 輸出 : 無(wú)
***********************************************************************/
void wcmd(uchar del)
{
        while(Busy());
        RS = 0;
        RW = 0;
        E = 0;
        delay();
        P0 = del;
        delay();
        E = 1;
        delay();
        E = 0;
}

/********************************************************************
* 名稱(chēng) : wdata(uchar del)
* 功能 : 1602寫(xiě)數(shù)據(jù)函數(shù)
* 輸入 : 需要寫(xiě)入1602的數(shù)據(jù)
* 輸出 : 無(wú)
***********************************************************************/

void wdata(uchar del)
{
        while(Busy());
        RS = 1;
        RW = 0;
        E = 0;
        delay();
        P0 = del;
    delay();
        E = 1;
        delay();
        E = 0;
}

/********************************************************************
* 名稱(chēng) : L1602_init()
* 功能 : 1602初始化,請(qǐng)參考1602的資料
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void L1602_init(void)
{
        wcmd(0x38);
        wcmd(0x0c);
        wcmd(0x06);
        wcmd(0x01);
}

/********************************************************************
* 名稱(chēng) : L1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符顯示"b" ,調(diào)用該函數(shù)如下
                 L1602_char(1,5,'b')
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無(wú)
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
{
        uchar a;
        if(hang == 1) a = 0x80;
        if(hang == 2) a = 0xc0;
        a = a + lie - 1;
        wcmd(a);
        wdata(sign);
}

/********************************************************************
* 名稱(chēng) : L1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開(kāi)始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
                  L1602_string(1,5,"ab cd ef;")
* 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
* 輸出 : 無(wú)
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
{
        uchar a,b=0;
        if(hang == 1) a = 0x80;
        if(hang == 2) a = 0xc0;
        a = a + lie - 1;
        while(1)
        {
                wcmd(a++);
                b++;
                if((*p == '\0')||(b==16)) break;
                wdata(*p);
                p++;
        }
}

/********************************************************************
* 名稱(chēng) : Keyscan()
* 功能 : 實(shí)現(xiàn)按鍵的讀取。下面這個(gè)子程序是按處理 矩陣鍵盤(pán) 的基本方法處理的。
* 輸入 : 無(wú)
* 輸出 : 按鍵值
***********************************************************************/
uchar Keyscan(void)
{
        uchar i,j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};
        for(j=0; j<4; j++)
        {
                P1 = Buffer[j];
                temp = 0x10;                                                                                                                                                                    
                for(i=0; i<4; i++)
                {
                        if(!(P1 & temp))
                        {
                                return (i+j*4);
                        }
                        temp <<= 1;
                }       
        }
}

/********************************************************************
* 名稱(chēng) : Main()
* 功能 : 主函數(shù)
* 輸入 : 無(wú)
* 輸出 : 無(wú)
***********************************************************************/
void Main(void)
{
        uchar Key_Value;  //讀出的鍵值
        L1602_init();
        L1602_string(1,1,"  4*4 KeyBoard  ");
        L1602_string(2,1,"You Press The    ");
        while(1)
        {
                P1 = 0xf0;
                if(P1 != 0xf0)
                {
                        Delay_1ms(20);        //按鍵消抖
                        if(P1 != 0xf0)
                        {
                                Delay_1ms(20);        //按鍵消抖
                                if(P1 != 0xf0)
                                {
                                        Key_Value = Keyscan();               
                                }
                        }
                }
                L1602_char(2,15,Key_Value / 10 + 48);
                L1602_char(2,16,Key_Value % 10 + 48);               
        }
}


更多詳情參考附件文檔

游客,如果您要查看本帖隱藏內(nèi)容請(qǐng)回復(fù)

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表