HD44780的指令集及其设置说明
共11条指令:
-
清屏指令
功能:指令功能 指令编码 执行时间/ms RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 清屏 0 0 0 0 0 0 0 0 0 1 1.64 - 清除液晶屏,即将DDRAM的所有内容都写为“空”的ASCII的20H;
- 光标归位,即将光标撤回液晶屏的左上方;
- 将地址计数器(AC)的值设置为0。
-
光标归位指令
指令功能 指令编码 执行代码时间/ms RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 光标归位 0 0 0 0 0 0 0 0 1 X 1.64 功能:
-
设置光标至显示器左上方;
-
把地址计数器(AC)的值设置为0;
-
保持DDRAM的内容不变。
-
-
进入模式设置指令
指令功能 指令编码 执行代码时间/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个字符 -
显示开关控制指令
指令功能 指令编码 执行代码时间/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=光标不闪烁 -
设定显示屏或光标移动方向指令
指令功能 指令编码 执行代码时间/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 显示屏上字符全部右移一格,但光标不动 -
功能设定指令
指令功能 指令编码 执行代码时间/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点阵/每字符 -
设定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个行)
-
设定DDRAM地址指令
指令功能 指令编码 执行代码时间/us RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 设定DDRAM地址 0 0 1 CGRAM的地址(7位) 40 功能:设定下一个要存入数据的DDRAM的地址。
-
读取忙信号或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 功能:
-
读取忙碌信号BF的内容,当BF=1时,代表显示屏忙,暂时无法接收单片机送来的数据或指令;当BF=0时,显示屏可以接受单片机送来的数据或指令;
-
读取地址计数器(AC)的内容。
-
-
数据写入DDRAM或CGRAM指令
指令功能 指令编码 执行代码时间/us RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 数据写入到DDRAM或CGRAM 1 0 要写入的数据D7~D0 40 功能:
-
将字符码写入DDRAM,以使显示屏显示出相对应的字符;
-
将使用者自己设计的图形存入CGRAM。
DB7,DB6,DB5可为任何数据,一般取“000”。
DB4,DB3,DB2,DB1,DB0对应于每行5点的字模数据。
-
-
从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))