新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)C編程(十一、電話撥號(hào)模擬液晶顯示)

        51單片機(jī)C編程(十一、電話撥號(hào)模擬液晶顯示)

        作者: 時(shí)間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
        *程序名稱:電話撥號(hào)模擬(液晶顯示)

        *創(chuàng)建人:jumpmysoul
        *完成日期:2009.06.06
        *版本:V1.0
        *功能說明:按下電話鍵盤上的一個(gè)按鍵,在液晶顯示屏上相應(yīng)的顯示出按下的
        按鍵對(duì)應(yīng)的字符,按下DEL鍵,則刪除一個(gè)字符 (不足之處:在刪除所有的字符后
        光標(biāo)不見了,如果繼續(xù)刪除幾次,再輸入的時(shí)候就要多按幾次按鍵)

        本文引用地址:http://www.104case.com/article/201611/322154.htm

        #include
        #define uchar unsigned char
        #define uint unsigned int
        #define LCDPORT P0
        #define KEYP1
        //#define WEIP2

        sbit DEL=P3^0;
        sbit LCDE=P3^5;
        sbit LCDRW=P3^6;
        sbit LCDRS=P3^7;

        uchar code NUM[12]="0123456789*#";

        uchar addr=0;

        void WriteCMD(uchar);
        void init();
        void WriteData(uchar);
        void Delete();

        void Delay_ms(uint);
        uchar KeyScan();
        void main()
        {
        init();
        while(1)
        {
        if(KeyScan()!=20)//判斷電話按鍵是否按下
        {
        addr++;//地址變量加1
        WriteData(NUM[KeyScan()]);//在液晶上顯示按下的鍵值
        Delay_ms(100);//延時(shí),作用是只顯示一個(gè)字符,如果沒有延時(shí),則會(huì)顯示一串字符
        }

        if(DEL==0)//判斷DEL按鍵是否按下
        {
        Delay_ms(10);
        if(DEL==0)
        while(DEL==0);
        Delay_ms(10);
        while(DEL==0);
        Delete();
        }
        }

        }
        uchar KeyScan()
        {
        uchar temp=20;
        KEY=0xef;//掃描第1列鍵
        switch(KEY)
        {
        case 0xee:temp=1;break;
        case 0xed:temp=4;break;
        case 0xeb:temp=7;break;
        case 0xe7:temp=10;break;
        default:break;
        }
        KEY=0xdf;//掃描第2列鍵
        switch(KEY)
        {
        case 0xde:temp=2;break;
        case 0xdd:temp=5;break;
        case 0xdb:temp=8;break;
        case 0xd7:temp=0;break;
        default:break;
        }
        KEY=0xbf;//掃描第3列鍵
        switch(KEY)
        {
        case 0xbe:temp=3;break;
        case 0xbd:temp=6;break;
        case 0xbb:temp=9;break;
        case 0xb7:temp=11;break;
        default:break;
        }
        return(temp);//返回按鍵鍵值
        }
        void Delay_ms(uint x)
        {
        uint i,j;
        for(i=x;i>0;i--)
        for(j=120;j>0;j--);
        }
        void WriteCMD(uchar Command)
        {
        Delay_ms(10);//先延時(shí)。

        LCDE=1;//然后把LCD改為寫入命令狀態(tài)。
        LCDRS=0;
        LCDRW=0;

        LCDPORT=Command;//再輸出命令。

        LCDE=0;//最后執(zhí)行命令。
        }
        void WriteData(uchar dat)
        {
        Delay_ms(10);//先延時(shí)。

        LCDE=1;//然后把LCD改為寫入數(shù)據(jù)狀態(tài)。
        LCDRS=1;
        LCDRW=0;

        LCDPORT=dat;//再輸出數(shù)據(jù)。

        LCDE=0;//最后顯示數(shù)據(jù)。
        }
        void init()
        {
        LCDRW=0;
        LCDE=0;
        WriteCMD(0x38);
        WriteCMD(0x0f);
        WriteCMD(0x06);
        WriteCMD(0x01);
        WriteCMD(0x80);
        }
        void Delete()
        {
        if( (addr--)>0)
        {
        WriteCMD(0x04);//讀寫一個(gè)字符后地址指針減1,光標(biāo)左移
        WriteData( );
        }
        WriteCMD(0x06);//讀寫一個(gè)字符后地址指針加1,光標(biāo)右移

        }



        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 沙雅县| 大邑县| 濮阳市| 陇西县| 乐至县| 荆门市| 潼南县| 桐梓县| 庄河市| 永州市| 桓仁| 桂平市| 大石桥市| 永德县| 库尔勒市| 信丰县| 田阳县| 晋州市| 浑源县| 临猗县| 慈溪市| 承德县| 土默特右旗| 凯里市| 白水县| 南郑县| 商水县| 金寨县| 历史| 镇安县| 嘉禾县| 乌拉特后旗| 陵水| 和政县| 大理市| 根河市| 雷州市| 长阳| 安徽省| 镇康县| 公主岭市|