1602LCD显示电话拨号键盘按键dwg.docx

上传人:b****3 文档编号:4143435 上传时间:2022-11-28 格式:DOCX 页数:17 大小:432.19KB
下载 相关 举报
1602LCD显示电话拨号键盘按键dwg.docx_第1页
第1页 / 共17页
1602LCD显示电话拨号键盘按键dwg.docx_第2页
第2页 / 共17页
1602LCD显示电话拨号键盘按键dwg.docx_第3页
第3页 / 共17页
1602LCD显示电话拨号键盘按键dwg.docx_第4页
第4页 / 共17页
1602LCD显示电话拨号键盘按键dwg.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

1602LCD显示电话拨号键盘按键dwg.docx

《1602LCD显示电话拨号键盘按键dwg.docx》由会员分享,可在线阅读,更多相关《1602LCD显示电话拨号键盘按键dwg.docx(17页珍藏版)》请在冰豆网上搜索。

1602LCD显示电话拨号键盘按键dwg.docx

1602LCD显示电话拨号键盘按键dwg

---------

毕业论文(设计)

 

题目__单片机课程设计________

指导教师_________________

院系_____________

专业____________

班级_________________

姓名______________________

学号_______________

 

2015年9月1日至2015年12月7日(共12周)

 

1602LCD显示电话拨号键盘按键

摘要:

介绍了基于单片机LCD1602显示屏的设计过程。

给出了其硬件原理图和系统仿真图。

关键词:

单片机1602LCD显示屏键盘系统

一、设计预达目标

要求以51单片机作为微控制器,通过1602LCD显示屏显示拨号键盘,键值包括数字0-9及“*”“#”等12个按键,数字显示为逐个显示方式。

二.设计方案

首先构建单片机最小系统、键盘输入系统及1602LCD显示系统。

通过单片机扫描键值,将其结果输入到1602LCD显示屏上。

(一)单片机最小系统

单片机最小系统主要由电源、复位、震荡电路以及扩展部分等部分组成。

图2.1单片机最小系统

(二)输入按键系统

独立的键盘与单片机相连时,每个按键都需要单片机的一个I/O线,若按键较多时,占用的I/O口资源就会过多,为此就引入了矩阵键盘。

本次设计共有0~9、#、*共12个按键,因此引入3*4的矩阵键盘,共需要7个I/O口,7条线分别与单片机P3口相连。

{注:

当作为输入时,上拉电阻将其电位拉高,若输入为低电平则可提供电流源;所以P0口如果作为输入时,处在高阻抗状态,只有外接一个上拉电阻才能有效。

}

图2.2输入按键系统

(三)1602LCD显示系统

AT89C51单片机,P0口输出时,必须使用上拉电阻,提高电压,否则无法得到输出结果。

{注:

51单片机的P0口在做IO时需要上拉电阻,使其避免悬空,因为P0口内部是漏集开路输出的。

其他口则不需要上拉电阻。

}

图2.31602LCD显示系统

1LCD1602原件显示原理

图2.3.1LCD1602引脚图

 

表1LCD1602引脚功能

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

数据

2

VDD

电源正极

10

D3

数据

3

VL

液晶显示偏压

11

D4

数据

4

RS

数据/命令选择

12

D5

数据

5

R/W

读/写选择

13

D6

数据

6

E

使能信号

14

D7

数据

7

D0

数据

15

D8

背光源正极

8

D1

数据

16

D9

背光源负极

2LCD1602引脚说明

第1脚:

VSS为地电源;

第2脚:

VDD接+5V电源;

第3脚:

VL为液晶显示器对比度调度端,接正电源时对比度最弱,接地时对比度最高,对比度过高会产生“鬼影”,必要时可以通过一个10K的电位器调整对比度。

第4脚:

RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:

R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和R/W同为低电平时可以写入指令或者显示地址,当RS低电平R/W为高电平时可以读忙信号,当RS为高电平R/W低电平时可以写入数据。

第6脚:

E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:

D0~D7为8位双向数据线。

第15脚:

背光源正极。

第16脚:

背光源负极[2]。

3LCD1602指令

1602液晶模块内部的控制器共有11条指令,如下表所示

 

表2液晶模块内部控制其指令

序号

指令

RS

R/W

D7

D6

D5

D4

D3

D2

D1

D0

1

清显示

0

0

0

0

0

0

0

0

0

1

2

光标返回

0

0

0

0

0

0

0

0

1

*

3

置输入模式

0

0

0

0

0

0

0

1

I/D

S

4

显示开/关控制

0

0

0

0

0

0

1

D

C

B

5

光标或字符移位

0

0

0

0

0

1

S/C

R/L

*

*

6

置功能

0

0

0

0

1

DL

N

F

*

*

7

置字符发生存贮器地址

0

0

0

1

字符发生存贮器地址

8

只数据存贮器地址

0

0

1

显示数据存贮器地址

9

读忙标志或地址

0

1

BF

计数器地址

10

写数到CGRAM或DDRAM

1

0

要写的数据内容

11

从CGRAM或DDRAM读数

1

1

读出的数据内容

指令说明:

指令1:

清显示,指令码01H,光标复位到地址00H位置;

指令2:

光标复位,光标返回到地址00H;

指令3:

光标和显示位置设置I/D,光标移动方向,高电平向右移,低电平向左移,S:

屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效;

指令4:

显示开关控制。

D:

控制整体的显示开与关,高电平表示开显示,低电平表示关显示。

C:

控制光标的开与关,高电平表示有光标,低电平表示无光标。

B:

控制光标是否闪烁,高电平闪烁,低电平不闪烁;

指令5:

光标或显示移位S/C,高电平时显示移动的文字,低电平时显示移动的光标;

指令6:

功能设置命令DL:

高电平时为4位总线,低电平时为8位总线。

N:

低电平时为单位行显示,高电平时为双行显示。

F:

低电平时显示5*7的点阵字符,高电平时显示5*10的显示字符。

指令7:

字符发生器RAM地址设置;

指令8:

DDRAM地址设置;

指令9:

读忙信号和光标地址。

BF:

忙标志位,高电平表示忙,此时模块不能接收命令或数据,如果为低电平表示不忙[2]。

 

4LCD1602数字代码

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,其中阿拉伯数字的代码为:

代码数字

001100000

001100011

001100102

001100113

001101004

001101015

001101106

001101117

001110008

001110019

(四)设计原理图

根据设计要求画出原理图:

电路图中的扬声器也就是LS1在这个系统中起到了读出按键的数值及拨号与接听的传递功能

图2.4设计原理图

三分析与编程

(一)系统流程图

图3.1为系统总流程图。

首先系统进入初始化,系统开始运行,当检测键盘没有按下时,则返回继续检测直至有键盘按下;当扫描到键盘按下时,读取按键值,并检测是否超过10位,若没有超过则送入液晶显示;若超过10位则系统重新初始化。

(二)LCD显示程序流程图

显示程序流程图如图3.2流程图分析:

首先对1602显示屏进行初始化,然后检查忙信号,若BF=0,则获得显示RAM的地址,写入相应的数据显示;若BF=1,则代表模块正在进行内部操作,不接受人和外部指令和数据,知道BF=0为止。

 

 

(三)设计程序

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineDelayNOP(){_nop_();_nop_();_nop_();_nop_();}

sbitBEEP=P1^0;

sbitLCD_RS=P2^0;

sbitLCD_RW=P2^1;

sbitLCD_EN=P2^2;

voidDelayMS(uintms);

bitLCD_Busy_Check();

voidLCD_Set_Position(ucharPosition);

voidWrite_LCD_command(ucharcmd);

voidWrite_LCD_data(uchardat);

//--标题字符串

charcodeTitle_Text[]={"--phoneCode--"};

//--键盘拔号与键盘符号映射表

ucharcodekey_Table[]={'1','2','3','4','5','6','7','8','9','*','0','#'};

//--键盘拔号数字缓冲

ucharDial_Code_Str[]={""};此处空格太少,会在屏幕上显示一个字符出来

ucharkeyNo=0xff;

inttCount=0;

//------------------------------------

//延时

//------------------------------------

voidDelayMS(uintx)

{

uchari;

while(x--)

for(i=0;i<120;i++)

;

}

//--------------------------------

//在LCD指定的行上显示字符串

//--------------------------------

voidDisplay_String(uchar*str,ucharLineNo)

{

uchark;

LCD_Set_Position(LineNo);

for(k=0;k<16;k++)

Write_LCD_data(str[k]);

}

//----------------------------------------------

//忙检查

//---------------------------------------------

bitLCD_Busy_Check()

{

bitLCD_Status;

LCD_RS=0;//寄存器选择

LCD_RW=1;//读状态寄存器

LCD_EN=1;//开始读

DelayMS

(1);

LCD_Status=(bit)(P0&0x80);

LCD_EN=0;

returnLCD_Status;

}

//---------------------------------------------------

//写LCD命令

//----------------------------------------------------

voidWrite_LCD_Command(ucharcmd)

{

while((LCD_Busy_Check()&0x80)==0x80);//忙等待

LCD_RS=0;//选取择命令寄存器

LCD_RW=0;//写

LCD_EN=0;

_nop_();

_nop_();

P0=cmd;

DelayNOP();

LCD_EN=1;

DelayNOP();

LCD_EN=0;

}

//-----------------------------------------

//发送数据

//----------------------------------------

voidWrite_LCD_Data(ucharStr)

{

while((LCD_Busy_Check()&0x80)==0x80);//忙等待

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

P0=Str;

DelayNOP();

LCD_EN=1;

DelayMS

(1);

LCD_EN=0;

}

//-------------------------------------------------

//LCD初始化

//-------------------------------------------------

voidInitialize_LCD()

{

Write_LCD_Command(0x38);

DelayMS(5);

Write_LCD_Command(0x0C);//清屏

DelayMS(5);

Write_LCD_Command(0x06);//字符进入模式,屏幕不动,字符后移。

DelayMS(5);

Write_LCD_Command(0x01);//显示开,关光标。

DelayMS(5);

}

//--------------------------------------

//设置显示位置

//--------------------------------------

voidLCD_Set_Position(ucharPosition)

{

Write_LCD_Command(Position|0x80);

}

//-----------------------------------------------

//t0控制按键声音

//-----------------------------------------------

voidT0_INT()interrupt1

{

TH0=-600/256;

TL0=-600%256;

BEEP=~BEEP;

if(++tCount==200)

{

tCount=0;

TR0=0;

}

}

//-------------------------

//键盘扫描

//------------------------

//=============================================================

ucharGetkey()

{

uchari,j,k=0;

ucharkeyScanCode[]={0xef,0xdf,0xbf,0x7f};//键盘扫描码

ucharkeyCodeTable[]={0xee,0xed,0xeb,0xde,0xdd,0xdb,0xbe,0xbd,0xbb,0x7e,0x7d,0x7b};

P3=0x0f;

//扫描键盘获取按键序号

if(P3!

=0X0F)

{

for(i=0;i<4;i++)

{

P3=keyScanCode[i];

for(j=0;j<3;j++)

{

k=i*3+j;

if(P3==keyCodeTable[k])

returnk;

}

}

}

elsereturn0xff;

}

//-------------------------------

//main

//--------------------------------

voidmain()

{

uchari=0,j;

P0=P2=P1=0XFF;

IE=0X82;

TMOD=0X01;

Initialize_LCD();//LCD初始化

Display_String(Title_Text,0x00);//在第一行显示标题

while

(1)

{

keyNo=Getkey();//获取按键值

if(keyNo==0xff)

continue;//无按键时继续扫描

if(++i==12)//超过11位时清空

{

for(j=0;j<16;j++)

Dial_Code_Str[j]='';

i=0;

}

Dial_Code_Str[i]=key_Table[keyNo];//将待显示字符放入待显示的拔号串中

Display_String(Dial_Code_Str,0x40);//在第二行显示号码

TR0=1;//T0中断控制按键声音

while(Getkey()!

=0xff);//等待按键释放

}

}

四仿真

仿真图根据电路原理,在Proteus软件中绘制出,检查无误后导入程序运行,,观察仿真结果是否准确的达到所预期的效果,如果没有达到,则分析原因,找出错误,直至达到预期效果。

设计仿真图如下图:

图4仿真图

LCD1602显示按键值,当按键超过11位时,前11位按键值全部清零,重新显示按键值。

五在实现过程中遇到的问题及排除措施

本次设计中,在单片机最小系统初始设计时,电容和晶振选择不合理,导致无法起振【能否起振及是否失真都与放大倍数相关,放大倍数与负反馈相关,负反馈越强放大倍数越低。

放大倍数大于3就会有失真,远大于3时,就输出近似方波,小于3时,不能起振。

所以最好有自动增益控制电路】。

通过查阅资料,多次实验,确定了合适的电容与晶振。

在开始设计电路时,P0口与显示屏相连时未考虑到添加上拉电阻,显示屏无法显示按键值,添加上拉电阻后【注:

电路叠加定理和诺顿定理就可以求出R了将VCC和上拉电阻看成恒流输出,上拉电流就是VCC/R了实际的选择还要考虑器件拉入电流的能力】,显示正常。

六设计心得体会

通过本次设计,进一步加深了对51单片机的理解,熟悉了Proteus环境中的ISIS模块原理图绘制,掌握了仿真的基本方法和C51编程语言。

对按键扫描输入系统和LCD1602显示系统的工作原理及编程方法有了更进一步的了解。

在设计过程当中,通过查阅资料等形式能培养个人分析、解决问题的能力。

七参考文献

[1]张迎新等,单片机初级教程.北京:

北京航空航天大学出版社,2000

[2]李清照,单片机原理及接口技术.北京:

北京航空航天大学出版社,1999

[3]王静霞等,单片机应用技术:

C语言版.北京:

电子工业出版社,2009

[4]胡汉才,单片机原理及接口技术.北京:

清华大学出版社,1996

[5]江力等,单片机原理及应用技术.北京:

清华大学出版社,2006

[6]万福君等,单片微机原理系统设计与开发应用.合肥:

中国科学技术大学出版社,2001

[7]付家才等,单片机控制工程实践技术.北京:

化学工业出版社,2004

[8]何立民,单片机高级教程.北京:

北京航空航天大学出版社,2000

[9]刘守义等,单片机应用技术.西安:

西安电子科技大学出版社,2002

[10]李群芳等,单片机原理、接口及应用.北京:

清华大学出版社,2005

[11]求是科技,单片机:

典型模块设计实例导航.北京:

人民邮电出版社,2005

[12]吴金戌等,8051单片机实践与应用.北京:

清华大学出版社,2002

[13]张友德等,单片微型机原理、应用与实验.上海:

复旦大学出版社,2001

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1