c语言通过89C51驱动1602液晶显示(入门级别)

工具proteus,keil

步骤:

1.画好电路图

2.在指令模式下,设置好显示模式以及光标位置

3.在写数据模式下,向1602写入显示字符(1602只能显示数字和字符)

电路图

 电路图

#include <REGX51.H>

#define uchar unsigned char
#define uint unsigned int

void init();
void write_cmd(uchar cmd);
void write_data(uchar input);
void delay(uchar time_delay);

uchar table_wel[] = "hello world!";
uchar table_name[] = "i am gxf!";

sbit lcdrs = P3^0;
sbit lcdrw = P3^1;
sbit lcden = P3^2;	 

void main()
{
	uchar i = 0;	
	init(); 
	//write_data('g');
	for(;i < 12;i ++)
	{
		write_data(table_wel[i]);	
	}

	write_cmd(0xc0); 
	//	delay(5);
	for(i = 0; i < 9; i++)
	{
		write_data(table_name[i]);
	}
	while(1);
} 

void init()
{
	lcdrs = 0;//命令选择段
	lcdrw = 0;//写命令	
	write_cmd(0x38);
	write_cmd(0x0f);
	write_cmd(0x06);
	write_cmd(0x80);//从第一个位置开始显示
}
void write_cmd(uchar cmd)
{
	lcdrs = 0;//命令选择段
	lcdrw = 0;//写命令
	P2 = cmd;//设置显示模式
	delay(5);
	lcden = 1;
	delay(5);//延时5MS形成高脉冲
	lcden = 0;

}
void write_data(uchar input)
{
	lcdrs = 1;//写数据模式
	lcdrw = 0;//写数据
	P2 = input;//设置显示模式
	delay(5);
	lcden = 1;
	delay(5);//延时5MS形成高脉冲
	lcden = 0;

}

//软件延时
void delay(uchar time_delay)
{
	uint x,y;
	for(x = time_delay; x > 0; x --)
		for(y = 110; y > 0 ; y--);
}  

测试效果

result_test

说明:最开始我用的是P0口,控制rs,rw和en,但好像P0口要特殊一点。有点不行,换了P3口。还要研究一下P0口。

原文地址:https://www.cnblogs.com/huifeidewoniu/p/3415549.html