搭配 树莓派 使用
硬件连接
| 模块引脚 | 树莓派(BCM) |
|---|---|
| VCC | 3.3V |
| GND | GND |
| MISO | 9 |
| MOSI | 10 |
| SCLK | 11 |
| LCS_CS | 8 |
| LCS_DC | 25 |
| LCS_RST | 27 |
| LCS_BL | 18 |
| TP_SDA | 2 |
| TP_SCL | 3 |
| TP_INT | 4 |
| TP_RST | 17 |
示例使用
开启SPI跟I2C接口
-
打开树莓派终端,输入以下指令进入配置界面
sudo raspi-config选择Interfacing Options -> SPI -> Yes 开启SPI接口选择Interfacing Options -> I2C -> Yes 开启I2C接口

然后重启树莓派:
sudo reboot
请确保SPI没有被其他的设备占用,你可以在/boot/config.txt中间检查
安装库
wiringPi
git clone https://github.com/WiringPi/WiringPi
cd WiringPi
./build
gpio -v
# 运行gpio -v会出现2.70版本,如果没有出现说明安装出错
Python
#python2
sudo apt-get update
sudo apt-get install python-pip
sudo apt-get install python-pil
sudo apt-get install python-numpy
sudo pip install RPi.GPIO
sudo pip install smbus
sudo pip install spidev
#python3
sudo apt-get update
sudo apt-get install python3-pip
sudo apt-get install python3-pil
sudo apt-get install python3-numpy
sudo pip3 install RPi.GPIO
sudo pip3 install smbus
sudo pip3 install spidev
下载测试程序
打开树莓派终端,执行:
sudo apt-get install unzip -y
cd ~
sudo wget https://www.waveshare.net/w/upload/f/fb/1.28inch_Touch_LCD_RPI.zip
sudo unzip ./1.28inch_Touch_LCD_RPI.zip
cd 1.28inch_Touch_LCD_RPI
运行测试程序
以下命令请在RaspberryPi下执行,否则不在索引不到目录;
C语言
-
重新编译,编译过程可能需要几秒
cd ~cd 1.28inch_Touch_LCD_RPI/csudo make cleansudo make -jsudo ./main
python
cd ~
cd 1.28inch_Touch_LCD_RPI/python/example
sudo python 1inch28_LCD_test.py
- 运行对应屏幕的程序即可,程序支持python2/3
API详解(请选读c或python部分)
RaspberryPi系列均可以共用一套程序,因为他们都是嵌入式系统,兼容性比较强。
程序分为底层硬件接口、中间层液晶屏驱动、上层应用;
C
底层硬件接口
我们进行了底层的封装,由于硬件平台不一样,内部的实现是不一样的,如果需要了解内部实现可以去对应的目录中查看
在DEV_Config.c(.h)可以看到很多定义,在目录:RaspberryPi\c\lib\Config
C语言使用了3种方式进行驱动:分别是BCM2835库、WiringPi库和Dev库
默认使用WiringPi库进行操作,因为BCM2835库跟Dev库目前没有外部中断
-
数据类型:
#define UBYTE uint8_t#define UWORD uint16_t#define UDOUBLE uint32_t -
模块初始化与退出的处理:
void DEV_Module_Init(void);void DEV_Module_Exit(void);注意:1.这里是处理使用液晶屏前与使用完之后一些GPIO的处理。 -
GPIO读写:
void DEV_Digital_Write(UWORD Pin, UBYTE Value);UBYTE DEV_Digital_Read(UWORD Pin); -
SPI写数据
void DEV_SPI_WriteByte(UBYTE Value);
上层应用
对于屏幕而言,如果需要进行画图、显示中英文字符、显示图片等怎么办,这些都是上层应用做的。这有很多小伙伴有问到一些图形的处理,我们这里提供了一些基本的功能 在如下的目录中可以找到GUI,在目录:RaspberryPi\c\lib\GUI\GUI_Paint.c(.h)
在如下目录下是GUI依赖的字符字体,在目录:RaspberryPi\c\lib\Fonts

-
新建图像属性:新建一个图像属性,这个属性包括图像缓存的名称、宽度、高度、翻转角度、颜色
void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color)参数:image : 图像缓存的名称,实际上是一个指向图像缓存首地址的指针;Width : 图像缓存的宽度;Height: 图像缓存的高度;Rotate:图像的翻转的角度Color :图像的初始颜色; -
选择图像缓存:选择图像缓存,选择的目的是你可以创建多个图像属性,图像缓存可以存在多个,你可以选择你所创建的每一张图像
void Paint_SelectImage(UBYTE *image)参数:image: 图像缓存的名称,实际上是一个指向图像缓存首地址的指针; -
设置点在缓存中显示位置和颜色:这里是GUI最核心的一个函数、处理点在缓存中显示位置和颜色;
void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color)参数:Xpoint: 点在图像缓存中X位置Ypoint: 点在图像缓存中Y位置Color : 点显示的颜色 -
图像缓存填充颜色:把图像缓存填充为某颜色,一般作为屏幕刷白的作用
void Paint_Clear(UWORD Color)参数:Color: 填充的颜色 -
图像缓存部分窗口填充颜色:把图像缓存的某部分窗口填充为某颜色,一般作为窗口刷白的作用,常用于时间的显示,刷白上一秒
void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color)参数:Xstart: 窗口的X起点坐标Ystart: 窗口的Y起点坐标Xend: 窗口的X终点坐标Yend: 窗口的Y终点坐标Color: 填充的颜色 -
画点:在图像缓存中,在(Xpoint, Ypoint)上画点,可以选择颜色,点的大小,点的风格
void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style)参数:Xpoint: 点的X坐标Ypoint: 点的Y坐标Color: 填充的颜色Dot_Pixel: 点的大小,提供默认的8种大小点typedef enum {DOT_PIXEL_1X1 = 1, // 1 x 1DOT_PIXEL_2X2 , // 2 X 2DOT_PIXEL_3X3 , // 3 X 3DOT_PIXEL_4X4 , // 4 X 4DOT_PIXEL_5X5 , // 5 X 5DOT_PIXEL_6X6 , // 6 X 6DOT_PIXEL_7X7 , // 7 X 7DOT_PIXEL_8X8 , // 8 X 8} DOT_PIXEL;Dot_Style: 点的风格,大小扩充方式是以点为中心扩大还是以点为左下角往右上扩大typedef enum {DOT_FILL_AROUND = 1,DOT_FILL_RIGHTUP,} DOT_STYLE; -
画线:在图像缓存中,从 (Xstart, Ystart) 到 (Xend, Yend) 画线,可以选择颜色,线的宽度,线的风格
void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, LINE_STYLE Line_Style , LINE_STYLE Line_Style)参数:Xstart: 线的X起点坐标Ystart: 线的Y起点坐标Xend: 线的X终点坐标Yend: 线的Y终点坐标Color: 填充的颜色Line_width: 线的宽度,提供默认的8种宽度typedef enum {DOT_PIXEL_1X1 = 1, // 1 x 1DOT_PIXEL_2X2 , // 2 X 2DOT_PIXEL_3X3 , // 3 X 3DOT_PIXEL_4X4 , // 4 X 4DOT_PIXEL_5X5 , // 5 X 5DOT_PIXEL_6X6 , // 6 X 6DOT_PIXEL_7X7 , // 7 X 7DOT_PIXEL_8X8 , // 8 X 8} DOT_PIXEL;Line_Style: 线的风格,选择线是以直线连接还是以虚线的方式连接typedef enum {LINE_STYLE_SOLID = 0,LINE_STYLE_DOTTED,} LINE_STYLE; -
画矩形:在图像缓存中,从 (Xstart, Ystart) 到 (Xend, Yend) 画一个矩形,可以选择颜色,线的宽度,是否填充矩形内部
void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)参数:Xstart: 矩形的X起点坐标Ystart: 矩形的Y起点坐标Xend: 矩形的X终点坐标Yend: 矩形的Y终点坐标Color: 填充的颜色Line_width: 矩形四边的宽度,提供默认的8种宽度typedef enum {DOT_PIXEL_1X1 = 1, // 1 x 1DOT_PIXEL_2X2 , // 2 X 2DOT_PIXEL_3X3 , // 3 X 3DOT_PIXEL_4X4 , // 4 X 4DOT_PIXEL_5X5 , // 5 X 5DOT_PIXEL_6X6 , // 6 X 6DOT_PIXEL_7X7 , // 7 X 7DOT_PIXEL_8X8 , // 8 X 8} DOT_PIXEL;Draw_Fill: 填充,是否填充矩形的内部typedef enum {DRAW_FILL_EMPTY = 0,DRAW_FILL_FULL,} DRAW_FILL; -
画圆:在图像缓存中,以 (X_Center Y_Center) 为圆心,画一个半径为Radius的圆,可以选择颜色,线的宽度,是否填充圆内部
void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)参数:X_Center: 圆心的X坐标Y_Center: 圆心的Y坐标Radius:圆的半径Color: 填充的颜色Line_width: 圆弧的宽度,提供默认的8种宽度typedef enum {DOT_PIXEL_1X1 = 1, // 1 x 1DOT_PIXEL_2X2 , // 2 X 2DOT_PIXEL_3X3 , // 3 X 3DOT_PIXEL_4X4 , // 4 X 4DOT_PIXEL_5X5 , // 5 X 5DOT_PIXEL_6X6 , // 6 X 6DOT_PIXEL_7X7 , // 7 X 7DOT_PIXEL_8X8 , // 8 X 8} DOT_PIXEL;Draw_Fill: 填充,是否填充圆的内部typedef enum {DRAW_FILL_EMPTY = 0,DRAW_FILL_FULL,} DRAW_FILL; -
写Ascii字符:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一个Ascii字符,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Ascii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)参数:Xstart: 字符的左顶点X坐标Ystart: 字体的左顶点Y坐标Ascii_Char:Ascii字符Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:font8:5*8的字体font12:7*12的字体font16:11*16的字体font20:14*20的字体font24:17*24的字体Color_Foreground: 字体颜色Color_Background: 背景颜色 -
写英文字符串:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串英文字符,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)参数:Xstart: 字符的左顶点X坐标Ystart: 字体的左顶点Y坐标pString:字符串,字符串是一个指针Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:font8:5*8的字体font12:7*12的字体font16:11*16的字体font20:14*20的字体font24:17*24的字体Color_Foreground: 字体颜色Color_Background: 背景颜色 -
写中文字符串:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串中文字符,可以选择GB2312编码字符字库、字体前景色、字体背景色;
void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background)参数:Xstart: 字符的左顶点X坐标Ystart: 字体的左顶点Y坐标pString:字符串,字符串是一个指针Font: GB2312编码字符字库,在Fonts文件夹中提供了以下字体:font12CN:ascii字符字体11*21,中文字体16*21font24CN:ascii字符字体24*41,中文字体32*41Color_Foreground: 字体颜色Color_Background: 背景颜色 -
写数字:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串数字,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)参数:Xstart: 字符的左顶点X坐标Ystart: 字体的左顶点Y坐标Nummber:显示的数字,这里使用的是32位长的int型保存,可以最大显示到2147483647Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:font8:5*8的字体font12:7*12的字体font16:11*16的字体font20:14*20的字体font24:17*24的字体Color_Foreground: 字体颜色Color_Background: 背景颜色 -
写带小数的数字:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串数字可以带小数的数字,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawFloatNum(UWORD Xpoint, UWORD Ypoint, double Nummber, UBYTE Decimal_Point, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background);参数:Xstart: 字符的左顶点X坐标Ystart: 字体的左顶点Y坐标Nummber:显示的数字,这里使用的是double型保存,足够普通需求Decimal_Point:显示小数点后几位数字Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:font8:5*8的字体font12:7*12的字体font16:11*16的字体font20:14*20的字体font24:17*24的字体Color_Foreground: 字体颜色Color_Background: 背景颜色 -
显示时间:在图像缓存中,在 (Xstart Ystart) 为左顶点,显示一段时间,可以选择Ascii码可视字符字库、字体前景色、字体背景色;
void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Background, UWORD Color_Foreground)参数:Xstart: 字符的左顶点X坐标Ystart: 字体的左顶点Y坐标pTime:显示的时间,这里定义好了一个时间的结构体,只要把时分秒各位数传给参数;Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:font8:5*8的字体font12:7*12的字体font16:11*16的字体font20:14*20的字体font24:17*24的字体Color_Foreground: 字体颜色Color_Background: 背景颜色 -
读取本地的bmp图片并写到缓存中
对于Raspberry Pi这些Linux操作系统的,可以读写图片
对于Raspberry Pi,在目录:RaspberryPi\c\lib\GUI\GUI_BMPfile.c(.h)
UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart)
参数:
path:BMP图片的相对路径
Xstart: 图片的左顶点X坐标,一般默认传0
Ystart: 图片的左顶点Y坐标,一般默认传0
用户测试代码
前三个章节介绍了经典的linux三层代码结构,这里稍微讲解一下用户测试代码
对于Raspberry Pi,在目录:RPI\c\examples;
如果需要运行测试程序,你需要运行mian程序
在linux命令模式下重新执行如下:
make clean
make -j
sudo ./main
Python(适用于Raspberry Pi)
适用于python和python3
对于python而言他的调用没有C复杂
Raspberry Pi:RPI\python\lib\
lcdconfig.py
-
模块初始化与退出的处理:
def module_init()def Touch_module_init()def module_exit()注意:1.这里是处理使用液晶屏前与使用完之后一些GPIO的处理。2.module_init()跟Touch_module_init()函数会分别在液晶屏跟触摸屏的init()初始化程序自动调用,但module_exit()需要自行调用 -
GPIO读写
def digital_write(pin, value)def digital_read(pin) -
SPI写数据
def spi_writebyte(data) -
I2C读写数据
def i2c_write_byte( Addr, val)def i2c_read_byte(Addr)
python在如下目录:
RPI\python\examples\
在linux命令模式下重新执行如下:
sudo python 1inch28_LCD_test.py
画图GUI
由于python有一个image库pil官方库链接,他十分的强大,不需要像C从逻辑层出发编写代码,可以直接引用image库进行图像处理,以下将以1.54inch LCD为例,对程序中使用了的进行简要说明
-
需要使用image库,需要安装库
sudo apt-get install python3-pil 安装库
然后导入库
from PIL import Image,ImageDraw,ImageFont
其中Image为基本库、ImageDraw为画图功能、ImageFont为文字
-
定义一个图像缓存,以方便在图片上进行画图、写字等功能
image1 = Image.new("RGB", (disp.width, disp.height), "WHITE")
第一个参数定义图片的颜色深度,定义为"RGB"说明是RGB888彩色图,第二个参数是一个元组,定义好图片的宽度和高度,第三个参数是定义缓存的默认颜色,定义为“WHITE”。
-
创建一个基于image1的画图对象,所有的画图操作都在这个对象上
draw = ImageDraw.Draw(image1) -
画线
draw.line([(20, 10),(70, 60)], fill = "RED",width = 1)
第一个参数为一个4个元素的元组,以(20,10)为起始点,(70,60)为终止点,画一条直线,fill="RED"表示线为红色,width=1表示线宽为1个像素。
-
画框
draw.rectangle([(20,10),(70,60)],fill = "WHITE",outline="BLUE")
第一个参数为一个4个元素的元组,(20,10)矩形左上角坐标值,(70,60)为矩形右下角坐标值,fill= "WHITE"表示内部填充黑色,outline="BLUE"表示外边框为蓝色。
-
画圆
draw.arc((150,15,190,55),0, 360, fill =(0,255,0))
在正方形内画一个内切圆,第一个参数为一个4个元素的元组,以(150,15)为正方形的左上角顶点,(190,55)为正方形右下角顶点,规定矩形框的水平中位线为0度角,角度顺时针变大,第二个参数表示开始角度,第三个参数标识结束角度,fill =(0,255,0)表示线为绿色
如果不是正方形,画出来的就是椭圆,这个实际上是圆弧的绘制。
除了arc可以画圆之外,还有ellipse可以画实心圆
draw.ellipse((150,65,190,105), fill = (0,255,0))
实质是椭圆的绘制,第一个参数指定弦的圆外切矩形,fill =(0,255,0)表示内部填充颜色为绿色,如果椭圆的外切矩阵为正方形,椭圆就是圆了。
- 写字符
写字符往往需要写不同大小的字符,需要导入ImageFont模块,并实例化:
Font1 = ImageFont.truetype("../Font/Font01.ttf",25)
Font2 = ImageFont.truetype("../Font/Font01.ttf",35)
Font3 = ImageFont.truetype("../Font/Font02.ttf",32)
为了有比较好的视觉体验,这里使用的是来自网络的免费字体,如果是其他的ttf结尾的字库文件也是支持的。
注:每字库包含的字符均有不同;如果某些字符不能显示,建议根据字库使用的编码集来使用
写英文字符直接使用即可,写中文,由于编码是GB2312所以需要在前面加个u:
draw.text((40, 50), 'WaveShare', fill = (128,255,128),font=Font2)
text= u"微雪电子"
draw.text((74, 150),text, fill = "WHITE",font=Font3)
第一个参数为一个2个元素的元组,以(40,50)为左顶点,字体为Font2,fill为字体颜色,你可以直接让 fill = "WHITE",因为常规的颜色的值已经定义好了,当然你也可以使用fill = (128,255,128),括号里对应的是RGB三种颜色的值,这样你就能精确的控制你想要的颜色。第二句显示微雪电子,使用Font3,字体颜色为白色。
-
读取本地图片
image = Image.open('../pic/LCD_1inch28.jpg')
参数为图片路径。
- 其他功能
python的image库十分强大,如果需要实现其他的更多功能,可以上官网学习http://effbot.org/imagingbook pil,官方的是英文的,如果感觉对你不友好,当然我们国内也有很多的优秀的博客都有讲解。