STM32液晶屏初始化教程(LCD1602-2)

HD44780的指令集及其设置说明

共11条指令:

  1. 清屏指令


    指令功能 指令编码 执行时间/ms
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    清屏 0 0 0 0 0 0 0 0 0 1 1.64

    功能:

    1. 清除液晶屏,即将DDRAM的所有内容都写为“空”的ASCII的20H;
    2. 光标归位,即将光标撤回液晶屏的左上方;
    3. 将地址计数器(AC)的值设置为0。
  2. 光标归位指令


    指令功能 指令编码 执行代码时间/ms
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    光标归位 0 0 0 0 0 0 0 0 1 X 1.64

    功能:

    1. 设置光标至显示器左上方;

    2. 把地址计数器(AC)的值设置为0;

    3. 保持DDRAM的内容不变。

  3. 进入模式设置指令


    指令功能 指令编码 执行代码时间/us
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    进入模式设置 0 0 0 0 0 0 0 1 I/D S 40

    功能:设定每次写入1为数据后光标的移动方向,并且设定每次写入的一个字符是否移动。参数设定情况如下:

    位名 设置
    I/D 0=写入新数据后光标左移 1=写入新数据后光标右移
    S 0=写入行数据后显示屏不移动 1=写入新数据后显示屏整体右移1个字符
  4. 显示开关控制指令


    指令功能 指令编码 执行代码时间/us
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    显示开关控制 0 0 0 0 0 0 1 D C B 40

    功能:控制显示器开/关,光标显示/关闭以及光标是否闪烁。参数设定的情况如下:

    位名 设置
    D 0=显示功能关 1=显示功能开
    C 0=无光标 1=有光标
    B 0=光标闪烁 1=光标不闪烁
  5. 设定显示屏或光标移动方向指令


    指令功能 指令编码 执行代码时间/us
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    设定显示屏或光标移动方向 0 0 0 0 0 1 S/C

    R/L

    X X 40

    功能:使光标位移或使整个显示屏位移。参数设定的情况如下:

    S/C R/L 设定情况
    0 0 光标左移1格,且AC值减1
    0 1 光标右移1格,且AC值加1
    1 0 显示屏上字符全部左移一格,但光标不动
    1 1 显示屏上字符全部右移一格,但光标不动
  6. 功能设定指令


    指令功能 指令编码 执行代码时间/us
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    功能设定 0 0 0 0 1 DL N F X X 40

    功能:设定数据总线位数,显示的行数及字型。参数设定的情况如下:

    位名 设置
    DL 0=数据总线位4位 1=数据总线位8位
    N 0=显示1行 1=显示2行
    F 0=5*7点阵/每字符 1=5*10点阵/每字符
  7. 设定CGRAM地址指令


    指令功能 指令编码 执行代码时间/us
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    设定CGRAM地址 0 0 0 1 CGRAM的地址(6位) 40

    功能:设定下一个要存入数据的CGRAM的地址

                DB5,DB4,DB3为字符号,也就是要显示该字符时要用到的字符地址。(000~111)(定义8个字符)

                DB2,DB1,DB0为行号。(000~111)(定义8个行)

  8. 设定DDRAM地址指令


    指令功能 指令编码 执行代码时间/us
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    设定DDRAM地址 0 0 1 CGRAM的地址(7位) 40

    功能:设定下一个要存入数据的DDRAM的地址。

  9. 读取忙信号或AC地址指令


    指令功能 指令编码 执行代码时间/us
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    读取忙碌信号或AC 0 0 0 0 1 DL N F X X 40

    功能:

    1. 读取忙碌信号BF的内容,当BF=1时,代表显示屏忙,暂时无法接收单片机送来的数据或指令;当BF=0时,显示屏可以接受单片机送来的数据或指令;

    2. 读取地址计数器(AC)的内容。

  10. 数据写入DDRAM或CGRAM指令


    指令功能 指令编码 执行代码时间/us
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    数据写入到DDRAM或CGRAM 1 0 要写入的数据D7~D0 40

    功能:

    1. 将字符码写入DDRAM,以使显示屏显示出相对应的字符;

    2. 将使用者自己设计的图形存入CGRAM。

      DB7,DB6,DB5可为任何数据,一般取“000”。
      DB4,DB3,DB2,DB1,DB0对应于每行5点的字模数据。

  11. 从CGRAM或DDRAM读出数据的指令


    指令功能 指令编码 执行代码时间/us
    RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
    读取忙碌信号或AC 1 1 要读出的数据D7~D0 40

    功能:读取DDRAM或CGRAM中的内容。

    基本操作时序
    读状态

    输入:RS=L,RW=H,E=H

    输出:DB0~DB7=状态字

    写指令

    输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码

    输出:无

    读数据

    输入:RS=H,RW=H,E=H

    输出:DB0~DB7=数据

    写数据

    输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据

    输出:无

LCD1602初始化代码

void LCD1602_Init(void)
{
	LCD1602_Write_Cmd(0x38); //2行显示,5*7点阵,8位数据线
	LCD1602_Write_Cmd(0x0C); //开显示,关闭光标
	LCD1602_Write_Cmd(0x06); //屏幕文字不动,光标向右移动
	LCD1602_Write_Cmd(0x01); //清屏
}

0x38:0011 1000 (功能6:功能设定指令) //2行显示,5*7点阵,8位数据线

0x0C:0000 1100 (功能4:显示开关控制指令) //开显示,关闭光标

0x06:0000 0110 (功能3:进入模式设置指令) //屏幕文字不动,光标向右移动

0x01:0000 0001 (功能1:清屏指令) //清屏

void LCD1602_Write_Cmd(unsigned char cmd)
{
	LCD1602_Wait_Ready();
	
	LCD1602_RS_Clr();
	LCD1602_RW_Clr();
	
	SET_LCD1602_D0((cmd>>0) & 0x1);
	SET_LCD1602_D1((cmd>>1) & 0x1);
	SET_LCD1602_D2((cmd>>2) & 0x1);
	SET_LCD1602_D3((cmd>>3) & 0x1);
	SET_LCD1602_D4((cmd>>4) & 0x1);
	SET_LCD1602_D5((cmd>>5) & 0x1);
	SET_LCD1602_D6((cmd>>6) & 0x1);
	SET_LCD1602_D7((cmd>>7) & 0x1);
		
	LCD1602_EN_Set();
	LCD1602_EN_Clr();
}
void LCD1602_Wait_Ready(void)
{
	//首先将PC13改为输入
	GPIOC->CRH &= 0xFF0FFFFF;
	GPIOC->CRH |= 4<<20;
	
	LCD1602_RS_Clr();
	LCD1602_RW_Set();
	LCD1602_EN_Set();
	Delay_us(5000);
	
	while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 0x1);
	
	//LCD1602就绪后,再将PC13(DB7)改为输出
	GPIOC->CRH &= 0xFF0FFFFF;
	GPIOC->CRH |= 3<<20;
	
	LCD1602_EN_Clr();
}
#define LCD1602_RS_Set()	GPIO_SetBits(GPIOA, GPIO_Pin_5)
#define LCD1602_RS_Clr()	GPIO_ResetBits(GPIOA, GPIO_Pin_5)

#define LCD1602_RW_Set()	GPIO_SetBits(GPIOB, GPIO_Pin_12)
#define LCD1602_RW_Clr()	GPIO_ResetBits(GPIOB, GPIO_Pin_12)

#define LCD1602_EN_Set()	GPIO_SetBits(GPIOB, GPIO_Pin_13)
#define LCD1602_EN_Clr()	GPIO_ResetBits(GPIOB, GPIO_Pin_13)

#define SET_LCD1602_D0(a)	GPIO_WriteBit(GPIOB, GPIO_Pin_14, (BitAction)(a))
#define SET_LCD1602_D1(a)	GPIO_WriteBit(GPIOB, GPIO_Pin_15, (BitAction)(a))
#define SET_LCD1602_D2(a)	GPIO_WriteBit(GPIOA, GPIO_Pin_9, (BitAction)(a))
#define SET_LCD1602_D3(a)	GPIO_WriteBit(GPIOA, GPIO_Pin_10, (BitAction)(a))
#define SET_LCD1602_D4(a)	GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(a))
#define SET_LCD1602_D5(a)	GPIO_WriteBit(GPIOA, GPIO_Pin_12, (BitAction)(a))
#define SET_LCD1602_D6(a)	GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(a))
#define SET_LCD1602_D7(a)	GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(a))

作者:WWester爱吃三文鱼

物联沃分享整理
物联沃-IOTWORD物联网 » STM32液晶屏初始化教程(LCD1602-2)

发表评论