1602LCD显示电话拨号键盘按键dwgWord格式.docx
《1602LCD显示电话拨号键盘按键dwgWord格式.docx》由会员分享,可在线阅读,更多相关《1602LCD显示电话拨号键盘按键dwgWord格式.docx(17页珍藏版)》请在冰豆网上搜索。
![1602LCD显示电话拨号键盘按键dwgWord格式.docx](https://file1.bdocx.com/fileroot1/2022-11/28/ee414a33-7d4e-4c04-b434-e45bddedfd49/ee414a33-7d4e-4c04-b434-e45bddedfd491.gif)
表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液晶模块内部控制其指令
序号
指令
清显示
光标返回
*
置输入模式
I/D
S
显示开/关控制
D
C
B
光标或字符移位
S/C
R/L
置功能
DL
N
F
置字符发生存贮器地址
字符发生存贮器地址
只数据存贮器地址
显示数据存贮器地址
读忙标志或地址
BF
计数器地址
写数到CGRAM或DDRAM
要写的数据内容
从CGRAM或DDRAM读数
读出的数据内容
指令说明:
指令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<
reg51.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineDelayNOP(){_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_RW=0;
//写
P0=cmd;
DelayNOP();
//-----------------------------------------
//发送数据
//----------------------------------------
voidWrite_LCD_Data(ucharStr)
LCD_RS=1;
P0=Str;
//-------------------------------------------------
//LCD初始化
voidInitialize_LCD()
Write_LCD_Command(0x38);
DelayMS(5);
Write_LCD_Command(0x0C);
//清屏
Write_LCD_Command(0x06);
//字符进入模式,屏幕不动,字符后移。
Write_LCD_Command(0x01);
//显示开,关光标。
//--------------------------------------
//设置显示位置
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)
4;
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位时清空
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]何立民,单片机高级教程.北京:
[9]刘守义等,单片机应用技术.西安:
西安电子科技大学出版社,2002
[10]李群芳等,单片机原理、接口及应用.北京:
清华大学出版社,2005
[11]求是科技,单片机:
典型模块设计实例导航.北京:
人民邮电出版社,2005
[12]吴金戌等,8051单片机实践与应用.北京:
清华大学出版社,2002
[13]张友德等,单片微型机原理、应用与实验.上海:
复旦大学出版社,2001