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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3347|回復: 5
打印 上一主題 下一主題
收起左側(cè)

C51模擬手機按鍵

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:97045 發(fā)表于 2015-11-25 08:57 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
/*******************************************************************************************
課題:1602LCD顯示仿手機鍵盤按鍵
LCD接口:P0.0-P0.7 TO D0-D7
                 P2.0 TO RS
                 P2.1 TO RW
                 P2.2 TO E
蜂鳴器: P2.7
鍵盤:         列(ltr) P1.0-P1.2
                 行(utd) P1.4-P1.7
*******************************************************************************************/
#include <reg52.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char

sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit SPK=P2^7;

uchar code KeyPad_Chars[12][6]={"1 ","2ABC","3DEF","4GHI","5JKL","6MNO","7PQRS","8TUV","9WXYZ","*","0+","#"};//初始化鍵盤字庫
uchar code Line1[]=" LJL'S Cellphone";//固定字符串
uchar code Line2[]="Your Key:       ";
uchar KeyNo=-1;                        //鍵位0~11
uchar Inner_Idx=0;                //同鍵位內(nèi)部切換
uchar tSpan=0;                        //同鍵位連續(xù)按鍵時間間隔

/**********************毫秒延時************************************/
void DelayMS(uint ms)       
{
        uchar i;
        while(ms--)
        {
                for(i=0;i<110;i++);
        }
}

/************************忙檢測***********************************/
uchar Busy_Waiting()
{
        uchar lcd_status;
        RS=0;
        RW=1;
        EN=1;
        DelayMS(1);
        lcd_status=P0;
        EN=0;
        return lcd_status;
}

/************************寫數(shù)據(jù)***********************************/
void Write_LCD_DATA(uchar dat)
{
        while((Busy_Waiting()&&0x80)==0x80);
        RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0;
}

/************************寫指令********************************/
void Write_LCD_Command(uchar cmd)
{
        while((Busy_Waiting()&0x80)==0x80);
        RS=0;
        RW=0;
        EN=0;
        P0=cmd;EN=1;DelayMS(1);EN=0;
}

/*****************初始化***********************************/
void Init_LCD()
{
        Write_LCD_Command(0x38);
        DelayMS(1);
        Write_LCD_Command(0x01);
        DelayMS(1);
        Write_LCD_Command(0x06);
        DelayMS(1);
        Write_LCD_Command(0x0c);
        DelayMS(1);
}

/**********************鍵盤掃描************************************/
void Keys_Scan()
{
        P1=0x0f;                        //高四位置0
        DelayMS(1);
        switch(P1)                        //判斷列
        {
                case 0x0e: KeyNo=0;break;
                case 0x0d: KeyNo=1;break;
                case 0x0b: KeyNo=2;
        }
        P1=0xf0;                        //第四位置0
        DelayMS(1);
        switch(P1)                         //根據(jù)行數(shù)加KN
        {
                case 0xe0: KeyNo+=0;break;
                case 0xd0: KeyNo+=3;break;
                case 0xb0: KeyNo+=6;break;
                case 0x70: KeyNo+=9;
        }
}

/**********************蜂鳴器**************************************/
void Beep()
{
        SPK=1;
        DelayMS(400);
        SPK=0;
}



/**********************主程序**************************************/
void main()
{
        uchar i,Pre_KeyNo=-1;
        IE=0x82;
        TMOD=0x01;
        TH0=-50000/256;
        TL0=-50000%256;
        P0=P2=0xff;
        SPK=0;
        DelayMS(10);
        Init_LCD();                        //初始化
        Set_LCD_POS(0);                //顯示第一行
        for(i=0;i<16;i++)
                Write_LCD_DATA(Line1[i]);
        Set_LCD_POS(0x40);         //顯示第二行
        for(i=0;i<16;i++)
                Write_LCD_DATA(Line2[i]);
        while(1)
        {
                P1=0xf0;
                if(P1!=0xf0)Keys_Scan();//按鍵檢測
                else continue;
                if(Pre_KeyNo!=KeyNo)         //新按鍵判斷
                {
                        Pre_KeyNo=KeyNo;
                        tSpan=0;                        //間隔請0
                        Inner_Idx=0;                   //按鍵內(nèi)部切換清0
                        TR0=1;                                   //啟動定時器
                }
                else                                          //如為同一按鍵
                {
                        if(tSpan<=40)
                                Inner_Idx=(Inner_Idx+1)%strlen(KeyPad_Chars[KeyNo]);        //顯示下一個
                                else
                                        Inner_Idx=0;
                                tSpan=0;
                }
                Set_LCD_POS(0x4b);
                Write_LCD_DATA(KeyPad_Chars[KeyNo][Inner_Idx]);         //顯示按鍵
                Beep();
                DelayMS(100);
        }
}

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:97078 發(fā)表于 2015-11-25 13:27 | 只看該作者
學習了!受用
回復

使用道具 舉報

板凳
ID:1 發(fā)表于 2015-11-25 16:40 | 只看該作者
樓主能分享一下電路圖嗎
回復

使用道具 舉報

地板
ID:97070 發(fā)表于 2015-11-25 18:38 | 只看該作者
看看,希望能幫到我
回復

使用道具 舉報

5#
ID:96742 發(fā)表于 2015-11-26 10:27 | 只看該作者
小心的提個醒,沒有設定位置顯示函數(shù)。 void Set_LCD_POS(uchar pos) {                             Write_LCD_Command(pos | 0x80);  //數(shù)據(jù)指針=80+地址變量 }
回復

使用道具 舉報

6#
ID:82765 發(fā)表于 2017-9-24 20:21 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 另类在线| 人干人人 | 亚洲国产成人精品久久久国产成人一区 | 日本一区二区三区免费观看 | 日韩一区在线播放 | 久草在线 | 日韩一区二区在线免费观看 | 粉嫩一区二区三区四区公司1 | 日韩91| 伊人网站在线 | www国产成人免费观看视频,深夜成人网 | 国产成人免费一区二区60岁 | 一区二区三区免费观看 | 欧美一级在线 | 成人午夜在线 | 国产精品不卡 | 久久久久久久91 | 色噜噜色综合 | 亚洲天堂中文字幕 | 亚洲一区二区三区免费在线 | 一区二区三区欧美在线 | 免费中文字幕 | 最近日韩中文字幕 | 亚洲香蕉 | 久久99深爱久久99精品 | 国产精品高潮呻吟久久 | 国产在线一区观看 | 日本视频一区二区 | 人人干免费 | 国产黄视频在线播放 | 亚洲精品一区二区久 | av黄色在线| 蜜桃一区| 欧美激情区 | 日韩一区二区在线播放 | 伊人一区| 成人av免费在线观看 | 国产精品激情在线 | 欧洲精品久久久久毛片完整版 | 欧美性大战久久久久久久蜜臀 | 91精品国产乱码久久久久久久久 |