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

转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 

欢迎加入讨论群 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文件中(该文件可从文章后面的网址下载),如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//<strong>转载请注明:@小五义<a href="http://www.cnblogs.com/xiaowuyi">http://www.cnblogs.com/xiaowuyi  </a>QQ群:64770604</strong>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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//<strong>转载请注明:@小五义<a href="http://www.cnblogs.com/xiaowuyi">http://www.cnblogs.com/xiaowuyi  </a>QQ群:64770604</strong>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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
//<strong>转载请注明:@小五义<a href="http://www.cnblogs.com/xiaowuyi">http://www.cnblogs.com/xiaowuyi  </a>QQ群:64770604</strong># -*- 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<lsLen)
            # 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

1
2
3
4
5
6
7
8
//<strong>转载请注明:@小五义<a href="http://www.cnblogs.com/xiaowuyi">http://www.cnblogs.com/xiaowuyi  </a>QQ群:64770604</strong># 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//<strong>转载请注明:@小五义<a href="http://www.cnblogs.com/xiaowuyi">http://www.cnblogs.com/xiaowuyi  </a>QQ群:64770604</strong># 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

posted @   小五义  阅读(2698)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示