micropython应用触摸屏_[TPYBoard - Micropython之会python就能做硬件 2] 利用micropython控制NOKIA 5110屏...

欢迎加入讨论群 64770604

一、本次实验所需器材

1、TPYboard V102板  一块

2、DS3231模块   一块

3、NOKIA 5110 LCD 屏 一块

4、杜邦线:若干

===感谢某宝“萝卜城”提供的TPYboard V102豪华版套餐===

二、Nokia 5110 LCD屏使用方法

1、什么是Nokia 5110 LCD?

Nokia 5110 LCD是NOKIA 公司生产的可用于其5110、6150,6100 等系列移动电话的液晶显示模块,国内厂家也生产有类似的兼容产品。该产品除应用于移动电话外,也可广泛应用于各类便携式设备的显示系统。与其它类型的产品相比,该模块具有以下特点:

●84x48 的点阵LCD,可以显示4 行汉字,

●采用串行接口与主处理器进行通信,接口信号线数量大幅度减少,包括电源和地在内的信号线仅有9 条。支持多种串行通信协议(如AVR 单片机的SPI、MCS51 的串口模式0等),传输速率高达4Mbps,可全速写入显示数据,无等待时间。

●可通过导电胶连接模块与印制版

●LCD 控制器/驱动器芯片已绑定到LCD 晶片上,模块的体积很小。

●采用低电压供电,正常显示时的工作电流在200μA 以下,且具有掉电模式。

2、Nokia 5110 LCD 引脚说明

Nokia 5110 LCD共有8个引脚,不同的板子可能标注的英文略有不同,具体含义如下:

标注

含义

GND

接地

BL

背景灯

Vcc

3.3V

CLK

时钟信号

DIN

数据流

DC

当为0时表示命令状态,当为1时表示数据状态

CE

使能端

RST

RESET

3、Tpyboard V102连接5110的方法

这里使用的是SPI连接方法,如果你对什么是SPI连接还不是很清楚,你可以百度一下,这样有利于你从原理上搞明白为什么这么连接。具体针脚对应如下:(由于tpyboard v102有两个spi接口,这里我们选用x1对应接口)

TPYboard

5110LCD

SPI

GND

GND

X4

BL

3.3V

Vcc

X6

CLK

SCK

X8

DIN

MOSI

X3

DC

X2

CE

X1

RST

4、5110 LCD字模的获取

(1)英文及数据的显示

本节提供了font.py文件,已经将英文、数字及符号的字模做好,可以直接调用。具体下载见文章最后的下载地址。

(2)汉字取模

汉字取模需要用到字模提取工具,该工具在文章后面的下载地址中可以下载。这里以“欢”为例具体说明使用方法如下:

第一步,打开工具:

第二步,点击新建图像,宽度与高度均为16,点击确定。如图:

第三步,在文字输入区写入要取模的汉字“欢”,按下ctrl+enter。

第四步,点左边菜单里的取模方式,点c51格式,于是得到:

0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00,

0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00,

第五步,对应填写到chinese.py文件中(该文件可从文章后面的网址下载),如下:

class CN_UTF8:

"""docstring for CN_UTF8"""

#key:values

#key: 使用汉字的UTF-8码

#values: 16*16

# [0] 8*16 上半部分

# [1] 8*16 下半部分

UTF8_CHINESE = {

0xe6aca2:[

[0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00],

[0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00]

],#欢

0xe8bf8e:[

[0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00],

[0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00]

],#迎

0xe4bdbf:[

[0x80,0x60,0xF8,0x07,0x04,0xE4,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0xE4,0x04,0x00],

[0x00,0x00,0xFF,0x00,0x80,0x81,0x45,0x29,0x11,0x2F,0x41,0x41,0x81,0x81,0x80,0x00]

],#使

0xe794a8:[

[0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00],

[0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00]

],#用

0xe78eb0:[

[0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0xFE,0x02,0x02,0xF2,0x02,0x02,0xFE,0x00,0x00],

[0x20,0x60,0x20,0x1F,0x10,0x90,0x40,0x23,0x18,0x06,0x01,0x7E,0x80,0x83,0xE0,0x00]

],#现

0xe59ca8:[

[0x08,0x08,0x88,0xC8,0x38,0x0C,0x0B,0x08,0x08,0xE8,0x08,0x08,0x08,0x08,0x08,0x00],

[0x02,0x01,0x00,0xFF,0x40,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x00]

],#在

0xe697b6:[

[0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00],

[0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00]

],#时

0xe997b4:[

[0x00,0xF8,0x01,0x06,0x00,0xF0,0x12,0x12,0x12,0xF2,0x02,0x02,0x02,0xFE,0x00,0x00],

[0x00,0xFF,0x00,0x00,0x00,0x1F,0x11,0x11,0x11,0x1F,0x00,0x40,0x80,0x7F,0x00,0x00]

], #间

0xe68891:[

[0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00],

[0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00]

], #我

0xe8909d:[

[0x02,0x02,0xF2,0x92,0x97,0xF2,0x92,0x92,0x92,0xF2,0x97,0x92,0xF2,0x02,0x02,0x00],

[0x00,0x80,0x88,0x88,0x44,0x4A,0x53,0x22,0x22,0x12,0x0A,0x06,0x00,0x00,0x00,0x00]

], #萝

0xe58d9c:[

[0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00],

[0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00]

], #卜

0xe699ba:[

[0x10,0x94,0x53,0x32,0x1E,0x32,0x52,0x10,0x00,0x7E,0x42,0x42,0x42,0x7E,0x00,0x00],

[0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00]

], #智

0xe883bd:[

[0x08,0xCC,0x4A,0x49,0x48,0x4A,0xCC,0x18,0x00,0x7F,0x88,0x88,0x84,0x82,0xE0,0x00],

[0x00,0xFF,0x12,0x12,0x52,0x92,0x7F,0x00,0x00,0x7E,0x88,0x88,0x84,0x82,0xE0,0x00]

],#能

0xe682a8:[

[0x20,0x10,0x08,0xFC,0x23,0x10,0x88,0x67,0x04,0xF4,0x04,0x24,0x54,0x8C,0x00,0x00],

[0x40,0x30,0x00,0x77,0x80,0x81,0x88,0xB2,0x84,0x83,0x80,0xE0,0x00,0x11,0x60,0x00]

],#您

0xe5bd93:[

[0x00,0x40,0x42,0x44,0x58,0x40,0x40,0x7F,0x40,0x40,0x50,0x48,0xC6,0x00,0x00,0x00],

[0x00,0x40,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00]

],#当

0xE5898D:[

[0x08,0x08,0xE8,0x29,0x2E,0x28,0xE8,0x08,0x08,0xC8,0x0C,0x0B,0xE8,0x08,0x08,0x00],

[0x00,0x00,0xFF,0x09,0x49,0x89,0x7F,0x00,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00]

]#前

}

#key 汉字的UTF-8码

#isBottom 确定这次是获取 某个字的 上半部分(0) 还是下半部分(1)

def get_chinese_utf8(self, key,isBottom = 0):

values = self.UTF8_CHINESE[key]

return values[isBottom]

三、显示“萝卜智能”的小实例

按照上面连接后,将tpyboard v102插入电脑usb,在TPFLASH内建立以下文件(可从文章后地址下载):

#font.py

class FONT6_8:

"""docstring for FONT6_8"""

FONTTYPE6_8 = [

[0x00, 0x00, 0x00, 0x00, 0x00, 0x00] # 20

,[0x00, 0x00, 0x00, 0x5f, 0x00, 0x00] # 21 !

,[0x00, 0x00, 0x07, 0x00, 0x07, 0x00] # 22 "

,[0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14] # 23 #

,[0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12] # 24 $

,[0x00, 0x23, 0x13, 0x08, 0x64, 0x62] # 25 %

,[0x00, 0x36, 0x49, 0x55, 0x22, 0x50] # 26 &

,[0x00, 0x00, 0x05, 0x03, 0x00, 0x00] # 27 '

,[0x00, 0x00, 0x1c, 0x22, 0x41, 0x00] # 28 (

,[0x00, 0x00, 0x41, 0x22, 0x1c, 0x00] # 29 )

,[0x00, 0x14, 0x08, 0x3e, 0x08, 0x14] # 2a *

,[0x00, 0x08, 0x08, 0x3e, 0x08, 0x08] # 2b +

,[0x00, 0x00, 0x50, 0x30, 0x00, 0x00] # 2c ,

,[0x00, 0x08, 0x08, 0x08, 0x08, 0x08] # 2d -

,[0x00, 0x00, 0x60, 0x60, 0x00, 0x00] # 2e .

,[0x00, 0x20, 0x10, 0x08, 0x04, 0x02] # 2f /

,[0x00, 0x3e, 0x51, 0x49, 0x45, 0x3e] # 30 0

,[0x00, 0x00, 0x42, 0x7f, 0x40, 0x00] # 31 1

,[0x00, 0x42, 0x61, 0x51, 0x49, 0x46] # 32 2

,[0x00, 0x21, 0x41, 0x45, 0x4b, 0x31] # 33 3

,[0x00, 0x18, 0x14, 0x12, 0x7f, 0x10] # 34 4

,[0x00, 0x27, 0x45, 0x45, 0x45, 0x39] # 35 5

,[0x00, 0x3c, 0x4a, 0x49, 0x49, 0x30] # 36 6

,[0x00, 0x01, 0x71, 0x09, 0x05, 0x03] # 37 7

,[0x00, 0x36, 0x49, 0x49, 0x49, 0x36] # 38 8

,[0x00, 0x06, 0x49, 0x49, 0x29, 0x1e] # 39 9

,[0x00, 0x00, 0x36, 0x36, 0x00, 0x00] # 3a :

,[0x00, 0x00, 0x56, 0x36, 0x00, 0x00] # 3b ;

,[0x00, 0x08, 0x14, 0x22, 0x41, 0x00] # 3c <

,[0x00, 0x14, 0x14, 0x14, 0x14, 0x14] # 3d =

,[0x00, 0x00, 0x41, 0x22, 0x14, 0x08] # 3e >

,[0x00, 0x02, 0x01, 0x51, 0x09, 0x06] # 3f ?

,[0x00, 0x32, 0x49, 0x79, 0x41, 0x3e] # 40 @

,[0x00, 0x7e, 0x11, 0x11, 0x11, 0x7e] # 41 A

,[0x00, 0x7f, 0x49, 0x49, 0x49, 0x36] # 42 B

,[0x00, 0x3e, 0x41, 0x41, 0x41, 0x22] # 43 C

,[0x00, 0x7f, 0x41, 0x41, 0x22, 0x1c] # 44 D

,[0x00, 0x7f, 0x49, 0x49, 0x49, 0x41] # 45 E

,[0x00, 0x7f, 0x09, 0x09, 0x09, 0x01] # 46 F

,[0x00, 0x3e, 0x41, 0x49, 0x49, 0x7a] # 47 G

,[0x00, 0x7f, 0x08, 0x08, 0x08, 0x7f] # 48 H

,[0x00, 0x00, 0x41, 0x7f, 0x41, 0x00] # 49 I

,[0x00, 0x20, 0x40, 0x41, 0x3f, 0x01] # 4a J

,[0x00, 0x7f, 0x08, 0x14, 0x22, 0x41] # 4b K

,[0x00, 0x7f, 0x40, 0x40, 0x40, 0x40] # 4c L

,[0x00, 0x7f, 0x02, 0x0c, 0x02, 0x7f] # 4d M

,[0x00, 0x7f, 0x04, 0x08, 0x10, 0x7f] # 4e N

,[0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e] # 4f O

,[0x00, 0x7f, 0x09, 0x09, 0x09, 0x06] # 50 P

,[0x00, 0x3e, 0x41, 0x51, 0x21, 0x5e] # 51 Q

,[0x00, 0x7f, 0x09, 0x19, 0x29, 0x46] # 52 R

,[0x00, 0x46, 0x49, 0x49, 0x49, 0x31] # 53 S

,[0x00, 0x01, 0x01, 0x7f, 0x01, 0x01] # 54 T

,[0x00, 0x3f, 0x40, 0x40, 0x40, 0x3f] # 55 U

,[0x00, 0x1f, 0x20, 0x40, 0x20, 0x1f] # 56 V

,[0x00, 0x3f, 0x40, 0x38, 0x40, 0x3f] # 57 W

,[0x00, 0x63, 0x14, 0x08, 0x14, 0x63] # 58 X

,[0x00, 0x07, 0x08, 0x70, 0x08, 0x07] # 59 Y

,[0x00, 0x61, 0x51, 0x49, 0x45, 0x43] # 5a Z

,[0x00, 0x00, 0x7f, 0x41, 0x41, 0x00] # 5b [

,[0x00, 0x02, 0x04, 0x08, 0x10, 0x20] # 5c \

,[0x00, 0x00, 0x41, 0x41, 0x7f, 0x00] # 5d ]

,[0x00, 0x04, 0x02, 0x01, 0x02, 0x04] # 5e ^

,[0x00, 0x40, 0x40, 0x40, 0x40, 0x40] # 5f _

,[0x00, 0x00, 0x01, 0x02, 0x04, 0x00] # 60 `

,[0x00, 0x20, 0x54, 0x54, 0x54, 0x78] # 61 a

,[0x00, 0x7f, 0x48, 0x44, 0x44, 0x38] # 62 b

,[0x00, 0x38, 0x44, 0x44, 0x44, 0x20] # 63 c

,[0x00, 0x38, 0x44, 0x44, 0x48, 0x7f] # 64 d

,[0x00, 0x38, 0x54, 0x54, 0x54, 0x18] # 65 e

,[0x00, 0x08, 0x7e, 0x09, 0x01, 0x02] # 66 f

,[0x00, 0x0c, 0x52, 0x52, 0x52, 0x3e] # 67 g

,[0x00, 0x7f, 0x08, 0x04, 0x04, 0x78] # 68 h

,[0x00, 0x00, 0x44, 0x7d, 0x40, 0x00] # 69 i

,[0x00, 0x20, 0x40, 0x44, 0x3d, 0x00] # 6a j

,[0x00, 0x7f, 0x10, 0x28, 0x44, 0x00] # 6b k

,[0x00, 0x00, 0x41, 0x7f, 0x40, 0x00] # 6c l

,[0x00, 0x7c, 0x04, 0x18, 0x04, 0x78] # 6d m

,[0x00, 0x7c, 0x08, 0x04, 0x04, 0x78] # 6e n

,[0x00, 0x38, 0x44, 0x44, 0x44, 0x38] # 6f o

,[0x00, 0x7c, 0x14, 0x14, 0x14, 0x08] # 70 p

,[0x00, 0x08, 0x14, 0x14, 0x18, 0x7c] # 71 q

,[0x00, 0x7c, 0x08, 0x04, 0x04, 0x08] # 72 r

,[0x00, 0x48, 0x54, 0x54, 0x54, 0x20] # 73 s

,[0x00, 0x04, 0x3f, 0x44, 0x40, 0x20] # 74 t

,[0x00, 0x3c, 0x40, 0x40, 0x20, 0x7c] # 75 u

,[0x00, 0x1c, 0x20, 0x40, 0x20, 0x1c] # 76 v

,[0x00, 0x3c, 0x40, 0x30, 0x40, 0x3c] # 77 w

,[0x00, 0x44, 0x28, 0x10, 0x28, 0x44] # 78 x

,[0x00, 0x0c, 0x50, 0x50, 0x50, 0x3c] # 79 y

,[0x00, 0x44, 0x64, 0x54, 0x4c, 0x44] # 7a z

,[0x00, 0x00, 0x08, 0x36, 0x41, 0x00] # 7b [

,[0x00, 0x00, 0x00, 0x7f, 0x00, 0x00] # 7c |

,[0x00, 0x00, 0x41, 0x36, 0x08, 0x00] # 7d ]

,[0x00, 0x10, 0x08, 0x08, 0x10, 0x08] # 7e ~

,[0x00, 0x78, 0x46, 0x41, 0x46, 0x78] # 7f (delete)

]

def get_font6_8(self, data):

return self.FONTTYPE6_8[bytearray(data)[0] - 0x20]

#chinese.py

class CN_UTF8:

"""docstring for CN_UTF8"""

#key:values

#key: 使用汉字的UTF-8码

#values: 16*16

# [0] 8*16 上半部分

# [1] 8*16 下半部分

UTF8_CHINESE = {

0xe6aca2:[

[0x04,0x24,0x44,0x84,0x64,0x9C,0x40,0x30,0x0F,0xC8,0x08,0x08,0x28,0x18,0x00,0x00],

[0x10,0x08,0x06,0x01,0x82,0x4C,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00]

],#欢

0xe8bf8e:[

[0x40,0x40,0x42,0xCC,0x00,0x00,0xFC,0x04,0x02,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00],

[0x00,0x40,0x20,0x1F,0x20,0x40,0x4F,0x44,0x42,0x40,0x7F,0x42,0x44,0x43,0x40,0x00]

],#迎

0xe4bdbf:[

[0x80,0x60,0xF8,0x07,0x04,0xE4,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0xE4,0x04,0x00],

[0x00,0x00,0xFF,0x00,0x80,0x81,0x45,0x29,0x11,0x2F,0x41,0x41,0x81,0x81,0x80,0x00]

],#使

0xe794a8:[

[0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00],

[0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00]

],#用

0xe78eb0:[

[0x04,0x84,0x84,0xFC,0x84,0x84,0x00,0xFE,0x02,0x02,0xF2,0x02,0x02,0xFE,0x00,0x00],

[0x20,0x60,0x20,0x1F,0x10,0x90,0x40,0x23,0x18,0x06,0x01,0x7E,0x80,0x83,0xE0,0x00]

],#现

0xe59ca8:[

[0x08,0x08,0x88,0xC8,0x38,0x0C,0x0B,0x08,0x08,0xE8,0x08,0x08,0x08,0x08,0x08,0x00],

[0x02,0x01,0x00,0xFF,0x40,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x00]

],#在

0xe697b6:[

[0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00],

[0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00]

],#时

0xe997b4:[

[0x00,0xF8,0x01,0x06,0x00,0xF0,0x12,0x12,0x12,0xF2,0x02,0x02,0x02,0xFE,0x00,0x00],

[0x00,0xFF,0x00,0x00,0x00,0x1F,0x11,0x11,0x11,0x1F,0x00,0x40,0x80,0x7F,0x00,0x00]

], #间

0xe68891:[

[0x20,0x24,0x24,0x24,0xFE,0x23,0x22,0x20,0x20,0xFF,0x20,0x22,0x2C,0xA0,0x20,0x00],

[0x00,0x08,0x48,0x84,0x7F,0x02,0x41,0x40,0x20,0x13,0x0C,0x14,0x22,0x41,0xF8,0x00]

], #我

0xe8909d:[

[0x02,0x02,0xF2,0x92,0x97,0xF2,0x92,0x92,0x92,0xF2,0x97,0x92,0xF2,0x02,0x02,0x00],

[0x00,0x80,0x88,0x88,0x44,0x4A,0x53,0x22,0x22,0x12,0x0A,0x06,0x00,0x00,0x00,0x00]

], #萝

0xe58d9c:[

[0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00],

[0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00]

], #卜

0xe699ba:[

[0x10,0x94,0x53,0x32,0x1E,0x32,0x52,0x10,0x00,0x7E,0x42,0x42,0x42,0x7E,0x00,0x00],

[0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,0x00]

], #智

0xe883bd:[

[0x08,0xCC,0x4A,0x49,0x48,0x4A,0xCC,0x18,0x00,0x7F,0x88,0x88,0x84,0x82,0xE0,0x00],

[0x00,0xFF,0x12,0x12,0x52,0x92,0x7F,0x00,0x00,0x7E,0x88,0x88,0x84,0x82,0xE0,0x00]

],#能

0xe682a8:[

[0x20,0x10,0x08,0xFC,0x23,0x10,0x88,0x67,0x04,0xF4,0x04,0x24,0x54,0x8C,0x00,0x00],

[0x40,0x30,0x00,0x77,0x80,0x81,0x88,0xB2,0x84,0x83,0x80,0xE0,0x00,0x11,0x60,0x00]

],#您

0xe5bd93:[

[0x00,0x40,0x42,0x44,0x58,0x40,0x40,0x7F,0x40,0x40,0x50,0x48,0xC6,0x00,0x00,0x00],

[0x00,0x40,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00]

],#当

0xE5898D:[

[0x08,0x08,0xE8,0x29,0x2E,0x28,0xE8,0x08,0x08,0xC8,0x0C,0x0B,0xE8,0x08,0x08,0x00],

[0x00,0x00,0xFF,0x09,0x49,0x89,0x7F,0x00,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00]

]#前

}

#key 汉字的UTF-8码

#isBottom 确定这次是获取 某个字的 上半部分(0) 还是下半部分(1)

def get_chinese_utf8(self, key,isBottom = 0):

values = self.UTF8_CHINESE[key]

return values[isBottom]

#upcd8544.py

# -*- coding: utf-8 -*-

"""

MicroPython PCD8544 driver

(for Nokia 5110 displays)

"""

__author__ = "Markus Birth"

__copyright__ = "Copyright 2015, Markus Birth"

__credits__ = ["Markus Birth"]

__license__ = "MIT"

__version__ = "1.0"

__maintainer__ = "Markus Birth"

__email__ = "markus@birth-online.de"

__status__ = "Production"

# Datasheet: https://www.sparkfun.com/datasheets/LCD/Monochrome/Nokia5110.pdf

# Inspiration from:

# - https://github.com/inaugurator/upyd5110

# - https://github.com/rm-hull/pcd8544/blob/master/src/lcd.py

#

# PINOUT

# WiPy/pyBoard display function

#

# 3V3 or any Pin => VCC 3.3V logic voltage (0=off, 1=on)

# MOSI => DIN data flow (Master out, Slave in)

# SCK => CLK SPI clock

# any Pin => RST Reset pin (0=reset, 1=normal)

# any Pin => CE Chip Enable (0=listen for input, 1=ignore input)

# any Pin => DC Data/Command (0=commands, 1=data)

# any Pin => LIGHT Light (0=on, 1=off)

# GND => GND

#

# pyBoard "Y" side

# SPI = pyb.SPI(1)

# RST = pyb.Pin('Y4')

# CE = pyb.Pin('Y5')

# DC = pyb.Pin('Y3')

# LIGHT = pyb.Pin('Y2')

# PWR = pyb.Pin('Y1')

#

# pyBoard "X" side

# SPI = pyb.SPI(2)

# RST = pyb.Pin('X4')

# CE = pyb.Pin('X5')

# DC = pyb.Pin('X3')

# LIGHT = pyb.Pin('X2')

# PWR = pyb.Pin('X1')

#

# WiPy (on Exp board, SD and User-LED jumper have to be removed!)

# SPI = machine.SPI(0) # GP14 (CLK) + GP16 (MOSI->DIN), User-LED jumper removed!

# RST = machine.Pin('GP24')

# CE = machine.Pin('GP12')

# DC = machine.Pin('GP22')

# LIGHT = machine.Pin('GP23')

# PWR = directly from 3V3 pin of the WiPy

try:

import pyb as machine

except:

# WiPy

import machine

import sys

import struct

import time

import font

import chinese

class PCD8544:

ADDRESSING_HORIZ = 0x00

ADDRESSING_VERT = 0x02

INSTR_BASIC = 0x00

INSTR_EXT = 0x01

POWER_UP = 0x00

POWER_DOWN = 0x04

DISPLAY_BLANK = 0x08

DISPLAY_ALL = 0x09

DISPLAY_NORMAL = 0x0c

DISPLAY_INVERSE = 0x0d

TEMP_COEFF_0 = 0x04

TEMP_COEFF_1 = 0x05

TEMP_COEFF_2 = 0x06

TEMP_COEFF_3 = 0x07

BIAS_1_4 = 0x17 # 1/4th

BIAS_1_5 = 0x16 # 1/5th

BIAS_1_6 = 0x15 # 1/6th

BIAS_1_7 = 0x14 # 1/7th

BIAS_1_8 = 0x13 # 1/8th

BIAS_1_9 = 0x12 # 1/9th

BIAS_1_10 = 0x11 # 1/10th

BIAS_1_11 = 0x10 # 1/11th

def __init__(self, spi, rst, ce, dc, light, pwr=None):

self.width = 84

self.height = 48

self.power = self.POWER_DOWN

self.addressing = self.ADDRESSING_HORIZ

self.instr = self.INSTR_BASIC

self.display_mode = self.DISPLAY_BLANK

self.temp_coeff = self.TEMP_COEFF_0

self.bias = self.BIAS_1_11

self.voltage = 3060

# init the SPI bus and pins

spi.init(spi.MASTER, baudrate=328125, bits=8, polarity=0, phase=1, firstbit=spi.MSB)

if "OUT_PP" in dir(rst):

# pyBoard style

rst.init(rst.OUT_PP, rst.PULL_NONE) # Reset line

ce.init(ce.OUT_PP, ce.PULL_NONE) # Chip Enable

dc.init(dc.OUT_PP, dc.PULL_NONE) # Data(1) / Command(0) mode

light.init(light.OUT_PP, light.PULL_NONE)

if pwr:

pwr.init(pwr.OUT_PP, pwr.PULL_NONE)

else:

# WiPy style

rst.init(rst.OUT, None)

ce.init(ce.OUT, None)

dc.init(dc.OUT, None)

light.init(light.OUT, None)

if pwr:

pwr.init(pwr.OUT, None)

self.spi = spi

self.rst = rst

self.ce = ce

self.dc = dc

self.light = light

self.pwr = pwr

self.light_off()

self.power_on()

self.ce.value(1) # set chip to disable (don't listen to input)

self.reset()

self.set_contrast(0xbf)

self.clear()

self.lcd_font = font.FONT6_8()

self.chinese = chinese.CN_UTF8()

def _set_function(self):

""" Write current power/addressing/instructionset values to lcd. """

value = 0x20 | self.power | self.addressing | self.instr

self.command([value])

def set_power(self, power, set=True):

""" Sets the power mode of the LCD controller """

assert power in [self.POWER_UP, self.POWER_DOWN], "Power must be POWER_UP or POWER_DOWN."

self.power = power

if set:

self._set_function()

def set_adressing(self, addr, set=True):

""" Sets the adressing mode """

assert addr in [self.ADDRESSING_HORIZ, self.ADDRESSING_VERT], "Addressing must be ADDRESSING_HORIZ or ADDRESSING_VERT."

self.addressing = addr

if set:

self._set_function()

def set_instr(self, instr, set=True):

""" Sets instruction set (basic/extended) """

assert instr in [self.INSTR_BASIC, self.INSTR_EXT], "Instr must be INSTR_BASIC or INSTR_EXT."

self.instr = instr

if set:

self._set_function()

def set_display(self, display_mode):

""" Sets display mode (blank, black, normal, inverse) """

assert display_mode in [self.DISPLAY_BLANK, self.DISPLAY_ALL, self.DISPLAY_NORMAL, self.DISPLAY_INVERSE], "Mode must be one of DISPLAY_BLANK, DISPLAY_ALL, DISPLAY_NORMAL or DISPLAY_INVERSE."

assert self.instr == self.INSTR_BASIC, "Please switch to basic instruction set first."

self.display_mode = display_mode

self.command([display_mode])

def set_temp_coeff(self, temp_coeff):

""" Sets temperature coefficient (0-3) """

assert 4 <= temp_coeff < 8, "Temperature coefficient must be one of TEMP_COEFF_0..TEMP_COEFF_3."

assert self.instr == self.INSTR_EXT, "Please switch to extended instruction set first."

self.temp_coeff = temp_coeff

self.command([temp_coeff])

def set_bias(self, bias):

""" Sets the LCD bias. """

assert 0x10 <= bias <= 0x17, "Bias must be one of BIAS_1_4..BIAS_1_11."

assert self.instr == self.INSTR_EXT, "Please switch to extended instruction set first."

self.bias = bias

self.command([bias])

def set_voltage(self, millivolts):

""" Sets the voltage of the LCD charge pump in millivolts. """

assert 3060 <= millivolts <= 10680, "Voltage must be between 3,060 and 10,680 mV."

assert self.instr == self.INSTR_EXT, "Please switch to extended instruction set first."

self.voltage = millivolts

basevoltage = millivolts - 3060

incrementor = basevoltage // 60

code = 0x80 & incrementor

self.command([code])

def set_contrast(self, value):

""" set LCD voltage, i.e. contrast """

assert 0x80 <= value <= 0xff, "contrast value must be between 0x80 and 0xff"

self.command([0x21, self.TEMP_COEFF_2, self.BIAS_1_7, value, 0x20, self.DISPLAY_NORMAL])

# 0x21 - enter extended instruction set (H=1)

# 0x06 - set temperature coefficient 2

# 0x14 - set BIAS system to n=3 (recomm. mux rate 1:40/1:34)

# value - (80-ff) - set Vop (80 = 3.00V, ff = 10.68V), 8b seems to work (0x3b/d70: 3.00+(70*0.06)=7.2V)

# 0x20 - back to basic instruction set

# 0x0c - normal display mode

def position(self, x, y):

""" set cursor to bank y, column x """

assert 0 <= x < self.width, "x must be between 0 and 83"

assert 0 <= y < self.height // 8, "y must be between 0 and 5"

assert self.instr == self.INSTR_BASIC, "Please switch to basic instruction set first."

self.command([x + 0x80, y + 0x40])

def clear(self):

""" clear screen """

self.position(0, 0)

self.data([0] * (self.height * self.width // 8))

self.position(0, 0)

def sleep_ms(self, mseconds):

try:

time.sleep_ms(mseconds)

except AttributeError:

machine.delay(mseconds)

def sleep_us(self, useconds):

try:

time.sleep_us(useconds)

except AttributeError:

machine.udelay(useconds)

def power_on(self):

if self.pwr:

self.pwr.value(1)

self.reset()

def reset(self):

""" issue reset impulse to reset the display """

self.rst.value(0) # RST on

self.sleep_us(100) # reset impulse has to be >100 ns and <100 ms

self.rst.value(1) # RST off

# Defaults after reset:

self.power = self.POWER_DOWN

self.addressing = self.ADDRESSING_HORIZ

self.instr = self.INSTR_BASIC

self.display_mode = self.DISPLAY_BLANK

self.temp_coeff = self.TEMP_COEFF_0

self.bias = self.BIAS_1_11

self.voltage = 3060

def power_off(self):

self.clear()

self.command([0x20, 0x08])

# 0x20 - basic instruction set

# 0x08 - set display to blank (doesn't delete contents)

self.sleep_ms(10)

if self.pwr:

self.pwr.value(0) # turn off power

def command(self, arr):

""" send bytes in command mode """

self.bitmap(arr, 0)

def data(self, arr):

""" send bytes in data mode """

self.bitmap(arr, 1)

def bitmap(self, arr, dc):

self.dc.value(dc)

buf = struct.pack('B'*len(arr), *arr)

self.ce.value(0) # set chip to listening/enable

try:

self.spi.send(buf)

except AttributeError:

self.spi.write(buf)

self.ce.value(1) # set chip to disable

def light_on(self):

self.light.value(0) # pull to GND

def light_off(self):

self.light.value(1) # set to HIGH

def lcd_write_string(self, string, x, y):

self.position(x,y)

for i in string:

self.data(self.lcd_font.get_font6_8(i))

def lcd_write_chineses(str,x,y,space = 9):

# i,j=0,0

# lsLen = len(str)

# while (j

# self.lcd_write_chinese(str[j],x+(i*space),y)

# i+=1

# j+=1

return 0

def lcd_write_chinese(self,data,x,y):

#获取 字 的UTF8码

code = 0x00 #赋初值

data_code = data.encode("UTF-8")

code |= data_code[0]<<16

code |= data_code[1]<<8

code |= data_code[2]

#获取 字 的UTF8码 END

self.position(x,y)

self.data(self.chinese.get_chinese_utf8(code,0))

self.position(x,y+1)

self.data(self.chinese.get_chinese_utf8(code,1))

#boot.py

# boot.py -- run on boot-up

# can run arbitrary Python, but best to keep it minimal

import machine

import pyb

#pyb.main('main.py') # main script to run after this one

#pyb.usb_mode('CDC+MSC') # act as a serial and a storage device

#pyb.usb_mode('CDC+HID') # act as a serial device and a mouse

#main.py

# main.py -- put your code here!

import pyb

import upcd8544

from machine import SPI,Pin

def main():

lcd_5110.lcd_write_chinese('萝',14,0)

lcd_5110.lcd_write_chinese('卜',30,0)

lcd_5110.lcd_write_chinese('智',46,0)

lcd_5110.lcd_write_chinese('能',62,0)

pyb.delay(1000)

if __name__ == '__main__':

SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK

RST = pyb.Pin('X1')

CE = pyb.Pin('X2')

DC = pyb.Pin('X3')

LIGHT = pyb.Pin('X4')

lcd_5110 = upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT)

while(1):

main()

实现效果如图:

以上提到的程序原代码及工具下载地址:https://pan.baidu.com/s/1eRZZd1C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值