新聞中心

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

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

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

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

本文引用地址:http://butianyuan.cn/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)閉