LCD1602液晶显示屏的字符显示

仿真图:

LCD1602液晶显示屏的字符显示_第1张图片

以下是代码:

//主函数

#include 		//包含单片机寄存器的头文件
#include "lcd1602.h"
#include "delay.h"



void main(void)
{
	
	lcd1602_init();      //LCD初始化
	
	while(1)
	{
		
		lcd1602_char(1,3,'f');
		lcd1602_string(2,1,"dshal");
	}
}

 LCD1602子程序:

//显示字符过程:读状态--写指令--写数据--自动显示

#include 
#include "delay.h"

#define uchar unsigned char        //无符号字符型类型数据
#define uint unsigned int 		//无符号整型数据
#define IODATA  P0                //D0-D7引脚

sbit RS=P2^0; 	//定义rs端口		寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; 	//定义rw端口		读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2; 	//定义en端口		使能信号位,将E位定义为P2.2引脚

/********************************************************************
* 功能 : 1602命令函数
***********************************************************************/
void lcd1602_write_cmd(uchar del)
{
	RS = 0;
		Delay30us();
	RW = 0;
		Delay30us();
	E = 0;
		Delay30us();
	
	IODATA  = del;
	
		Delay30us();
	E = 1;
		Delay30us();
	E = 0;                 //E 1->0,rs=0,rw=0, 将指令代码写入指令寄存器中
}

/********************************************************************
* 功能 : 1602写数据函数
***********************************************************************/

void lcd1602_write_data(uchar del)
{  
		Delay30us();
	RS = 1;
		Delay30us();
	RW = 0;
		Delay30us();
	E = 0;
		Delay30us();
	
	IODATA  = del;
	
		Delay30us();
	E = 1;
		Delay30us();
	E = 0;                   //E 1->0,rs=1,rw=0, 数据写入数据寄存器中
}

/********************************************************************
* 功能 : 1602初始化
***********************************************************************/
void lcd1602_init(void)
{
		Delay20ms();				//尚未工作无需判忙
	lcd1602_write_cmd(0x38);        //8位数据,双列,5*7字形
		Delay20ms();
	lcd1602_write_cmd(0x38);
		Delay20ms();
	lcd1602_write_cmd(0x38);		//连续设置3次确保设置成功
		

	lcd1602_write_cmd(0x0c);        //开启显示屏,关光标,光标不闪烁

	lcd1602_write_cmd(0x06);		//显示地址递增,即写一个数据后,显示位置右移一位
  
	lcd1602_write_cmd(0x01);        //清屏

}


/********************************************************************
* 功能 : 显示单个字符
***********************************************************************/
void lcd1602_char(uchar hang,uchar lie,char sign)
{
	uchar a;
	if(hang == 1)
	{
		a = 0x80;
	}
	if(hang == 2)
	{
		a = 0xc0;
	}
	a = a + lie - 1;

	lcd1602_write_cmd(a);      //置数据存贮器地址

	lcd1602_write_data(sign);
}

/********************************************************************
* 功能 :显示字符串
***********************************************************************/
void lcd1602_string(uchar hang,uchar lie,uchar *p)
{
	uchar a;
	if(hang == 1)
	{
		a = 0x80;
	}
	if(hang == 2)
	{
		a = 0xc0;
	}
	a = a + lie - 1;
	while(1)
	{

		lcd1602_write_cmd(a);

		lcd1602_write_data(*p);
		a++;	p++;   
		
		if((*p == '\0')||(a==0x90)||(a==0xd0)) //字符结束或每行最后一个字符
		{
			break;
		}
	}
}

 延时子程序:

#include 

/****延时30us****/
void Delay30us()                //@11.0592MHz-40
{
        unsigned char i;

        i = 11;
        while (--i);
}

/****延时20ms****/
void Delay20ms()                //@11.0592MHz
{
        unsigned char i, j;

        i = 36;
        j = 217;
        do
        {
                while (--j);
        } while (--i);
}

/****延时1s****/
void Delay1s()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        i = 8;
        j = 1;
        k = 243;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


/****延时zs****/
void delay(unsigned int z)
{																							   
    unsigned int i,j;
    for(i=z;i>0;i--)
    for(j=110;j>0;j--);
} 

      Proteus仿真中,LCD1602的第三引脚VEE可以不加电位器即可显示字符,如果实物中不能显示可以尝试加一个电位器。

说明:以上代码仅供参考。(有部分代码是在做作品的过程中网上找的,如有侵权,联系删除。)

你可能感兴趣的:(硬件工程)