基于HD44780的LCD的实现
—4Bit 接口
前言
HD44780是点阵式的LCD控制器,它能显示英文字母、阿拉伯数字、日文片假名和一般性的符号。微处理器可以使用2种方式来驱动他4-bit或者8-bit。
下面是HD44780的组成图(xiaobin)
网上有许多基于8-bit的文章,我们主要介绍的是另外的一种实现方式:4-bit
一、简介
针对上面的组成图,我们做一简单介绍。详细信息请参见HD44780的数据手册。
1.1 寄存器
HD44780有两个8位寄存器,他们分别是指令寄存器(IR)和数据寄存器(DR)。
IR寄存器存储指令代码,比如显示清除、光标移动、显示数据RAM(DDRAM)和字符生成器RAM(CGRAM)的地址信息。对于MPU来说IR寄存器是只写的。
DR把暂存数据写入DDRAM或CGRAM以及从DDRAM或CGRAM中读取暂存数据。MPU写入数据到DR时,DR会使用内部操作自动写入数据到DDRAM或CGRAM。DR已同样的方式从DDRAM或CGRAM中读取数据。当写入的地址信息是指向IR的时候,数据是DR从DDRAM或CGRAM中读取的。也就是说,我们无论是发送命令,还是发送数据,存储这些信息的是DDRAM或CGRAM。
我们使用的外部接口RS就是来做选择寄存器的。是使用IR,还是DR。这决定了,我们发送过去的信息是命令还是显示数据。
1.2 忙标志(BF)
当BF=1时,表明HD44780在进行内部操作。BF的输出在DB7口。
1.3 地址累加器(AC)
当一个指令把地址信息写到IR,则IR发送这个信息给AC。
之后写到(或读)DDRAM或CGRAM,AC是自动累加1的。AC的输出DB0至DB6
表1 寄存器选择(Register Selection)
RS | R/W | Operation |
0 | 0 | IR write as an internal operation(display clear, etc.) |
0 | 1 | Read busy flag(DB7) and address counter(DB0 to DB6) |
1 | 0 | DR write as an internal operation(DR to DDRAM or CGRAM) |
1 | 1 | DR read as an internal operation(DR to DDRAM or CGRAM to DR) |
二、程序实现
编写程序之前,我们先要知道HD44780的字符代码和字模。
图2: 基本字符代码和字模(ROM Code:A00)
图2: 扩展的字符代码和字模(ROM Code:A02)
程序流程:
HD44780 指令
Instruction | RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
Clear display | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Return home | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | - |
Entry mode set | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S |
Display on/off control | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B |
Cursor or display shift | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | - | - |
Function set | 0 | 0 | 0 | 0 | 1 | DL | N | F | - | - |
Set CGRAM address | 0 | 0 | 0 | 1 | CGRAM Address | |||||
Set DDRAM address | 0 | 0 | 1 | DDRAM Address | ||||||
Read busy flag & address | 0 | 1 | BF | DDRAM Address | ||||||
Write RAM | 1 | 0 | Write Data | |||||||
Read RAM | 1 | 1 | Read Data |
程序代码:(xiaobin演示之用)
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0x0C
ENDC
ORG 0x00
Begin
call LCD_Init
movlw 'H'
call LCD_Write
movlw 'e'
call LCD_Write
movlw 'l'
call LCD_Write
movlw 'l'
call LCD_Write
movlw 'o'
call LCD_Write
sleep
END
电路图: