单片机课程设计--1602LCD显示电话拨号键盘按键琼州学院电子信息工程学院课程设计报告课程名称: 单片机课程设计设计题目:1602LCD显示电话拨号键盘按键专业: 通信工程班级: 2010级1班学生姓名: ***学号:起止日期: 2013年4月,2013年6月指导教师:指导教师评语: 最终成绩: 指导教师签名: 年月日成项目权重成绩绩1、设计过程中的学习态度 0.2 评2、课程设计的质量及答辩 0.5 定 3、设计报告书规范程度 0.34、总成绩目录1.设计目的 ..................................................... 2 2.设计要求 ..................................................... 2 3.设计方案 .. (2)3.1单片机最小系统 (2)3.2输入按键系统 (3)3.3 1602LCD显示系统 (3)3.4设计原理图 ............................................... 64.分析与编程 (7)4.1系统流程图 (7)4.2 LCD显示程序流程图 (7)4.3 设计程序 ................................................ 85.仿真 ........................................................ 146.在实现过程中遇到的问题及排除措施 ............................ 157.设计心得体会 ................................................ 16 参考文献 (16)1602LCD显示电话拨号键盘按键摘要:本设计以89C51单片机为核心,设计1602LCD显示电话拨号键盘按键,对按键输入系统,LCD1602的引脚功能、控制命令、读写时序进行了分析。
在keil 中进行编程,在proteus软件中进行了仿真。
关键字:单片机;1602LCD显示屏;键盘系统11.设计目的单片机原理与应用课程设计是单片机原理与应用专业课程的实践性教学环节,通过该教学环节,要求达到以下目的:(1)培养学生工程设计能力和综合分析问题、解决问题的能力,能根据工程需求,利用Proteus环境等构建原理图,利用Keil等环境编写调试单片机功能程序,最终构建工程的硬件平台和软件平台,达到预定功能,实现单片机具体应用;(2)熟悉在Proteus环境中的ISIS模块原理图绘制,掌握仿真的基本方法;(3)掌握Keil C编程及C51编程语言和汇编语言开发;(4)掌握单片机片内资源编程,能熟练应用相关片内资源合理配置相关寄存器;(5)实现由原理图到PCB图,硬件与软件结合实现功能,提高电子电路的设计和实验能力,为以后从事生产和科研工作打下一定的基础。
2.设计要求要求以51单片机作为微控制器,通过1602LCD显示屏显示拨号键盘,键值包括数字0-9及“*”“#”等12个按键。
数字显示为逐个显示方式,最多显示11位。
3.设计方案首先构建单片机最小系统、键盘输入系统及1602LCD显示系统。
通过单片机扫面键值,将其结果输入到1602LCD显示屏上。
3.1单片机最小系统[1]单片机最小系统主要由电源、复位、震荡电路以及扩展部分等部分组成。
2图3.1单片机最小系统3.2输入按键系统独立的键盘与单片机相连时,每个按键都需要单片机的一个I/O口,若按键较多时,占用的I/O口资源就会过多,为此就引入了矩阵键盘。
本次设计共有0~9、#、*共12个按键,因此引入3*4的矩阵键盘,共需要7个I/O口,7条线分别与单片机P3口相连。
图3.2输入按键系统3.3 1602LCD显示系统AT89C51单片机,P0口输出时,必须使用上拉电阻,提高电压,否则无法得到输出结果。
3图3.3 1602 LCD显示系统3.31 LCD1602原件显示原理图3.3 1LCD1602原件图表1 LCD1602引脚功能编号符号引脚说明编号符号引脚说明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 背光源负极3.32 LCD1602引脚说明第1脚:VSS为地电源;4第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脚:背光源正极。
[2]第16脚:背光源负极。
3.33 LCD1602指令1602液晶模块内部的控制器共有11条指令,如下表所示表2液晶模块内部控制其指令RS R/D7 D6 D5 D4 D3 D2 D1 D0 序指令W 号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 1 0 写数到CGRAM或DDRAM 要写的数据内容11 1 1 从CGRAM或DDRAM读数读出的数据内容指令说明:指令1:清显示,指令码01H,光标复位到地址00H位置;指令2:光标复位,光标返回到地址00H;指令3:光标和显示位置设置I/D,光标移动方向,高电平向右移,低电平向左移,S:屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效; 指令4: 显示开关控制。
D:控制整体的显示开与关,高电平表示开显示,低电平表示5关显示。
C:控制光标的开与关,高电平表示有光标,低电平表示无光标。
B:控制光标是否闪烁,高电平闪烁,低电平不闪烁;指令5:光标或显示移位S/C,高电平时显示移动的文字,低电平时显示移动的光标; 指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线。
N:低电平时为单位行显示,高电平时为双行显示。
F:低电平时显示5*7的点阵字符,高电平时显示5*10的显示字符。
指令7:字符发生器RAM地址设置;指令8:DDRAM地址设置;指令9:读忙信号和光标地址。
BF:忙标志位,高电平表示忙,此时模块不能接收命令[2]或数据,如果为低电平表示不忙。
3.34 LCD1602数字代码1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,其中阿拉伯数字的代码为:代码数字00110000 000110001 100110010 200110011 300110100 400110101 500110110 600110111 700111000 800111001 93.4设计原理图根据设计要求画出原理图6图3.4设计原理图4. 分析与编程4.1系统流程图图4.1为系统总流程图。
首先系统进入初始化,系统开始运行,当检测键盘没有按下时,则返回继续检测直至有键盘按下;当扫描到键盘按下时,读取按键值,并检测是否超过10位,若没有超过则送入液晶显示;若超过10位则系统重新初始化。
4.2 LCD显示程序流程图显示程序流程图如图4.2。
流程图分析:首先对1602显示屏进行初始化,然后检查忙信号,若BF=0,则获得显示RAM的地址,写入相应的数据显示;若BF=1,则代表模块正在进行内部操作,不接受人和外部指令和数据,知道BF=0为止。
7开始开始对1602初始化系统初始化写入显示设置命令键盘扫描延时N 设置按键检查忙信号是否按下 N YBF=0? 读取按键 N Y按键是否 Y 获得显示RAM地址超过11位 N 获得延时显示写入相应数据图4.1 系统流程图数据显示完毕,Y结束4.2 LCD显示程序流程图4.3 设计程序#include<reg51.h>#include<intrins.h>#define uchar unsigned char #define uint unsigned int #define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit BEEP=P1^0;8sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_EN=P2^2;void DelayMS(uint ms);bit LCD_Busy_Check();void LCD_Set_Position(uchar Position); void Write_LCD_command(uchar cmd); void Write_LCD_data(uchar dat); //--标题字符串char code Title_Text[]={"-- phone Code --"}; //--键盘拔号与键盘符号映射表uchar codekey_Table[]={'1','2','3','4','5','6','7','8','9','*','0','#'};//--键盘拔号数字缓冲uchar Dial_Code_Str[]={" "}; //此处空格太少,会在屏幕上显示一个字符出来uchar keyNo=0xff;int tCount=0;//------------------------------------ //延时//------------------------------------ void DelayMS(uint x){uchar i;while(x--)for(i=0;i<120;i++);}//-------------------------------- //在LCD指定的行上显示字符串//--------------------------------9void Display_String(uchar *str,uchar LineNo) {uchar k;LCD_Set_Position(LineNo);for(k=0;k<16;k++)Write_LCD_data(str[k]);}//---------------------------------------------- //忙检查//--------------------------------------------- bit LCD_Busy_Check() {bit LCD_Status;LCD_RS=0;//寄存器选择LCD_RW=1;//读状态寄存器LCD_EN=1;//开始读DelayMS(1);LCD_Status=(bit)(P0&0x80) ;LCD_EN=0;return LCD_Status;}//---------------------------------------------------//写LCD命令//----------------------------------------------------void Write_LCD_Command(uchar cmd) {while((LCD_Busy_Check()&0x80)==0x80);//忙等待LCD_RS=0;//选取择命令寄存器LCD_RW=0;//写10LCD_EN=0;_nop_();_nop_();P0=cmd;DelayNOP();LCD_EN=1;DelayNOP();LCD_EN=0;}//-----------------------------------------//发送数据//----------------------------------------void Write_LCD_Data(uchar Str) {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初始化//------------------------------------------------- void Initialize_LCD(){Write_LCD_Command(0x38);11DelayMS(5);Write_LCD_Command(0x0C);//清屏DelayMS(5);Write_LCD_Command(0x06);//字符进入模式,屏幕不动,字符后移。