5110LCD_PCD8544.swift

用于 Nokia3310/5110 PCD8544 单色 LCD 显示屏的 Swift 库

Linux-only Swift 4 compatible License: BSD

LCD with Swift logo

摘要

此库是 Limor Fried/Ladyada(Adafruit Industries) 的原始 PCD8544 C++ 库的扩展 Swift 移植版本。使用此库,您将能够在 Nokia 3110/5110 84x48 单色 LCD 显示屏上绘制单个像素、显示文本(多种字体)、单色图像和透明精灵。

该库需要 5 个 GPIO 输出才能驱动显示屏,其中两个将充当软件 SPI(您不需要硬件 SPI 即可使用此库,但如果 SwiftyGPIO 为您的板卡提供支持,则可以使用它)。

支持的板卡

SwiftyGPIO 支持的每个板卡:Raspberry Pi、BeagleBone、C.H.I.P. 等...

要使用此库,您需要一个运行 Swift 3.x/4.x 的 Linux ARM 板卡,此库的旧 Swift 2.x 版本可在特定分支上找到。

下面的示例将使用 CHIP 板卡,但您可以轻松修改示例以使用其他受支持的板卡之一,Chip 和 RaspberryPi2(使用更快的硬件 SPI)的完整工作演示项目可在 Examples 目录中找到。

用法

此示例使用 C.H.I.P. 板卡及其前 5 个 GPIO,连接方式如下所示,但您可以使用 GPIOs(for:) (例如 .RaspberryPi2) 轻松更改所选的板卡,并选择不同的 GPIO 集。

LCD diagram

(您的 LCD 模块的引脚排列很可能与上面显示的有所不同,请查看您的数据手册)

因此,我们需要做的第一件事是使用 SwiftyGPIO 配置 7 个 GPIO

import SwiftyGPIO
import PCD8544

let gpios = SwiftyGPIO.GPIOs(for: .CHIP)
var sclk = gpios[.P0]!
var dnmosi = gpios[.P1]!
var dnmiso = gpios[.P5]!
var cs = gpios[.P6]!

var dc = gpios[.P2]!
var sce = gpios[.P3]!
var rst = gpios[.P4]!

接下来,让我们创建一个虚拟 SPI 以将数据发送到显示屏

var spi = VirtualSPI(mosiGPIO: dnmosi, misoGPIO: dnmiso, clockGPIO: sclk, csGPIO: cs)

请注意,如果您的板卡具有硬件 SPI 且 SwiftyGPIO 支持它(即每个 Raspberry Pi 板卡),您可以创建硬件 SPI 对象的实例(至少快一个数量级)

//The hardware SPI has MOSI in .P10 and SCLK in .P11
let spis = SwiftyGPIO.hardwareSPIs(for: .RaspberryPi2)
var spi = spis?[0]!

然后,创建我们将用于与 LCD 交互的显示对象

var lcd = PCD8544(spi:spi,dc:dc,rst:rst,cs:sce)

就这样,一切都设置好了,让我们看看我们可以在显示屏上做什么

设置单个像素

lcd.setPixel(x:20,y:20,color:.BLACK)
lcd.setPixel(x:30,y:30,color:.BLACK)
lcd.setPixel(x:10,y:10,color:.WHITE)
lcd.display()

setPixel 函数在给定的坐标处绘制单个像素。.WHITE 表示透明背景,.BLACK 表示不透明像素。要更新显示屏,请始终在完成后调用 .display()

清除显示屏

lcd.clearDisplay()

要清除显示屏,只需调用 .clearDisplay()

绘制图像

要绘制图像,请使用位图缓冲区(在此处创建更多单色位图图像

lcd.draw(image:swift_logo,x:0,y:0,width:LCDWIDTH,height:LCDHEIGHT)
lcd.display()

xy 参数指定在 84x48 网格内的位置,而后两个参数分别是图像的宽度和高度。缓冲区是一个 UInt8 缓冲区,大小等于 width*height,大小无效的缓冲区将被忽略。

如果未指定其他参数,则图像是不透明的,即白色像素将覆盖其后面的内容,但如果您需要绘制透明图像(例如,游戏精灵),请添加 transparent:true 参数。

这里我们正在一系列水平线上方显示 Swift 徽标

let alllines=[UInt8](repeating: 0xAA, count:LCDHEIGHT*LCDWIDTH/8)
lcd.draw(image:alllines,x:0,y:0,width:LCDWIDTH,height:LCDHEIGHT)
lcd.draw(image:swift_logo,x:0,y:0,width:LCDWIDTH,height:LCDHEIGHT,transparent:true)
lcd.display()

文本和字体

此库允许使用位图字体显示字符串。包含两种字体:Tiny_Font 和 SinclairS(可以在此处找到或生成更多字体)。

要显示一些文本,您需要首先加载字体,并且该字体将用于所有后续字符串

lcd.loadFontAsDefault(font:SinclairS_Font,fontWidth:8,fontHeight:8)

要绘制字符串,只需使用一些文本和位置调用 draw

lcd.draw(text:"HelloWorld",x:0,y:0)
lcd.display()

这涵盖了该库可以做的所有事情。

启用硬件 SPI

要在 Raspberry Pi 上启用 SPI,请查看 SwiftyGPIO Wiki

示例

示例在 Examples 目录中提供。

安装

有关 Swift 安装说明,请参阅 SwiftyGPIO 自述文件。

一旦您的板卡运行 Swift,如果您的版本支持 Swift Package Manager,您可以简单地将此库添加为项目的依赖项,并使用 swift build 进行编译

let package = Package(
    name: "MyProject",
    dependencies: [
	.Package(url: "https://github.com/uraimo/5110LCD_PCD8544.swift.git", majorVersion: 2),
	...
    ]
    ...
) 

目录 Examples 包含使用 SPM 的示例项目,编译它并使用 sudo ./.build/debug/Test5110 运行示例。

如果不支持 SPM,您需要手动下载库及其依赖项

wget https://raw.githubusercontent.com/uraimo/5110lcd_pcd8544.swift/master/Sources/5110lcd_pcd8544.swift https://raw.githubusercontent.com/uraimo/5110lcd_pcd8544.swift/master/Sources/font.swift https://raw.githubusercontent.com/uraimo/SwiftyGPIO/master/Sources/SwiftyGPIO.swift https://raw.githubusercontent.com/uraimo/SwiftyGPIO/master/Sources/Presets.swift https://raw.githubusercontent.com/uraimo/SwiftyGPIO/master/Sources/SunXi.swift https://raw.githubusercontent.com/uraimo/SwiftyGPIO/master/Sources/SPI.swift

一旦下载了所有文件,创建一个额外的文件,其中将包含您的应用程序代码(例如 main.swift)。当您的代码准备就绪后,使用以下命令编译它

swiftc *.swift

编译器将创建一个 main 可执行文件。

由于一切都与 GPIO 交互,如果您还不是 root 用户,您将需要使用 sudo ./main 运行该二进制文件。