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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3455|回復: 5
收起左側

C51模擬手機按鍵

[復制鏈接]
ID:97045 發表于 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;                //同鍵位內部切換
uchar tSpan=0;                        //同鍵位連續按鍵時間間隔

/**********************毫秒延時************************************/
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;
}

/************************寫數據***********************************/
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)                         //根據行數加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;                   //按鍵內部切換清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);
        }
}

評分

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

查看全部評分

回復

使用道具 舉報

ID:97078 發表于 2015-11-25 13:27 | 顯示全部樓層
學習了!受用
回復

使用道具 舉報

ID:1 發表于 2015-11-25 16:40 | 顯示全部樓層
樓主能分享一下電路圖嗎
回復

使用道具 舉報

ID:97070 發表于 2015-11-25 18:38 | 顯示全部樓層
看看,希望能幫到我
回復

使用道具 舉報

ID:96742 發表于 2015-11-26 10:27 | 顯示全部樓層
小心的提個醒,沒有設定位置顯示函數。 void Set_LCD_POS(uchar pos) {                             Write_LCD_Command(pos | 0x80);  //數據指針=80+地址變量 }
回復

使用道具 舉報

ID:82765 發表于 2017-9-24 20:21 | 顯示全部樓層
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产乱码久久久久久久久 | 青青草网站在线观看 | 三级在线视频 | 欧美另类视频 | 隔壁老王国产在线精品 | 久久99这里只有精品 | 中文字幕综合 | 国产一区二区中文字幕 | 日本久久精品视频 | 精品三级在线观看 | www.亚洲视频 | 最新国产视频 | 一级黄色绿像片 | 国产伦精品一区二区三区精品视频 | 羞羞网站在线免费观看 | 国产精品久久久久久中文字 | 欧美日韩在线视频一区 | 国产日韩精品在线 | 我我色综合 | 亚洲狠狠 | 久久精品网 | 成人免费日韩 | 亚洲欧洲一区 | 色综合久久久 | 三级成人在线观看 | 亚洲一区二区三区免费观看 | 国产成人网 | 色综合久久久久 | 成人a在线 | 亚洲激情第一页 | 日本三级播放 | 久久久久久久一区二区 | 一区二区免费高清视频 | 欧美视频精品 | 久久一区二区三区免费 | 亚洲免费视频在线观看 | 日本成人福利视频 | 久久久久高清 | 国产精品三级久久久久久电影 | 亚洲激情第一页 | 国产中文视频 |