LCD1602液晶显示屏

主函数

#include "1602.h"

void main(void)
{

InitLcd1602();//初始化 
LcdShowStr(0,0,"www.weimeng.com");//显示屏幕上的,第1格,第一排,显示字符串
LcdShowStr(2,1,"www.weimeng.com");//显示屏幕上的,第3格,第二排,显示字符串
}

LCD1602.c

#include<reg52.h>

#define LCD1602_DB  P0      //data bus 数据总线

sbit LCD1602_RS = P2^6;	  
sbit LCD1602_RW = P2^5;
sbit LCD1602_EN = P2^7;	  


/******************************底层时序***********************/
//CPU是否繁忙检测函数,判断bit7是0,允许执行;1禁止
void Read_Busy()           
{
    unsigned char sta;      
    LCD1602_DB = 0xff;		//P0端口(D0-D7)的引脚全部给0xff
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do
    {
        LCD1602_EN = 1;	   //使能
        sta = LCD1602_DB;  
        LCD1602_EN = 0;    //禁能,用完就拉低,释放总线
    }while(sta & 0x80);	   //(D7)STA7=0时允许下一步读写操作
}						   //(D7)STA7=1时禁止下一步读写操作

//写命令
void Lcd1602_Write_Cmd(unsigned char cmd)     
{
    Read_Busy();		 //繁忙检测
    LCD1602_RS = 0;		 //RS=0,是传输命令
    LCD1602_RW = 0;		 //RW=0,是写操作
    LCD1602_DB = cmd;	 //把我们要写的数值放到D0-D7上面去
    LCD1602_EN = 1;		 //使能(开始)
    LCD1602_EN = 0;    	 //禁能(结束)
}

//写数据
void Lcd1602_Write_Data(unsigned char dat)   
{
      Read_Busy();		 //繁忙检测
      LCD1602_RS = 1;	 //RS=1,是传输数据
      LCD1602_RW = 0;	 //RW=0,是写操作
      LCD1602_DB = dat;	 //把我们要写的数值放到D0-D7上面去
      LCD1602_EN = 1;	 //使能(开始)
      LCD1602_EN = 0;	 //禁能(结束)
}
/****************************************************************/

/******************************高层时序***********************/

//坐标显示
// y=0是上面那一排,y=1是下面那一排
void LcdSetCursor(unsigned char x,unsigned char y) //本函数用来设置当前光标位置,其实就是设置当前屏幕上用来编辑显示的位置 
{												   //其实就是内部的数据地址指针设置,其实就是RAM显存的偏移量
    unsigned char addr;
    if(y == 0) //上面一排(00到0F的格子)
        addr = 0x00 + x;
    else	   //下面一排(40到4F的格子)
        addr = 0x40 + x;
    
    Lcd1602_Write_Cmd(0x80+addr);  //效果一样的建议使用(addr|0x80),因为计算机计算位或的时候比计算加减法快
	//数据指针设置(指哪个格子写那格子)
}

//函数功能:从坐标(x,y)开始显示字符串str
//注意:这个函数不能跨行显示,超过的就会跑到后面看不见的格子里面去
//不过我们是可以封装出一个能够折行显示的函数的
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str)     //显示字符串
{
    LcdSetCursor(x,y);      //当前字符的坐标(调用了坐标显示函数)
							//X用于指哪一列格子,Y用于指向行
    while(*str != '\0')
    {
        Lcd1602_Write_Data(*str++);//写入内容对应的ASCLL码用于显示
    }
}

//初始化LCD,让它能开始正常工作
void InitLcd1602()              //1602初始化
{
    Lcd1602_Write_Cmd(0x38);    //显示模式设置:16x2显示,5*7点阵,8位数据接口
   	Lcd1602_Write_Cmd(0x08);	//关闭显示:显示开/关及光标指令设置
	Lcd1602_Write_Cmd(0x01);    //清屏 
    Lcd1602_Write_Cmd(0x06);	//显示光标移动设置 
								//全部设置好以后在打开显示防止花屏(虽然一瞬间的花屏无伤大雅)
	Lcd1602_Write_Cmd(0x0c);	//打开显示:显示开/关及光标指令设置 
}

LCD1602.h

#ifndef __1602_H__
#define __1602_H__

//只需要声明高层时序即可,而低层时序是不需要声明的。
//因为我们在头文件中声明这个函数,目的是为了让别的文件去包含这个头文件
//从而可以调用这个头文件中声明的函数,所以我们只需要声明1602.c中将来会被外部.c文件调用的那些函数即可。
//而1602.c中自己使用的内部函数将来也不会被外部.c文件调用,因此就不用声明了


//只需要声明高层时序即可,而低层时序是不需要声明的。
void LcdSetCursor(unsigned char x,unsigned char y);//坐标显示
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str); //显示字符串(调用了坐标显示函数)
void InitLcd1602();//初始化LCD1602

#endif

接线图:

 

1、1602屏幕=16x2=32个字符,总共有32个字符

 2、每个字符由35个像素组成

每个像素由一小块液晶控制

---------------------------------------------------------------------------------------------------------------------------------

液晶的控制原理:

不施加电压——液晶完全透明:0(透明)

施加电压——---液晶变不透明:1(不透明)

注意:通上电后LED背光板是一直发光的

黄的是背光板,灰的是液晶

组成:

1、背光板、液晶

2、控制液晶的芯片:HD44780U

---------------------------------------------------------------------------------------------------------------------------------

控制原理:

控制原理:CUP因为引脚不够所以一般不直接控制液晶,而是通过控制芯片HD44780U来控制液晶

HD44780U芯片的控制范围:总共有80个字节的显存(DRAM)

HD44780U芯片:

横向:控制显示40个字符

竖向:控制2个字符

LCD1601显示屏:

但是LCD1601显示屏上只能显示的范围:

第一排:00字符——0F字符(16个字符)

第二排:40字符——4F字符(16个字符)

控制LCD1601显示屏:永远有48个字节用不到

---------------------------------------------------------------------------------------------------------------------------------

 

液晶只能显示:ASCLL码上的数字、字母、符号

显示字符到对应的液晶块的代码原理:

第一步:CPU——发送显存地址——————————>HD44780U芯片——>LCD1602

第二步:CPU——在发送显示字符的ASCLL码————>HD44780U芯片——>LCD1602

---------------------------------------------------------------------------------------------------------------------------------

HD44780U芯片引脚分布图以及原理:

COM引脚控制:横向像素

SEG引脚控制 :纵向像素

COM控制一行:给低电压

SEG控制一竖:给高电压显示 或者 给低电压不显示

弊端:

这样子一次只能显示一行像素的。

要显示全部的像素如何解决呢?

解:逐行扫描的控制方式;

这样子我们人眼不就看到一直在扫描了吗?

不会的,这是通过人眼的视觉暂留原理,因为逐行扫描的频率很快,所以人眼看到的是静止的画面

---------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

 HD44780U芯片:

一共有40个SEG引脚,但是一个字符要用5个SEG引脚,这样子只能控制纵向的8个区域

问:另外纵向的8个区域的16个字符怎么控制?

 答:HD44780U芯片➕ HD44100H芯片是协助主控完成另外一半的显示任务的

 HD44100H芯片:

HD44780U芯片➕ HD44100H芯片=80个SEG引脚

                                     刚好可以控制LCD1602的所有像素也就是32个字符的显示

---------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------应用扩展-------------------------------------------------------------

 

在原来的基础上在加三块,在换一款能显示80字符的液晶显示屏,就能控制80个字符的显示了。

但这在多控制都不可能了,因为HD44780U芯片此时的显存已经满了

  • 4
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成长中的单片小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值