一、目的
这一节我们学习如何使用我们的树莓派pico开发板raspberry pi pico来控制晶联JLX172104G-590液晶模块。
二、环境
Win10 + 树莓派pico开发板raspberry pi pico + Thonny IDE + 几根杜邦线 + 晶联JLX172104G-590液晶模块(驱动IC: ST75256,分辨率: 172*104)
接线方法:
开发板 | 屏幕 |
GPIO16 | CS |
GPIO20 | RST |
GPIO17 | RS |
GPIO19 | SDA |
GPIO18 | SCK |
3.3V | VDD |
GND | VSS |
3.3V | LEDA |
新买来的开发板,接上USB线插在电脑上,打开“我的电脑”,开发板会以磁盘的方式显示。
我们把在文末下载的固件拷贝进去,然后这个磁盘就会消失。固件就烧好了,简单吧。
从文末下载zadig-2.7.exe,安装树莓派驱动,找到com口。
PS: 如果想要开发板以磁盘方式出现,首先按住开发板上的boot键不放,然后将USB线插入电脑,然后松开boot键。就会看到了。
三、液晶屏幕驱动
st75256.py
#
# MicroPython st75256 OLED driver, SPI interfaces
#
from micropython import const
from font import bytech,ascii_table_8x16,ascii_table_5x8
import framebuf
import machine
import utime
# Subclassing FrameBuffer provides support for graphics primitives
# http://docs.micropython.org/en/latest/pyboard/library/framebuf.html
class ST75256(framebuf.FrameBuffer):
def __init__(self,width,height,spi,dc,res,cs,external_vcc=False):
self.width=width
self.height=height
self.reset=res
self.rate=10*1024*1024
dc.init(dc.OUT,value=0)
res.init(res.OUT,value=0)
cs.init(cs.OUT,value=1)
self.spi=spi
self.dc=dc
self.res=res
self.cs=cs
import time
self.res(1)
time.sleep_ms(1)
self.res(0)
time.sleep_ms(10)
self.res(1)
self.external_vcc=external_vcc
self.pages = self.height//8
self.buffer = bytearray(self.pages * self.width)
super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB)
self.init_display()
def transfer_command(self,cmd):
self.spi.init(baudrate=self.rate,polarity=0,phase=0)
self.cs(0)
self.dc(0)
self.spi.write(bytearray([cmd]))
self.cs(1)
def transfer_data(self,buf):
self.spi.init(baudrate=self.rate,polarity=0,phase=0)
self.cs(0)
self.dc(1)
if type(buf)==type(0x11):
self.spi.write(bytearray([buf]))
else:
self.spi.write(buf)
self.cs(1)
#初始化液晶模块
def init_display(self):
self.reset.value(0)
utime.sleep_ms(100)
self.reset.value(1)
utime.sleep_ms(100)
self.transfer_command(0x30) #EXT=0
self.transfer_command(0x94) #Sleep out
self.transfer_command(0x31) #EXT=1
self.transfer_command(0xD7) #Autoread disable
self.transfer_data(0X9F) #
self.transfer_command(0x32) #Analog SET
self.transfer_data(0x00) #OSC Frequency adjustment
self.transfer_data(0x01) #Frequency on booster capacitors 6KHz
self.transfer_data(0x03) #Bias=1/11
self.transfer_command(0x20) # Gray Level
self.transfer_data(0x01)
self.transfer_data(0x03)
self.transfer_data(0x05)
self.transfer_data(0x07)
self.transfer_data(0x09)
self.transfer_data(0x0b)
self.transfer_data(0x0d)
self.transfer_data(0x10)
self.transfer_data(0x11)
self.transfer_data(0x13)
self.transfer_data(0x15)
self.transfer_data(0x17)
self.transfer_data(0x19)
self.transfer_data(0x1b)
self.transfer_data(0x1d)
self.transfer_data(0x1f)
self.transfer_command(0x30) #EXT=0
self.transfer_command(0x75) #Page Address setting
self.transfer_data(0X00) # XS=0
self.transfer_data(0X14) # XE=159 0x28
self.transfer_command(0x15) #Clumn Address setting
self.transfer_data(0X00) # XS=0
self.transfer_data(0Xff) # XE=256
self.transfer_command(0xBC) #Data scan direction
self.transfer_data(0x00) #MX.MY=Normal
self.transfer_data(0xA6)
self.transfer_command(0xCA) #Display Control
self.transfer_data(0X00) #
self.transfer_data(0X9F) #Duty=160
self.transfer_data(0X20) #Nline=off
self.transfer_command(0xF0) #Display Mode
self.transfer_data(0X10) #10=Monochrome Mode,11=4Gray
self.transfer_command(0x81) #EV control
self.transfer_data(0x36) #VPR[5-0]
self.transfer_data(0x04) #VPR[8-6]
self.transfer_command(0x20) #Power control
self.transfer_data(0x0B) #D0=regulator D1=follower D3=booste, on:1 off:0
utime.sleep_ms(100)
self.transfer_command(0xAF) #Display on
self.transfer_command(0x0C) #数据格式,如果设为 0x0C:表示选择 LSB(DB0)在顶,如果设为 0x08:表示选择LSB(DB0)在底
def poweroff(self):
transfer_command(0x94)
def poweron(self):
transfer_command(0x95)
def lcd_address(self,x,y,x_total,y_total):
x=x
y=y+4#为什么要加4呢?每四行为一列?这里的y是页,也就是行0~15行
self.transfer_command(0x15) #Set Column Address
self.transfer_data(x)
self.transfer_data(x+x_total-1)
self.transfer_command(0x75) #Set Page Address
self.transfer_data(y)
self.transfer_data(y+y_total-1)
self.transfer_command(0x30)
self.transfer_command(0x5c)
def clear_screen(self):#
self.lcd_address(0,0,self.width,self.pages)
for i in range(self.pages):
for j in range(self.width):
self.transfer_data(0x00)
def show(self):#显示缓冲区的内容
self.lcd_address(0,0,self.width,self.pages)
self.transfer_data(self.buffer)
def show_buf(self,buf):#显示缓冲区的内容
self.lcd_address(0,0,self.width,self.pages)
self.transfer_data(buf)
def text_cn(self,text,x,y):#写汉字到缓冲
text=list(text.encode("utf-8"))
offset_=0
page=y//8
page=page%self.pages
if(x>247):
x=0
page+=2
text_= [text[i:i+3] for i in range(0,len(text),3)]#取出汉字的3字节utf-8编码
for k in text_:
b1=bytearray(k)#将中文3字节utf-8编码还原
byte_data=bytech[b1.decode()]
for i in range(0,16):
self.buffer[256*page+x+i+offset_]=byte_data[i]
#print(x_axis,y_axis)
self.buffer[256*(page+1)+x+i+offset_]=byte_data[i+16]
offset_+=16
def icon(self,bmp,x,y,reverse=0):
#32x32
page=y//8
page=page%self.pages
if(x>247):
x=0
page+=2
for i in range(4):
for j in range(32):
if reverse:
self.buffer[256*(page+i)+x+j]=~bmp[i*32+j]
else:
self.buffer[256*(page+i)+x+j]=bmp[i*32+j]
def text_big(self,text,x,y,reverse=0,earse=0):
#显示8x16的点阵的字符串,括号里的参数分别为(字符串,x,y坐标,是否反转,默认不反转)
page=y//8
page=page%self.pages
if(x>248):
x=1
page+=2
self.earse=earse
i=0
text=list(text.encode("ascii"))
while(i<len(text)):
if((text[i]>=0x20) and (text[i]<=0x7e)):
j=(text[i]-0x20)*16
for n in [0,1]:
for k in range(8):
if(reverse==1):
self.buffer[256*(page+n)+x+k]=~ ascii_table_8x16[j+k+8*n]
else:
self.buffer[256*(page+n)+x+k]=ascii_table_8x16[j+k+8*n]#写数据到缓冲区,每写完1字节的数据后列地址自动加1
i=i+1
x+=8
else:
i=i+1
def text_small(self,text,x,y,reverse=0,earse=0):
#5x8点阵的英文字符串
page=y//8
page=page%self.pages
self.earse=earse
i=0
text=list(text.encode("ascii"))
while(i<len(text)):
if((text[i]>=0x20) and (text[i]<=0x7e)):
j=(text[i]-0x20)*5
for n in range(5):
if(reverse==1):
self.buffer[256*page+x+n]=~ascii_table_5x8[j+n]
else:
self.buffer[256*page+x+n]=ascii_table_5x8[j+n]
i+=1
x+=6
else:
i+=1
#
#led driver end
#
四、字体制作
1,使用工具软件pctolcd2002制作字模,使用方法自行百度哈。
2, 字模文件代码如下font.py:
#
# 汉字字模,软件pctolcd2002,阳码,列行式,逆向、c51
#
bytech = {
'计':
[
0x40,0x40,0x42,0xCC,0x00,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x00,
0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00
],
'算':
[
0x08,0x04,0xF3,0x52,0x56,0x52,0x52,0x50,0x54,0x53,0x52,0x56,0xF2,0x02,0x02,0x00,
0x10,0x10,0x97,0x55,0x3D,0x15,0x15,0x15,0x15,0x15,0xFD,0x15,0x17,0x10,0x10,0x00
],
'器':
[
0x80,0x80,0x9E,0x92,0x92,0x92,0x9E,0xE0,0x80,0x9E,0xB2,0xD2,0x92,0x9E,0x80,0x00,
0x08,0x08,0xF4,0x94,0x92,0x92,0xF1,0x00,0x01,0xF2,0x92,0x94,0x94,0xF8,0x08,0x00
],
'爱':
[
0x80,0x64,0x2C,0x34,0x24,0x24,0xEC,0x32,0x22,0x22,0x32,0x2E,0x23,0xA2,0x60,0x00,
0x00,0x41,0x21,0x91,0x89,0x87,0x4D,0x55,0x25,0x25,0x55,0x4D,0x81,0x80,0x80,0x00
],
'好':
[
0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x80,0x82,0x82,0xE2,0x92,0x8A,0x86,0x80,0x00,
0x40,0x22,0x15,0x08,0x16,0x61,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00
],
'者':
[
0x20,0x20,0x24,0x24,0x24,0x24,0xBF,0x64,0x24,0x34,0x28,0x24,0x22,0x20,0x20,0x00,
0x10,0x08,0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00
],
}
ascii_table_8x16=[
##粗体8x16点阵的ASCII码的点阵数据,从"JLX-GB2312"型号的字库IC中读出来的国标的。
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,##space
0x00,0x00,0x38,0xFC, 0xFC,0x38,0x00,0x00, 0x00,0x00,0x00,0x0D, 0x0D,0x00,0x00,0x00,##-!-ASCII码:0X21
0x00,0x0E,0x1E,0x00, 0x00,0x1E,0x0E,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,##-"-
0x20,0xF8,0xF8,0x20, 0xF8,0xF8,0x20,0x00, 0x02,0x0F,0x0F,0x02, 0x0F,0x0F,0x02,0x00,##-#-
0x38,0x7C,0x44,0x47, 0x47,0xCC,0x98,0x00, 0x06,0x0C,0x08,0x38, 0x38,0x0F,0x07,0x00,##-$-
0x30,0x30,0x00,0x80, 0xC0,0x60,0x30,0x00, 0x0C,0x06,0x03,0x01, 0x00,0x0C,0x0C,0x00,##-%-
0x80,0xD8,0x7C,0xE4, 0xBC,0xD8,0x40,0x00, 0x07,0x0F,0x08,0x08, 0x07,0x0F,0x08,0x00,##-&-
0x00,0x10,0x1E,0x0E, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,##-'-
0x00,0x00,0xF0,0xF8, 0x0C,0x04,0x00,0x00, 0x00,0x00,0x03,0x07, 0x0C,0x08,0x00,0x00,##-(-
0x00,0x00,0x04,0x0C, 0xF8,0xF0,0x00,0x00, 0x00,0x00,0x08,0x0C, 0x07,0x03,0x00,0x00,##-)-
0x80,0xA0,0xE0,0xC0, 0xC0,0xE0,0xA0,0x80, 0x00,0x02,0x03,0x01, 0x01,0x03,0x02,0x00,##-*-ASCII码:0X2A
0x00,0x80,0x80,0xE0, 0xE0,0x80,0x80,0x00, 0x00,0x00,0x00,0x03, 0x03,0x00,0x00,0x00,##-+-
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x1E, 0x0E,0x00,0x00,0x00,##-,-
0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,##---
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0C, 0x0C,0x00,0x00,0x00,##-.-
0x00,0x00,0x00,0x80, 0xC0,0x60,0x30,0x00, 0x0C,0x06,0x03,0x01, 0x00,0x00,0x00,0x00,##-#-
0xF8,0xF8,0x0C,0xC4, 0x0C,0xF8,0xF0,0x00, 0x03,0x07,0x0C,0x08, 0x0C,0x07,0x03,0x00,##-0-ASCII码:0X30
0x00,0x10,0x18,0xFC, 0xFC,0x00,0x00,0x00, 0x00,0x08,0x08,0x0F, 0x0F,0x08,0x08,0x00,##-1-
0x08,0x0C,0x84,0xC4, 0x64,0x3C,0x18,0x00, 0x0E,0x0F,0x09,0x08, 0x08,0x0C,0x0C,0x00,##-2-
0x08,0x0C,0x44,0x44, 0x44,0xFC,0xB8,0x00, 0x04,0x0C,0x08,0x08, 0x08,0x0F,0x07,0x00,##-3-
0xC0,0xE0,0xB0,0x98, 0xFC,0xFC,0x80,0x00, 0x00,0x00,0x00,0x08, 0x0F,0x0F,0x08,0x00,##-4-ASCII码:0X34
0x7C,0x7C,0x44,0x44, 0x44,0xC4,0x84,0x00, 0x04,0x0C,0x08,0x08, 0x08,0x0F,0x07,0x00,##-5-
0xF0,0xF8,0x4C,0x44, 0x44,0xC0,0x80,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0F,0x07,0x00,##-6-
0x0C,0x0C,0x04,0x84, 0xC4,0x7C,0x3C,0x00, 0x00,0x00,0x0F,0x0F, 0x00,0x00,0x00,0x00,##-7-
0xB8,0xFC,0x44,0x44, 0x44,0xFC,0xB8,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0F,0x07,0x00,##-8-
0x38,0x7C,0x44,0x44, 0x44,0xFC,0xF8,0x00, 0x00,0x08,0x08,0x08, 0x0C,0x07,0x03,0x00,##-9-
0x00,0x00,0x00,0x30, 0x30,0x00,0x00,0x00, 0x00,0x00,0x00,0x06, 0x06,0x00,0x00,0x00,##-:-
0x00,0x00,0x00,0x30, 0x30,0x00,0x00,0x00, 0x00,0x00,0x08,0x0E, 0x06,0x00,0x00,0x00,##-;-
0x00,0x80,0xC0,0x60, 0x30,0x18,0x08,0x00, 0x00,0x00,0x01,0x03, 0x06,0x0C,0x08,0x00,##-<-
0x00,0x20,0x20,0x20, 0x20,0x20,0x20,0x00, 0x00,0x01,0x01,0x01, 0x01,0x01,0x01,0x00,##-=-
0x00,0x08,0x18,0x30, 0x60,0xC0,0x80,0x00, 0x00,0x08,0x0C,0x06, 0x03,0x01,0x00,0x00,##->-ASCII码:0X3E
0x18,0x1C,0x04,0xC4, 0xE4,0x3C,0x18,0x00, 0x00,0x00,0x00,0x0D, 0x0D,0x00,0x00,0x00,##-?-
0xF0,0xF0,0x08,0xC8, 0xC8,0xF8,0xF0,0x00, 0x07,0x0F,0x08,0x0B, 0x0B,0x0B,0x01,0x00,##-@-
0xE0,0xF0,0x98,0x8C, 0x98,0xF0,0xE0,0x00, 0x0F,0x0F,0x00,0x00, 0x00,0x0F,0x0F,0x00,##-A-ASCII码:0X41
0x04,0xFC,0xFC,0x44, 0x44,0xFC,0xB8,0x00, 0x08,0x0F,0x0F,0x08, 0x08,0x0F,0x07,0x00,##-B-
0xF0,0xF8,0x0C,0x04, 0x04,0x0C,0x18,0x00, 0x03,0x07,0x0C,0x08, 0x08,0x0C,0x06,0x00,##-C-
0x04,0xFC,0xFC,0x04, 0x0C,0xF8,0xF0,0x00, 0x08,0x0F,0x0F,0x08, 0x0C,0x07,0x03,0x00,##-D-
0x04,0xFC,0xFC,0x44, 0xE4,0x0C,0x1C,0x00, 0x08,0x0F,0x0F,0x08, 0x08,0x0C,0x0E,0x00,##-E-
0x04,0xFC,0xFC,0x44, 0xE4,0x0C,0x1C,0x00, 0x08,0x0F,0x0F,0x08, 0x00,0x00,0x00,0x00,##-F-
0xF0,0xF8,0x0C,0x84, 0x84,0x8C,0x98,0x00, 0x03,0x07,0x0C,0x08, 0x08,0x07,0x0F,0x00,##-G-
0xFC,0xFC,0x40,0x40, 0x40,0xFC,0xFC,0x00, 0x0F,0x0F,0x00,0x00, 0x00,0x0F,0x0F,0x00,##-H-ASCII码:0X48
0x00,0x00,0x04,0xFC, 0xFC,0x04,0x00,0x00, 0x00,0x00,0x08,0x0F, 0x0F,0x08,0x00,0x00,##-I-
0x00,0x00,0x00,0x04, 0xFC,0xFC,0x04,0x00, 0x07,0x0F,0x08,0x08, 0x0F,0x07,0x00,0x00,##-J-
0x04,0xFC,0xFC,0xC0, 0xE0,0x3C,0x1C,0x00, 0x08,0x0F,0x0F,0x00, 0x01,0x0F,0x0E,0x00,##-K-
0x04,0xFC,0xFC,0x04, 0x00,0x00,0x00,0x00, 0x08,0x0F,0x0F,0x08, 0x08,0x0C,0x0E,0x00,##-L-
0xFC,0xFC,0x38,0x70, 0x38,0xFC,0xFC,0x00, 0x0F,0x0F,0x00,0x00, 0x00,0x0F,0x0F,0x00,##-M-
0xFC,0xFC,0x38,0x70, 0xE0,0xFC,0xFC,0x00, 0x0F,0x0F,0x00,0x00, 0x00,0x0F,0x0F,0x00,##-N-
0xF8,0xFC,0x04,0x04, 0x04,0xFC,0xF8,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0F,0x07,0x00,##-O-
0x04,0xFC,0xFC,0x44, 0x44,0x7C,0x38,0x00, 0x08,0x0F,0x0F,0x08, 0x00,0x00,0x00,0x00,##-P-
0xF8,0xFC,0x04,0x04, 0x04,0xFC,0xF8,0x00, 0x07,0x0F,0x08,0x0E, 0x3C,0x3F,0x27,0x00,##-Q-
0x04,0xFC,0xFC,0x44, 0xC4,0xFC,0x38,0x00, 0x08,0x0F,0x0F,0x00, 0x00,0x0F,0x0F,0x00,##-R-
0x18,0x3C,0x64,0x44, 0xC4,0x9C,0x18,0x00, 0x06,0x0E,0x08,0x08, 0x08,0x0F,0x07,0x00,##-S-
0x00,0x1C,0x0C,0xFC, 0xFC,0x0C,0x1C,0x00, 0x00,0x00,0x08,0x0F, 0x0F,0x08,0x00,0x00,##-T-
0xFC,0xFC,0x00,0x00, 0x00,0xFC,0xFC,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0F,0x07,0x00,##-U-
0xFC,0xFC,0x00,0x00, 0x00,0xFC,0xFC,0x00, 0x01,0x03,0x06,0x0C, 0x06,0x03,0x01,0x00,##-V-
0xFC,0xFC,0x00,0x00, 0x00,0xFC,0xFC,0x00, 0x07,0x0F,0x0E,0x03, 0x0E,0x0F,0x07,0x00,##-W-
0x0C,0x3C,0xF0,0xE0, 0xF0,0x3C,0x0C,0x00, 0x0C,0x0F,0x03,0x01, 0x03,0x0F,0x0C,0x00,##-X-
0x00,0x0C,0x7C,0xC0, 0xC0,0x7C,0x3C,0x00, 0x00,0x00,0x08,0x0F, 0x0F,0x08,0x00,0x00,##-Y-
0x1C,0x0C,0x84,0xC4, 0x64,0x3C,0x1C,0x00, 0x0E,0x0F,0x09,0x08, 0x08,0x0C,0x0E,0x00,##-Z-
0x00,0x00,0xFC,0xFC, 0x04,0x04,0x00,0x00, 0x00,0x00,0x0F,0x0F, 0x08,0x08,0x00,0x00,##-[-
0x38,0x70,0xE0,0xC0, 0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x01, 0x03,0x07,0x0E,0x00,##-\-
0x00,0x00,0x04,0x04, 0xFC,0xFC,0x00,0x00, 0x00,0x00,0x08,0x08, 0x0F,0x0F,0x00,0x00,##-]-
0x08,0x0C,0x06,0x03, 0x06,0x0C,0x08,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,##-^-
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,##-_-
0x00,0x00,0x03,0x07, 0x04,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,##-`-
0x00,0xA0,0xA0,0xA0, 0xE0,0xC0,0x00,0x00, 0x07,0x0F,0x08,0x08, 0x07,0x0F,0x08,0x00,##-a-ASCII码:0X61
0x04,0xFC,0xFC,0x20, 0x60,0xC0,0x80,0x00, 0x00,0x0F,0x0F,0x08, 0x08,0x0F,0x07,0x00,##-b-
0xC0,0xE0,0x20,0x20, 0x20,0x60,0x40,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0C,0x04,0x00,##-c-
0x80,0xC0,0x60,0x24, 0xFC,0xFC,0x00,0x00, 0x07,0x0F,0x08,0x08, 0x07,0x0F,0x08,0x00,##-d-
0xC0,0xE0,0xA0,0xA0, 0xA0,0xE0,0xC0,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0C,0x04,0x00,##-e-
0x40,0xF8,0xFC,0x44, 0x0C,0x18,0x00,0x00, 0x08,0x0F,0x0F,0x08, 0x00,0x00,0x00,0x00,##-f-
0xC0,0xE0,0x20,0x20, 0xC0,0xE0,0x20,0x00, 0x27,0x6F,0x48,0x48, 0x7F,0x3F,0x00,0x00,##-g-
0x04,0xFC,0xFC,0x40, 0x20,0xE0,0xC0,0x00, 0x08,0x0F,0x0F,0x00, 0x00,0x0F,0x0F,0x00,##-h-
0x00,0x00,0x20,0xEC, 0xEC,0x00,0x00,0x00, 0x00,0x00,0x08,0x0F, 0x0F,0x08,0x00,0x00,##-i-
0x00,0x00,0x00,0x00, 0x20,0xEC,0xEC,0x00, 0x00,0x30,0x70,0x40, 0x40,0x7F,0x3F,0x00,##-j-
0x04,0xFC,0xFC,0x80, 0xC0,0x60,0x20,0x00, 0x08,0x0F,0x0F,0x01, 0x03,0x0E,0x0C,0x00,##-k-
0x00,0x00,0x04,0xFC, 0xFC,0x00,0x00,0x00, 0x00,0x00,0x08,0x0F, 0x0F,0x08,0x00,0x00,##-l-
0xE0,0xE0,0x60,0xC0, 0x60,0xE0,0xC0,0x00, 0x0F,0x0F,0x00,0x07, 0x00,0x0F,0x0F,0x00,##-m-
0x20,0xE0,0xC0,0x20, 0x20,0xE0,0xC0,0x00, 0x00,0x0F,0x0F,0x00, 0x00,0x0F,0x0F,0x00,##-n-
0xC0,0xE0,0x20,0x20, 0x20,0xE0,0xC0,0x00, 0x07,0x0F,0x08,0x08, 0x08,0x0F,0x07,0x00,##-o-
0x20,0xE0,0xC0,0x20, 0x20,0xE0,0xC0,0x00, 0x40,0x7F,0x7F,0x48, 0x08,0x0F,0x07,0x00,##-p-
0xC0,0xE0,0x20,0x20, 0xC0,0xE0,0x20,0x00, 0x07,0x0F,0x08,0x48, 0x7F,0x7F,0x40,0x00,##-q-
0x20,0xE0,0xC0,0x60, 0x20,0xE0,0xC0,0x00, 0x08,0x0F,0x0F,0x08, 0x00,0x00,0x00,0x00,##-r-
0x40,0xE0,0xA0,0x20, 0x20,0x60,0x40,0x00, 0x04,0x0C,0x09,0x09, 0x0B,0x0E,0x04,0x00,##-s-
0x20,0x20,0xF8,0xFC, 0x20,0x20,0x00,0x00, 0x00,0x00,0x07,0x0F, 0x08,0x0C,0x04,0x00,##-t-
0xE0,0xE0,0x00,0x00, 0xE0,0xE0,0x00,0x00, 0x07,0x0F,0x08,0x08, 0x07,0x0F,0x08,0x00,##-u-
0x00,0xE0,0xE0,0x00, 0x00,0xE0,0xE0,0x00, 0x00,0x03,0x07,0x0C, 0x0C,0x07,0x03,0x00,##-v-
0xE0,0xE0,0x00,0x80, 0x00,0xE0,0xE0,0x00, 0x07,0x0F,0x0C,0x07, 0x0C,0x0F,0x07,0x00,##-w-
0x20,0x60,0xC0,0x80, 0xC0,0x60,0x20,0x00, 0x08,0x0C,0x07,0x03, 0x07,0x0C,0x08,0x00,##-x-
0xE0,0xE0,0x00,0x00, 0x00,0xE0,0xE0,0x00, 0x47,0x4F,0x48,0x48, 0x68,0x3F,0x1F,0x00,##-y-
0x60,0x60,0x20,0xA0, 0xE0,0x60,0x20,0x00, 0x0C,0x0E,0x0B,0x09, 0x08,0x0C,0x0C,0x00,##-z-##
0x00,0x40,0x40,0xF8, 0xBC,0x04,0x04,0x00, 0x00,0x00,0x00,0x07, 0x0F,0x08,0x08,0x00,##-{-
0x00,0x00,0x00,0xBC, 0xBC,0x00,0x00,0x00, 0x00,0x00,0x00,0x0F, 0x0F,0x00,0x00,0x00,##-|-
0x00,0x04,0x04,0xBC, 0xF8,0x40,0x40,0x00, 0x00,0x08,0x08,0x0F, 0x07,0x00,0x00,0x00,##-}-
0x08,0x0C,0x04,0x0C, 0x08,0x0C,0x04,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,##ASCII码:0X7E
]
ascii_table_5x8=[
#*全体ASCII 列表:5x8点阵*#
0x00,0x00,0x00,0x00,0x00,##space
0x00,0x00,0x4f,0x00,0x00,##-!-
0x00,0x07,0x00,0x07,0x00,##-"-
0x14,0x7f,0x14,0x7f,0x14,##-#-
0x24,0x2a,0x7f,0x2a,0x12,##-$-
0x23,0x13,0x08,0x64,0x62,##-%-
0x36,0x49,0x55,0x22,0x50,##-&-
0x00,0x05,0x07,0x00,0x00,##-'-
0x00,0x1c,0x22,0x41,0x00,##-(-
0x00,0x41,0x22,0x1c,0x00,##-)-
0x14,0x08,0x3e,0x08,0x14,##-*-
0x08,0x08,0x3e,0x08,0x08,##-+-
0x00,0x50,0x30,0x00,0x00,##-,-
0x08,0x08,0x08,0x08,0x08,##---
0x00,0x60,0x60,0x00,0x00,##-.-
0x20,0x10,0x08,0x04,0x02,##-#-
0x3e,0x51,0x49,0x45,0x3e,##-0-
0x00,0x42,0x7f,0x40,0x00,##-1-
0x42,0x61,0x51,0x49,0x46,##-2-
0x21,0x41,0x45,0x4b,0x31,##-3-
0x18,0x14,0x12,0x7f,0x10,##-4-
0x27,0x45,0x45,0x45,0x39,##-5-
0x3c,0x4a,0x49,0x49,0x30,##-6-
0x01,0x71,0x09,0x05,0x03,##-7-
0x36,0x49,0x49,0x49,0x36,##-8-
0x06,0x49,0x49,0x29,0x1e,##-9-
0x00,0x36,0x36,0x00,0x00,##-:-
0x00,0x56,0x36,0x00,0x00,##-;-
0x08,0x14,0x22,0x41,0x00,##-<-
0x14,0x14,0x14,0x14,0x14,##-=-
0x00,0x41,0x22,0x14,0x08,##->-
0x02,0x01,0x51,0x09,0x06,##-?-
0x32,0x49,0x79,0x41,0x3e,##-@-
0x7e,0x11,0x11,0x11,0x7e,##-A-
0x7f,0x49,0x49,0x49,0x36,##-B-
0x3e,0x41,0x41,0x41,0x22,##-C-
0x7f,0x41,0x41,0x22,0x1c,##-D-
0x7f,0x49,0x49,0x49,0x41,##-E-
0x7f,0x09,0x09,0x09,0x01,##-F-
0x3e,0x41,0x49,0x49,0x7a,##-G-
0x7f,0x08,0x08,0x08,0x7f,##-H-
0x00,0x41,0x7f,0x41,0x00,##-I-
0x20,0x40,0x41,0x3f,0x01,##-J-
0x7f,0x08,0x14,0x22,0x41,##-K-
0x7f,0x40,0x40,0x40,0x40,##-L-
0x7f,0x02,0x0c,0x02,0x7f,##-M-
0x7f,0x04,0x08,0x10,0x7f,##-N-
0x3e,0x41,0x41,0x41,0x3e,##-O-
0x7f,0x09,0x09,0x09,0x06,##-P-
0x3e,0x41,0x51,0x21,0x5e,##-Q-
0x7f,0x09,0x19,0x29,0x46,##-R-
0x46,0x49,0x49,0x49,0x31,##-S-
0x01,0x01,0x7f,0x01,0x01,##-T-
0x3f,0x40,0x40,0x40,0x3f,##-U-
0x1f,0x20,0x40,0x20,0x1f,##-V-
0x3f,0x40,0x38,0x40,0x3f,##-W-
0x63,0x14,0x08,0x14,0x63,##-X-
0x07,0x08,0x70,0x08,0x07,##-Y-
0x61,0x51,0x49,0x45,0x43,##-Z-
0x00,0x7f,0x41,0x41,0x00,##-[-
0x02,0x04,0x08,0x10,0x20,##-\-
0x00,0x41,0x41,0x7f,0x00,##-]-
0x04,0x02,0x01,0x02,0x04,##-^-
0x40,0x40,0x40,0x40,0x40,##-_-
0x01,0x02,0x04,0x00,0x00,##-`-
0x20,0x54,0x54,0x54,0x78,##-a-
0x7f,0x48,0x48,0x48,0x30,##-b-
0x38,0x44,0x44,0x44,0x44,##-c-
0x30,0x48,0x48,0x48,0x7f,##-d-
0x38,0x54,0x54,0x54,0x58,##-e-
0x00,0x08,0x7e,0x09,0x02,##-f-
0x48,0x54,0x54,0x54,0x3c,##-g-
0x7f,0x08,0x08,0x08,0x70,##-h-
0x00,0x00,0x7a,0x00,0x00,##-i-
0x20,0x40,0x40,0x3d,0x00,##-j-
0x7f,0x20,0x28,0x44,0x00,##-k-
0x00,0x41,0x7f,0x40,0x00,##-l-
0x7c,0x04,0x38,0x04,0x7c,##-m-
0x7c,0x08,0x04,0x04,0x78,##-n-
0x38,0x44,0x44,0x44,0x38,##-o-
0x7c,0x14,0x14,0x14,0x08,##-p-
0x08,0x14,0x14,0x14,0x7c,##-q-
0x7c,0x08,0x04,0x04,0x08,##-r-
0x48,0x54,0x54,0x54,0x24,##-s-
0x04,0x04,0x3f,0x44,0x24,##-t-
0x3c,0x40,0x40,0x40,0x3c,##-u-
0x1c,0x20,0x40,0x20,0x1c,##-v-
0x3c,0x40,0x30,0x40,0x3c,##-w-
0x44,0x28,0x10,0x28,0x44,##-x-
0x04,0x48,0x30,0x08,0x04,##-y-
0x44,0x64,0x54,0x4c,0x44,##-z-
0x08,0x36,0x41,0x41,0x00,##-{-
0x00,0x00,0x77,0x00,0x00,##-|-
0x00,0x41,0x41,0x36,0x08,##-}-
0x04,0x02,0x02,0x02,0x01,##-~-
]
#
#字模区域结束
#
五、屏幕操作代码
JLX172104G590.py
WIDTH=256 # 屏幕宽度
HEIGHT=128 # 屏幕高度
from machine import Pin, SPI
from st75256 import ST75256
# 初始化屏幕
spi = SPI(0, 100000, mosi=Pin(19), sck=Pin(18))
oled = ST75256(WIDTH, HEIGHT, spi, Pin(17),Pin(20), Pin(16),external_vcc=True)
# 显示文字
oled.text_cn("计算器爱好者",50,8) # 写入缓冲区
oled.text_big("Hello World",50,30)
oled.text_small("Hello World",50,45)
oled.text("Hello World",50,55)
oled.show()#显示缓冲区内容
六、显示效果
不知道为啥会反过来,还有屏幕会有一片花的,有知道的,评论区留言。 谢谢。
七、购买链接
1,树莓派开发板
2,晶联LED屏幕
八、参考文章
链接: https://pan.baidu.com/s/1nlYxlCQ3bOVYQ-jZBAh9PA 提取码: ygqp 复制这段内容后打开百度网盘手机App,操作更方便哦
十、显示问题解决办法
在博主的辛苦查阅资料,在显示屏的资料中,看到了驱动部分设置参数有误。
大家参考如下文档:JLX172104G-590-PC中文字库编程说明书.pdf_免费高速下载|百度网盘-分享无限制
然后修改我们的驱动的这几行:
1,文中显示花屏问题,请修改驱动的这一行
self.transfer_data(0X14) # XE=159 0x28
将值改为4F。
2,文中显示文字镜像问题,请修改驱动的这一行
self.transfer_data(0x00) #MX.MY=Normal
将值改为0x02。
3,文中显示不清晰的问题,修改驱动程序的对比度可以解决。
self.transfer_data(0x36) #VPR[5-0]
这一行是微调对比度,可调范围 0x00~0x3f,共 64 级。将值改为0x08。
4,最后,在修改一下x,y的地址
def lcd_address(self,x,y,x_total,y_total):
x=x
y=y+4#为什么要加4呢?每四行为一列?这里的y是页,也就是行0~15行
将值改为x=x+84 y=y
5,接着,我们修改代码JLX172104G590.py如下:
WIDTH=256 # 屏幕宽度
HEIGHT=128 # 屏幕高度
from machine import Pin, SPI
from st75256 import ST75256
# 初始化屏幕
spi = SPI(0, 100000, mosi=Pin(19), sck=Pin(18))
oled = ST75256(WIDTH, HEIGHT, spi, Pin(17),Pin(20), Pin(16),external_vcc=False)
# 显示文字
oled.text_cn("计算器爱好者",0,0)#写入缓冲区
oled.text_big("Hello World",15,20)
oled.text_small("Hello World",30,64)
oled.text("Hello World",50,90)
oled.show()#显示缓冲区内容
显示效果如下:
捣鼓了半天终于结束啦!还是要多看官方文档啊!
最后附上正确的驱动程序st75256.py:
#
# MicroPython st75256 OLED driver, SPI interfaces
#
from micropython import const
from font import bytech,ascii_table_8x16,ascii_table_5x8
import framebuf
import machine
import utime
# Subclassing FrameBuffer provides support for graphics primitives
# http://docs.micropython.org/en/latest/pyboard/library/framebuf.html
class ST75256(framebuf.FrameBuffer):
def __init__(self,width,height,spi,dc,res,cs,external_vcc=False):
self.width=width
self.height=height
self.reset=res
self.rate=10*1024*1024
dc.init(dc.OUT,value=0)
res.init(res.OUT,value=0)
cs.init(cs.OUT,value=1)
self.spi=spi
self.dc=dc
self.res=res
self.cs=cs
import time
self.res(1)
time.sleep_ms(1)
self.res(0)
time.sleep_ms(10)
self.res(1)
self.external_vcc=external_vcc
self.pages = self.height//8
self.buffer = bytearray(self.pages * self.width)
super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB)
self.init_display()
def transfer_command(self,cmd):
self.spi.init(baudrate=self.rate,polarity=0,phase=0)
self.cs(0)
self.dc(0)
self.spi.write(bytearray([cmd]))
self.cs(1)
def transfer_data(self,buf):
self.spi.init(baudrate=self.rate,polarity=0,phase=0)
self.cs(0)
self.dc(1)
if type(buf)==type(0x11):
self.spi.write(bytearray([buf]))
else:
self.spi.write(buf)
self.cs(1)
#初始化液晶模块
def init_display(self):
self.reset.value(0)
utime.sleep_ms(100)
self.reset.value(1)
utime.sleep_ms(100)
self.transfer_command(0x30) # EXT=0
self.transfer_command(0x94) # Sleep out
self.transfer_command(0x31) # EXT=1
self.transfer_command(0xD7) # Autoread disable
self.transfer_data(0X9F) #
self.transfer_command(0x32) # Analog SET
self.transfer_data(0x00) # OSC Frequency adjustment
self.transfer_data(0x01) # Frequency on booster capacitors 6KHz
self.transfer_data(0x03) # Bias=1/11
self.transfer_command(0x20) # Gray Level
self.transfer_data(0x01)
self.transfer_data(0x03)
self.transfer_data(0x05)
self.transfer_data(0x07)
self.transfer_data(0x09)
self.transfer_data(0x0b)
self.transfer_data(0x0d)
self.transfer_data(0x10)
self.transfer_data(0x11)
self.transfer_data(0x13)
self.transfer_data(0x15)
self.transfer_data(0x17)
self.transfer_data(0x19)
self.transfer_data(0x1b)
self.transfer_data(0x1d)
self.transfer_data(0x1f)
self.transfer_command(0x30) # EXT=0
self.transfer_command(0x75) # Page Address setting
self.transfer_data(0X00) # XS=0
self.transfer_data(0X4F) # XE=159
self.transfer_command(0x15) # Clumn Address setting
self.transfer_data(0X00) # XS=0
self.transfer_data(0Xff) # XE=256 ff
self.transfer_command(0xBC) # Data scan direction
self.transfer_data(0x02) # MX.MY=Normal # 设为0x00镜像显示
self.transfer_data(0xA6)
self.transfer_command(0xCA) # Display Control
self.transfer_data(0X00) #
self.transfer_data(0X9F) # Duty=160 //占空比
self.transfer_data(0x20); # Nline=off
self.transfer_command(0xF0) # Display Mode
self.transfer_data(0X10) # 10=Monochrome Mode,11=4Gray
self.transfer_command(0x81) # EV control //设置对比度,“0x81”不可改动,紧跟着的 2 个数据是可改的,但“先微调后粗调”
self.transfer_data(0x08) # VPR[5-0] //微调对比度,可调范围 0x00~0x3f,共 64 级
self.transfer_data(0x04) # VPR[8-6] //粗调对比度,可调范围 0x00~0x07,共 8 级
self.transfer_command(0x20) # Power control 电源控制
self.transfer_data(0x0B) # D0=regulator D1=follower D3=booste, on:1 off:0
utime.sleep_ms(100)
self.transfer_command(0xAF) # Display on
self.transfer_command(0x0C) # 数据格式,如果设为 0x0C:表示选择 LSB(DB0)在顶,如果设为 0x08:表示选择LSB(DB0)在底
def poweroff(self):
transfer_command(0x94)
def poweron(self):
transfer_command(0x95)
def lcd_address(self,x,y,x_total,y_total):
x=x+84 # X 为起始的列地址,Y 为起始的行地址
y=y
self.transfer_command(0x15) #Set Column Address
self.transfer_data(x)
self.transfer_data(x+x_total-1)
self.transfer_command(0x75) #Set Page Address
self.transfer_data(y)
self.transfer_data(y+y_total-1)
self.transfer_command(0x30)
self.transfer_command(0x5c)
def clear_screen(self):#
self.lcd_address(0,0,self.width,self.pages)
for i in range(self.pages):
for j in range(self.width):
self.transfer_data(0x00)
def show(self):#显示缓冲区的内容
self.lcd_address(0,0,self.width,self.pages)
self.transfer_data(self.buffer)
def show_buf(self,buf):#显示缓冲区的内容
self.lcd_address(0,0,self.width,self.pages)
self.transfer_data(buf)
def text_cn(self,text,x,y):#写汉字到缓冲
text=list(text.encode("utf-8"))
offset_=0
page=y//8
page=page%self.pages
if(x>247):
x=0
page+=2
text_= [text[i:i+3] for i in range(0,len(text),3)]#取出汉字的3字节utf-8编码
for k in text_:
b1=bytearray(k)#将中文3字节utf-8编码还原
byte_data=bytech[b1.decode()]
for i in range(0,16):
self.buffer[256*page+x+i+offset_]=byte_data[i]
#print(x_axis,y_axis)
self.buffer[256*(page+1)+x+i+offset_]=byte_data[i+16]
offset_+=16
def icon(self,bmp,x,y,reverse=0):
#32x32
page=y//8
page=page%self.pages
if(x>247):
x=0
page+=2
for i in range(4):
for j in range(32):
if reverse:
self.buffer[256*(page+i)+x+j]=~bmp[i*32+j]
else:
self.buffer[256*(page+i)+x+j]=bmp[i*32+j]
def text_big(self,text,x,y,reverse=0,earse=0):
#显示8x16的点阵的字符串,括号里的参数分别为(字符串,x,y坐标,是否反转,默认不反转)
page=y//8
page=page%self.pages
if(x>248):
x=1
page+=2
self.earse=earse
i=0
text=list(text.encode("ascii"))
while(i<len(text)):
if((text[i]>=0x20) and (text[i]<=0x7e)):
j=(text[i]-0x20)*16
for n in [0,1]:
for k in range(8):
if(reverse==1):
self.buffer[256*(page+n)+x+k]=~ ascii_table_8x16[j+k+8*n]
else:
self.buffer[256*(page+n)+x+k]=ascii_table_8x16[j+k+8*n]#写数据到缓冲区,每写完1字节的数据后列地址自动加1
i=i+1
x+=8
else:
i=i+1
def text_small(self,text,x,y,reverse=0,earse=0):
#5x8点阵的英文字符串
page=y//8
page=page%self.pages
self.earse=earse
i=0
text=list(text.encode("ascii"))
while(i<len(text)):
if((text[i]>=0x20) and (text[i]<=0x7e)):
j=(text[i]-0x20)*5
for n in range(5):
if(reverse==1):
self.buffer[256*page+x+n]=~ascii_table_5x8[j+n]
else:
self.buffer[256*page+x+n]=ascii_table_5x8[j+n]
i+=1
x+=6
else:
i+=1
#
#led driver end
#