微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机C编程(十一、电话拨号模拟液晶显示)

51单片机C编程(十一、电话拨号模拟液晶显示)

时间:11-27 来源:互联网 点击:
*程序名称:电话拨号模拟(液晶显示)

*创建人:jumpmysoul
*完成日期:2009.06.06
*版本:V1.0
*功能说明:按下电话键盘上的一个按键,在液晶显示屏上相应的显示出按下的
按键对应的字符,按下DEL键,则删除一个字符 (不足之处:在删除所有的字符后
光标不见了,如果继续删除几次,再输入的时候就要多按几次按键)

#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);//延时,作用是只显示一个字符,如果没有延时,则会显示一串字符
}

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);//先延时。

LCDE=1;//然后把LCD改为写入命令状态。
LCDRS=0;
LCDRW=0;

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

LCDE=0;//最后执行命令。
}
void WriteData(uchar dat)
{
Delay_ms(10);//先延时。

LCDE=1;//然后把LCD改为写入数据状态。
LCDRS=1;
LCDRW=0;

LCDPORT=dat;//再输出数据。

LCDE=0;//最后显示数据。
}
void init()
{
LCDRW=0;
LCDE=0;
WriteCMD(0x38);
WriteCMD(0x0f);
WriteCMD(0x06);
WriteCMD(0x01);
WriteCMD(0x80);
}
void Delete()
{
if( (addr--)>0)
{
WriteCMD(0x04);//读写一个字符后地址指针减1,光标左移
WriteData( );
}
WriteCMD(0x06);//读写一个字符后地址指针加1,光标右移

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top