一、实验目的与任务
实验目的:
1. 掌握LCD1602显示控制方法;
2. 掌握利用Proteus进行单片机控制系统的仿真及调试方法。
3. 掌握单片机开发板的使用。
任务:
- 根据要求编写程序,并写出原理性注释;
2. 将检查程序运行的结果,分析一下是否正确;
3. 完成所建工程的仿真及调试;
4. 将设计程序下载至开发板验证实验结果。
二、实验内容
设计51单片并行口实现LCD1602的显示控制,要求在Protues中设计接口电路图,并编程实现在LCD1602上显示出双行字符(显示具体内容自定)。
2)Proteus仿真:
实验步骤:
- 运行Proteus 开发环境,建立工程,新建原理图设计文件esimlab4.pdsprj,参考图一。
图一 LCD1602显示实验仿真图
- 主函数区:
#include <REGX51.H> #include "LCD1602.h" void main() { LCD1602_Init(); LCD1602_ShowString(1,2,"Hello world"); LCD1602_ShowString(2,1,"zzuli"); while(1) { } }
延时函数模块:
void Delay(unsigned int xms) { unsigned char i, j; while(xms--) { i = 2; j = 199; do { while (--j); } while (--i); } }
LCD1602模块:
#include <REGX51.H>
#include "Delay.h"
//引脚配置:
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
void LCD1602_WriteCommand(unsigned char command)//写命令
{
RS=0;
RW=0;
P0=command;
E=1;
Delay(2);
E=0;
Delay(1);
}
void LCD1602_WriteDate(unsigned char command )//写数据
{
RS=1;
RW=0;
P0=command;
E=1;
Delay(2);
E=0;
Delay(1);
}
void LCD1602_Init(void)//初始化函数
{
LCD1602_WriteCommand(0x01);//清屏
LCD1602_WriteCommand(0x06);//显示设置写完一个字符之后地址指针加一I/D=1,屏幕不移动S=0;
LCD1602_WriteCommand(0x0c);//屏幕整体显示开D=1,无光标控制位C=0,光标不闪烁B=0
LCD1602_WriteCommand(0x38);//数据传输有效长度为八位DL=1;两行显示N=1,5*7点阵字符F=0;
Delay(1);
}
/**
*@line起始行
*@list起始列
*/
void LCD1602_SetDDRAM(unsigned char line,unsigned char list)//设置DDRM的地址也就是将要显示字符的位置
{
if(line==1)
{
LCD1602_WriteCommand(0x80|(list-1));
}
else if(line==2)
{
LCD1602_WriteCommand(0x80|(list-1+0x40));
}
}
/**
*@line起始行
*@list起始列
*@*string字符串的首地址
*/
void LCD1602_ShowString(unsigned char line,unsigned char list,char *string)//字符串显示
{
unsigned char i;
LCD1602_SetDDRAM(line,list);//先设置DDRAM中将要显示字符的地址
for(i=0;string[i]!='\0';i++)
{
LCD1602_WriteDate(string[i]);
}
}
运行结果: