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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3368|回復: 5
打印 上一主題 下一主題
收起左側

C51模擬手機按鍵

[復制鏈接]
跳轉到指定樓層
樓主
/*******************************************************************************************
課題: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 共享資料的積分獎勵!

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品免费观看 | 日日摸夜夜添夜夜添精品视频 | 色视频一区二区 | av官网在线 | 91成人免费| 黄色免费三级 | 日韩欧美亚洲 | 国产午夜精品一区二区三区四区 | av 一区二区三区 | 在线观看视频福利 | 国产成人福利在线观看 | 国产一区二区三区在线看 | 欧美黄色大片在线观看 | 日韩av一区二区在线观看 | www.日日操 | 九九热精品视频在线观看 | 黄a网站 | 亚洲九九| 国产欧美精品区一区二区三区 | 97碰碰碰 | 欧美欧美欧美 | 国产日韩欧美精品一区二区 | 一级毛片视频 | 999视频 | 国产精品精品3d动漫 | 91久久久www播放日本观看 | 日韩中文一区二区三区 | 羞羞视频免费观 | 在线播放中文字幕 | 亚洲精品久久久久国产 | 国产精品99| 午夜在线影院 | 精品一区二区在线看 | 在线观看日本网站 | 黄 色 毛片免费 | 色婷婷亚洲国产女人的天堂 | 无人区国产成人久久三区 | 亚洲一区二区在线视频 | 欧美久久一区二区三区 | 欧美日韩在线高清 | 日韩精品1区2区3区 国产精品国产成人国产三级 |