用于 Nokia3310/5110 PCD8544 单色 LCD 显示屏的 Swift 库
此库是 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 模块的引脚排列很可能与上面显示的有所不同,请查看您的数据手册)
因此,我们需要做的第一件事是使用 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()
x
和 y
参数指定在 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()
这涵盖了该库可以做的所有事情。
要在 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
运行该二进制文件。