LCD1602显示屏

LCD1602显示

  • 概述

    LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 16×02 即 32 字符(16列两行)

    在这里插入图片描述

  • 引脚说明

    在这里插入图片描述

    //电源
    VSS -- GND
    VDD -- 5V
    //对比度
    VO -- GND
    //控制线
    RS -- P1.0
    RW -- P1.1
    E -- P1.4
    //背光灯
    A -- 5V
    K -- GDN
    //数据
    D0到D7 -- P0.0到P0.7
    

    在这里插入图片描述

  • 开发逻辑

    在这里插入图片描述

  • 在哪里显示

    在这里插入图片描述

    例如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位 D7 恒定为高电平 1 所以实际写入的数据应该是 01000000B(40H) +10000000B(80H)=11000000B(C0H)

  • 显示什么

    在这里插入图片描述

  • 读写操作时序

    1. 读操作时序

      在这里插入图片描述

    2. 写操作时序

      在这里插入图片描述

    3. 数序参数

      在这里插入图片描述

  • 显示一个字符

    #include "reg52.h"
    #include "intrins.h"
    
    #define BUFF P0
    /*
    控制线接口:
    RS -- P1.0
    RW -- P1.1
    E -- P1.4
    */
    sbit RS = P1^0;
    sbit RW = P1^1;
    sbit EN = P1^4;
    void check_busy()//每次写指令,读/写数据操作均需要检测忙信号
    {
    	char tmp = 0x80;
    	BUFF = 0x80;
    	while(tmp & 0x80){
    		RS = 0;
    		RW = 1;
    		EN = 0;
    		_nop_();
    		EN = 1;
    		_nop_();
    		tmp = BUFF;
    		_nop_();
    		_nop_();
    		EN = 0;
    		_nop_();
    	}
    }
    
    void Write_cmd(char cmd)//写指令
    {
    	check_busy();
    	RS = 0;
    	RW = 0;
    	
    	EN = 0;
    	_nop_();
    	BUFF = cmd;
    	_nop_();
    	EN = 1;
    	_nop_();
    	_nop_();
    	EN = 0;
    	_nop_();
    }
    void Write_data(char _data)//写数据
    {
    	check_busy();
    	RS = 1;
    	RW = 0;
    	
    	EN = 0;
    	_nop_();
    	BUFF = _data;
    	_nop_();
    	EN = 1;
    	_nop_();
    	_nop_();
    	EN = 0;
    	_nop_();
    }
    void Delay15ms()		//@11.0592MHz
    {
    	unsigned char i, j;
    
    	i = 27;
    	j = 226;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    void Delay5ms()		//@11.0592MHz
    {
    	unsigned char i, j;
    
    	i = 9;
    	j = 244;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    
    void LCD1602_init()//LCD1602初始化
    {
    	//(1)延时 15ms
    	Delay15ms();
    	//(2)写指令 38H(不检测忙信号)
    	Write_cmd(0x38);
    	//(3)延时 5ms
    	Delay5ms();
    	//(4)以后每次写指令,读/写数据操作均需要检测忙信号
    	//(5)写指令 38H:显示模式设置
    	Write_cmd(0x38);
    	//(6)写指令 08H:显示关闭
    	Write_cmd(0x08);
    	//(7)写指令 01H:显示清屏
    	Write_cmd(0x01);
    	//(8)写指令 06H:显示光标移动设置
    	Write_cmd(0x06);
    	//(9)写指令 0CH:显示开及光标设置
    	Write_cmd(0x0c);
    
    }
    void main()
    {
    	char cmd = 0x80 + 0x05;//第一行第五个位置
    	char _data = 'C';
    	LCD1602_init();
    	Write_cmd(cmd);
    	Write_data(_data);
    }
    
  • 显示一行字符

    #include "reg52.h"
    #include "intrins.h"
    
    #define BUFF P0
    /*
    控制线接口:
    RS -- P1.0
    RW -- P1.1
    E -- P1.4
    */
    sbit RS = P1^0;
    sbit RW = P1^1;
    sbit EN = P1^4;
    void check_busy()//每次写指令,读/写数据操作均需要检测忙信号
    {
    	char tmp = 0x80;
    	BUFF = 0x80;
    	while(tmp & 0x80){
    		RS = 0;
    		RW = 1;
    		EN = 0;
    		_nop_();
    		EN = 1;
    		_nop_();
    		tmp = BUFF;
    		_nop_();
    		_nop_();
    		EN = 0;
    		_nop_();
    	}
    }
    
    void Write_cmd(char cmd)//写指令
    {
    	check_busy();
    	RS = 0;
    	RW = 0;
    	
    	EN = 0;
    	_nop_();
    	BUFF = cmd;
    	_nop_();
    	EN = 1;
    	_nop_();
    	_nop_();
    	EN = 0;
    	_nop_();
    }
    void Write_data(char _data)//写数据
    {
    	check_busy();
    	RS = 1;
    	RW = 0;
    	
    	EN = 0;
    	_nop_();
    	BUFF = _data;
    	_nop_();
    	EN = 1;
    	_nop_();
    	_nop_();
    	EN = 0;
    	_nop_();
    }
    void Delay15ms()		//@11.0592MHz
    {
    	unsigned char i, j;
    
    	i = 27;
    	j = 226;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    void Delay5ms()		//@11.0592MHz
    {
    	unsigned char i, j;
    
    	i = 9;
    	j = 244;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    
    void LCD1602_init()//模块初始化
    {
    	//(1)延时 15ms
    	Delay15ms();
    	//(2)写指令 38H(不检测忙信号)
    	Write_cmd(0x38);
    	//(3)延时 5ms
    	Delay5ms();
    	//(4)以后每次写指令,读/写数据操作均需要检测忙信号
    	//(5)写指令 38H:显示模式设置
    	Write_cmd(0x38);
    	//(6)写指令 08H:显示关闭
    	Write_cmd(0x08);
    	//(7)写指令 01H:显示清屏
    	Write_cmd(0x01);
    	//(8)写指令 06H:显示光标移动设置
    	Write_cmd(0x06);
    	//(9)写指令 0CH:显示开及光标设置
    	Write_cmd(0x0c);
    
    }
    void LCD1602_print_line(char line,char col,char *string)//写入一行数据
    {
    	switch(line){//switch选择那一行
    		case 1:
    			Write_cmd(0x80+col);//col 决定从哪个地方开始
    			while(*string){
    				Write_data(*string);
    				string++;
    			}
    			break;
    		case 2:
    			Write_cmd(0x80+0x40+col);
    			while(*string){
    				Write_data(*string);
    				string++;
    			}
    			break;
    	}
    }
    void main()
    {
    	LCD1602_init();
    	LCD1602_print_line(1,0,"hello world");
    	LCD1602_print_line(2,0,"to be number one");
    }
    

相关推荐

  1. LCD1602动态显示

    2024-04-03 20:52:02       36 阅读
  2. LCD1602移动显示

    2024-04-03 20:52:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-03 20:52:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-03 20:52:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-03 20:52:02       82 阅读
  4. Python语言-面向对象

    2024-04-03 20:52:02       91 阅读

热门阅读

  1. 为什么重写 equals 时,必须重写 hashCode?

    2024-04-03 20:52:02       34 阅读
  2. js绑定点击事件的方法

    2024-04-03 20:52:02       30 阅读
  3. 面试算法-128-单词拆分 II

    2024-04-03 20:52:02       41 阅读
  4. RabbitMQ

    2024-04-03 20:52:02       32 阅读
  5. Ceph常用命令总结

    2024-04-03 20:52:02       35 阅读