51单片机-LCD1602显示(无字库)

51单片机-LCD1602显示(无字库)

        • LCD1602液晶显示屏显示
          • 字符显示
          • 汉字的显示
        • LCD1602液晶显示屏引脚说明
        • LCD1602液晶显示屏11条控制指令
        • LCD1602读写时序图
        • LCD1602的RAM地址映射
        • LCD1602默认字库

LCD1602液晶显示屏显示
字符显示

       用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。

汉字的显示

       汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。

LCD1602液晶显示屏引脚说明
引脚 功能
VDD 电源正极
VSS 电源地
VL 液晶显示偏压
RS 数据/命令选择
R/W 读/写选择
E 使能信号
D0~D7 数据
BLA 背光源正极
BLK 背光源负极
  • VSS为地电源。
  • VDD接5V正电源。
  • VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 >* RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
  • R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
  • E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
  • D0~D7为8位双向数据线。
  • BLA背光源正极。
  • BLK背光源负极。
LCD1602液晶显示屏11条控制指令
指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0
清显示 0 0 0 0 0 0 0 0 0 1
光标返回 0 0 0 0 0 0 0 0 1 *
置输入模式 0 0 0 0 0 0 0 1 I/D S
显示开/关控制 0 0 0 0 0 0 1 D C B
光标或字符移位 0 0 0 0 0 1 S/C R/L * *
置功能 0 0 0 0 1 DL N F * *
置字符发生存贮器地址 0 0 0 1 字符发生存贮器地址
置数据存贮器地址 0 0 1 显示数据存贮器地址
读忙标志或地址 0 1 BF 计数器地址
写数到CGRAM或DDRAM 1 0 要写的数据内容
从CGRAM或DDRAM读数 1 1 读出的数据内容
  • 清显示,指令码01H,光标复位到地址00H位置。
  • 光标复位,光标返回到地址00H。
  • 光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
  • 显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
  • 光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。
  • 功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
  • 字符发生器RAM地址设置。
  • DDRAM地址设置。
  • 读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
  • 写数据。
  • 读数据。
LCD1602读写时序图

51单片机-LCD1602显示(无字库)_第1张图片
51单片机-LCD1602显示(无字库)_第2张图片

符号 时限
tc 400ns~
tpw 150ns~
tr,tf ~25ns
tsp1 30ns~
thd1 10ns~
td ~200ns
thd2 20ns~
tsp2 40ns~
LCD1602的RAM地址映射

51单片机-LCD1602显示(无字库)_第3张图片

LCD1602默认字库


       其中00H-07H用户可以自定义保存字符。通过字模软件或者自己编写字模代码写入字库中,后期可以调用使用。
下面为参考程序

/*delayms()函数自己补全*/
#define EN			P3^4
#define RS  			P3^5
#define RW  			P3^6
#define DATAPORT		P0

sbit En = EN;
sbit Rs = RS;
sbit Rw = RW;



void lcd_delayms(){						
	unsigned int x,y;
	for(x=1;x>0;x--)
	for(y=114;y>0;y--);
}




unsigned char StrLen(char *str){
	unsigned char num=0;
	unsigned char i=0;
	while(str[i++]!='\0')num++;
	return num;
}

unsigned char StrLen(char *str){
	unsigned char num=0;
	unsigned char i=0;
	while(str[i++]!='\0')num++;
	return num;
}

/*用于向LCD1602发送指令码*/
void Lcd1602_SendCode(unsigned char codes){
	Rs = 0;
	Rw = 0;
	En = 0;
	DATAPORT = codes;
	lcd_delayms();
	En = 1;
	lcd_delayms();
	En = 0;
	DATAPORT = 0XFF;
}

/*用于向LCD1602发送数据*/
void Lcd1602_SendData(unsigned char datas){
	Rs = 1;
	Rw = 0;
	En = 0;
	DATAPORT = datas;
lcd_delayms();
	En = 1;
lcd_delayms();
	En = 0;
	DATAPORT = 0XFF;
}

/*LCD1602初始化*/
void Lcd1602_Init(){
	 Lcd1602_SendCode(0x38);  //设置16*2显示,5*7点阵,8位数据接口
	 Lcd1602_SendCode(0x38);  //设置16*2显示,5*7点阵,8位数据接口
	 Lcd1602_SendCode(0x38);
	 Lcd1602_SendCode(0x08);  //只开显示
	 Lcd1602_SendCode(0x01);  //清屏,光标复位到地址00H位置
	
	/*光标右移|显示移动:0x07*/
	/*光标右移|显示不移动:0x06*/
	/*光标左移|显示移动:0x05*/
	/*光标左移|显示不移动:0x04*/
	 Lcd1602_SendCode(0x06);
	/*显示开|光标显示|光标闪烁:0x0f*/ 
	/*显示开|光标显示|光标不闪烁:0x0e*/ 
	/*显示开|光标不显示:0x0c*/ 
	 Lcd1602_SendCode(0x0c);
	
	
}

/*LCD1602单个字节显示在屏幕固定位置*/
//POSI为LCD1602屏幕位置,datas为显示字符
void Lcd1602_Byte_Show(unsigned char POSI,unsigned char datas){
	Lcd1602_Init();
	if(POSI>15)Lcd1602_SendCode(0x80|((0x80|(POSI-16))+0x40));
	else Lcd1602_SendCode(0x80|POSI);
	Lcd1602_SendData(datas);
}


/*LCD1602双行显示同一字符串*/
//str为显示字符串,time为单个字符出现的先后时间
void Lcd1602_String_Repeat(unsigned char *str,unsigned char time)
{   
		unsigned char x;		
		unsigned char num=StrLen(str);
		Lcd1602_Init();
    Lcd1602_SendCode(0x80);    
    for(x=0;x<num;x++)
    {
        Lcd1602_SendData(str[x]);
        delayms(time);
    }
    Lcd1602_SendCode(0x80+0x40);    
    for(x=0;x<num;x++)
    {
			Lcd1602_SendData(str[x]);
        delayms(time);
    }
}

/*LCD1602显示完整字符串(不超过两行)*/
//str为显示字符串,time为单个字符出现的先后时间
void Lcd1602_String_noRepeat(unsigned char *str,unsigned char time)
{   
		unsigned char x;		
		unsigned char num=StrLen(str);
		Lcd1602_Init();
    Lcd1602_SendCode(0x80);   
	    for(x=0;x<num;x++)
    {
        Lcd1602_SendData(str[x]);
        delayms(time);
    }
if(num>16){
    Lcd1602_SendCode(0x80+0x40);    
    for(x=16;x<num;x++)
    {
			Lcd1602_SendData(str[x]);
        delayms(time);
    }
}
else{
}	
}


/*LCD1602固定位置显示字符串*/
//colu_posi为显示的液晶行位(0:第一行,1:第二行),arr_posi为显示在单行的位置,str为显示字符串
void Lcd1602_String_FixPosi(bit colu_posi,unsigned char arr_posi,unsigned char *str)   //posi为十六进制
{																			//	colu_posi,0为第一行

		unsigned char x=0;
		unsigned char temp;	
		unsigned char str_num = StrLen(str);
		if(colu_posi)temp = (0x80|arr_posi)+0x40;
		 else temp = (0x80|arr_posi);
	
		Lcd1602_Init();
    Lcd1602_SendCode(temp);    
    for(;x<str_num;x++)Lcd1602_SendData(str[x]);
}

//sav_posi只能为0-7
void Down_To_Cgrom(unsigned char sav_posi,unsigned char *table){
	unsigned char m;
	sav_posi=sav_posi<<3;
Lcd1602_Init();
	 Lcd1602_SendCode(0x40|sav_posi);
	    for(m=0;m<8;m++)     //将table[]中的数据依次写入1602显示 
    { 
            Lcd1602_SendData(table[m]);           
    } 
}

您的点赞是我创造的动力 ^v^~~!

你可能感兴趣的:(51单片机,嵌入式)