C51单片机实验-LCD1602显示实验

实验目的:

  1. 掌握LCD1602显示控制方法;
  2. 掌握利用Proteus进行单片机控制系统的仿真及调试方法。

任务:

  1. 根据要求编写程序,并写出原理性注释;
  2. 将检查程序运行的结果,分析一下是否正确;
  3. 完成所建工程的仿真及调试。

实验内容

设计51单片并行口实现LCD1602的显示控制,要求在Protues中设计接口电路图,并编程实现在LCD1602上显示出双行字符(显示具体内容自定)。

Proteus 原理图及运行仿真结果

C51单片机实验-LCD1602显示实验_第1张图片

代码

#include 
typedef unsigned char uchar;
typedef unsigned int uint;

#define out P0
sbit E=P1^5;
sbit RW=P1^6;
sbit RS=P1^7;

void delay(uint j); //延时
void delay_ms(uchar t); //ms级延时
void check_busy(); //查忙
void write_command(uchar com); //写命令
void write_data(uchar wdata); //写数据
void lcd_initial(); //LCD初始化
void string(uchar address,uchar *s); //将字符串显示在LCD的指定位置

void main(){
	lcd_initial();
	while(1){
		string(0x80,"Hello world!"); //从第一行第一处开始显示(80H + 00H)
		string(0xc0,"Welcome ZZULI!"); //从第二行第一处开始显示(80H + 40H)
		delay(100);
	}
}

void delay(uint j){
	uchar i = 60;
	for(; j>0; j--){
		while(--i);
		i = 59;
		while(--i);
		i = 60;
	}
}

void delay_ms(uchar t){
	uchar j;
	for(;t!=0; t--){
	  for (j=0;j<225;j++);
  }
}

void check_busy(){
	uchar flag=0xff;
	do{
		E=0;
		RS=0;
		RW=1;
		E=1; //E=1时可以读LCD状态
		flag=out;
	}while(flag&0x80); //检查BF位
	E=0;
}

void write_command(uchar com){
	check_busy();
	E=0;
	RS=0;
	RW=0;
	out=com;
	delay_ms(5);
	E=1; //当上升沿到来时,写入状态字
	delay_ms(5);
	E=0;
	delay(1);
}

void write_data(uchar wdata){
	check_busy();
	E=0;
	RS=1;
	RW=0;
	out=wdata;
	delay_ms(5);
	E=1; //当上升沿到来时,写入数据
	delay_ms(5);
	E=0;
	delay(1);
}

void lcd_initial(){
	write_command(0x38);//8位总线,双行显示,5X7的点阵字符
	write_command(0x0C);//开整体显示,光标关,无闪烁
	write_command(0x06);//光标右移
	write_command(0x01);//清屏
	delay(1);
}

void string(uchar address,uchar *s){
	write_command(address); //找显示数据RAM地址
	while(*s>0) write_data(*s++); //循环写入数据
}

你可能感兴趣的:(C51单片机)