GDM1602是双行16字符并口驱动的液晶显示模块,接口简单,常用于设备仪器实现简单的交互。这次演示用GPIO命令驱动该模块。
硬件连接:
- VDD - 5V
- VSS - GND
- V0 - 控制对比度,为了演示直接接地
- RS - PA10
- RW - PA9
- E - PA8
- DB0 - PA0
- DB1 - PA1
- DB2 - PA2
- DB3 - PA3
- DB4 - PA4
- DB5 - PA5
- DB6 - PA6
- DB7 - PA7
需要注意的是因为模块5V供电,所以控制端口全部选择了5V兼容的PA口,为了提高8位总线控制效率,将数据线选用连续的低8位PA0~PA7。
Python的封装比较容易,就是读写两个动作,再根据手册寄存器初始化,写入屏幕数据。
import time
from mcush import *
s = Mcush.Mcush('/dev/ttyACM0')
DP = '0' # PA端口,用于并行控制
D0 = '0.0'
D1 = '0.1'
D2 = '0.2'
D3 = '0.3'
D4 = '0.4'
D5 = '0.5'
D6 = '0.6'
D7 = '0.7'
E = '0.8'
RW = '0.9'
RS = '0.10'
s.pinOutputLow( [E, RW, RS, D0, D1, D2, D3, D4, D5, D6, D7] )
def write( rs, rw, dat ):
s.pinSetVal( RS, rs )
s.pinSetVal( RW, rw )
s.gpio( DP, o=0xFF, s=dat&0xFF, c=(~dat)&0xFF ) # 低8位输出数据
s.pinSet( E )
s.pinClr( E )
def read( rs, rw ):
s.pinSetVal( RS, rs )
s.pinSetVal( RW, rw )
s.gpio( DP, i=0xFF ) # 低8位输入模式
s.pinSet( E )
r = s.gpio( DP ) & 0xFF # 读低8位数据
s.pinClr( E )
return r
def readBusyAddress():
r = read( 0, 1 )
return bool(r&0x80), (r&0x7F)
# 初始化
write( 0, 0, 1 ) # 清屏
write( 0, 0, 2 ) # 光标返回左上角
write( 0, 0, 6 ) # 写内存地址自动递增模式
write( 0, 0, 0x0F ) # 开显示,开光标,闪烁模式
write( 0, 0, 0x3C ) # 8位总线, 2行显示模式
write( 0, 0, 0x40 ) # CGRAM地址: 0
def writeLine( line, offset, string ):
if line == 1:
addr = 0x00
else:
addr = 0x40
addr += offset
# 写数据DDRAM地址
write( 0, 0, 0x80+(addr&0x7F) )
# 逐个写入字符,数据地址会自动递增
for c in string:
write( 1, 0, ord(c) )
time.sleep(0.1) # 适当延时,模拟打字效果
while True:
write( 0, 0, 1 ) # 清屏
write( 0, 0, 2 ) # 光标返回左上角
writeLine( 1, 0, 'Hardware control' ) # 第一行
writeLine( 2, 0, ' with Python' ) # 第二行
time.sleep(10)
运行效果: