树莓派GPIO入门11-驱动液晶屏幕(一)
树莓派GPIO入门11-驱动液晶屏幕(一)http://blog.mangolovecarrot.net/2016/01/30/raspi-study1101/
本系列将驱动一块1.44"的128x128像素的彩色液晶屏幕。
并分几个篇幅分别讲述如何使其显示色块,英文数字,汉字以及图片。
本文是系列的第一篇,目标是点亮屏幕并显示指定色块。
最终效果
硬件
- 1.44英寸 spi接口 128x128液晶屏幕 X 1(淘宝10-20元)
先上代码看效果
这次直接上代码,大家自己复制代码保存为py文件。文件名无所谓。
#!/usr/bin/env pythonimport RPi.GPIO as GPIO
import timecs=23 # 片选
rs=17 # 数据 / 命令 切换
sda=13 # 数据
scl=19 # 时钟
reset=27 # 复位# 传输byte
def setByteData(data):# print ""# print "S-----------setByte---------------:", hex(data)for bit in range(0,8):# 传入的数字从高位到低位依次判断是否为1,若为1则设置高电平,否则设置低电平# 判断的方法是先向左移位,把要判断的位移动到最高位然后跟0x80(1000 0000)相与,# 如果结果仍然是0x80(1000 0000)就表示最高位是1,否则最高位就是0if ((data<<bit) & 0x80 == 0x80):setBitData(True)# print "1",else:setBitData(False)# print "0",# print ""# print "E-----------setByte---------------"def setBitData(data):GPIO.output(scl, False)GPIO.output(sda, data)GPIO.output(scl, True)def write_command(cmd):GPIO.output(cs, False)GPIO.output(rs, False)setByteData(cmd)GPIO.output(cs, True)def write_data(data):GPIO.output(cs, False)GPIO.output(rs, True)setByteData(data)GPIO.output(cs, True)def write_data_16bit(dataH, dataL):write_data(dataH)write_data(dataL)def lcd_reset():GPIO.output(reset, False)time.sleep(0.1)GPIO.output(reset, True)time.sleep(0.1)def lcd_init():lcd_reset()write_command(0x11) # Exit Sleeptime.sleep(0.02)write_command(0x26) # Set Default Gammawrite_data(0x04)write_command(0xB1)# Set Frame Ratewrite_data(0x0e)write_data(0x10)write_command(0xC0) # Set VRH1[4:0] & VC[2:0] for VCI1 & GVDDwrite_data(0x08)write_data(0x00)write_command(0xC1) # Set BT[2:0] for AVDD & VCL & VGH & VGLwrite_data(0x05)write_command(0xC5) # Set VMH[6:0] & VML[6:0] for VOMH & VCOMLwrite_data(0x38)write_data(0x40)write_command(0x3a) # Set Color Formatwrite_data(0x05)write_command(0x36) # RGBwrite_data(0xc8)write_command(0x2A) # Set Column Addresswrite_data(0x00)write_data(0x00)write_data(0x00)write_data(0x7F)write_command(0x2B) # Set Page Addresswrite_data(0x00)write_data(0x00)write_data(0x00)write_data(0x7F)write_command(0xB4) write_data(0x00)write_command(0xf2) # Enable Gamma bitwrite_data(0x01)write_command(0xE0) write_data(0x3f)# p1write_data(0x22)# p2write_data(0x20)# p3write_data(0x30)# p4write_data(0x29)# p5write_data(0x0c)# p6write_data(0x4e)# p7write_data(0xb7)# p8write_data(0x3c)# p9write_data(0x19)# p10write_data(0x22)# p11write_data(0x1e)# p12write_data(0x02)# p13write_data(0x01)# p14write_data(0x00)# p15write_command(0xE1) write_data(0x00)# p1write_data(0x1b)# p2write_data(0x1f)# p3write_data(0x0f)# p4write_data(0x16)# p5write_data(0x13)# p6write_data(0x31)# p7write_data(0x84)# p8write_data(0x43)# p9write_data(0x06)# p10write_data(0x1d)# p11write_data(0x21)# p12write_data(0x3d)# p13write_data(0x3e)# p14write_data(0x3f)# p15write_command(0x29) # Display Onwrite_command(0x2C)def show_single_color(DH,DL):for i in xrange(0,128):for j in xrange(0,128):write_data_16bit(DH,DL)try:GPIO.setmode(GPIO.BCM)GPIO.setup(cs, GPIO.OUT)GPIO.setup(rs, GPIO.OUT)GPIO.setup(sda, GPIO.OUT)GPIO.setup(scl, GPIO.OUT)GPIO.setup(reset, GPIO.OUT)lcd_init()write_command(0x2C)show_single_color(0xf8,0x00) # 红色背景while True:passexcept KeyboardInterrupt:pass# 清理GPIO口
GPIO.cleanup()
然后,按下表连接液晶屏和树莓派。(连接完以后屏幕应该是白屏状态)
液晶屏 |树莓派
----------|----------------------------
LCD |3.3V(不可以是5V!!)
SCK |GPIO19
SDA |GPIO13
AO |GPIO17
RESET |GPIO27
CS |GPIO23
GND |GND
VCC |3.3V(不可以是5V!!)
然后,执行!
sudo python prog.py
不出意外,你应该能看到屏幕被慢慢地扫描刷新成红屏了!!!
原理说明
想要跟硬件通信,给硬件发送指令,首先要搞清楚硬件的通信协议。
对于屏幕来说,其通信协议是由屏幕的主控IC芯片决定的,不同的主控IC芯片有不同的通信协议,也就是发送指令的方法。
不过,即使是不同的屏幕,也有可能使用同一款(或同系列)主控IC。
所以拿到一块屏幕首先要搞清楚这块屏幕使用的是哪种主控IC,谷歌,百度都可以,最方便的是问卖家。。。
本文使用的屏幕的主控IC是ST7735S,文末提供数据手册下载。
简单来说,通过SDA数据引脚和SCLK时钟引脚串行输入(从第一篇学习过来的一定不陌生)不同的指令数据就可以控制屏幕的输出。
指令数据分成两种,指令种类数据和指令内容数据。每次发送指令都是先发送指令种类再发送指令内容。
有点拗口,比如说我告诉屏幕“接下来我要改变屏幕颜色啦”,接着你发送了一串数字,硬件接收到这串数字后会作为一个颜色值应用在屏幕上。如果你告诉屏幕“接下来我要改变屏幕的亮度啦”,接着你又发送了一串数字,这次硬件接收到这一串数字后会作为亮度值应用在屏幕上。这么说你再不明白我就。。。。
再回过头来看代码:
def write_command(cmd):GPIO.output(cs, False)GPIO.output(rs, False)setByteData(cmd)GPIO.output(cs, True)def write_data(data):GPIO.output(cs, False)GPIO.output(rs, True)setByteData(data)GPIO.output(cs, True)
上面这两个函数,一个用来发送指令种类,一个用来发送指令内容。区别仅仅在于rs引脚的电平高低不同。
另外,屏幕初始化函数lcd_init()里有一堆命令,天书一般,光是看就晕了。
别晕,这些代码大多只用执行一遍,最开始不必关心,照葫芦画瓢即可。
下面是你需要注意的关键指令种类和内容:
- 0x2A:指定绘图指针的列起始和结束地址(X坐标范围)
指令内容是4个字节的32位数据,从高位到低位分别是
起始X坐标高8位
起始X坐标低8位
结束X坐标高8位
结束X坐标低8位 - 0x2B:指定绘图指针的行起始和结束地址(Y坐标范围)
指令内容是4个字节的32位数据,从高位到低位分别是
起始Y坐标高8位
起始Y坐标低8位
结束Y坐标高8位
结束Y坐标低8位
下面的代码设定的范围是(0,0)-(127, 127),也就是全屏幕。
write_command(0x2A) # Set Column Address
write_data(0x00)
write_data(0x00)
write_data(0x00)
write_data(0x7F)
write_command(0x2B) # Set Page Address
write_data(0x00)
write_data(0x00)
write_data(0x00)
write_data(0x7F)
- 0x2C:在当前指针位置(X,Y坐标)绘制指定颜色的像素点
指令内容是2个字节的颜色数据。
每次执行完一个像素点的绘色以后,硬件会根据设定好的开始坐标和结束坐标自动移动绘图指针到下一个位置,遇到边界自动换行。
下面的代码的意义是连续绘制128 X 128个像素点,并且颜色为红色(#0xF800)。
write_command(0x2C)
show_single_color(0xf8,0x00) # 红色背景
...
...
def show_single_color(DH,DL):for i in xrange(0,128):for j in xrange(0,128):write_data_16bit(DH,DL)
这就是本文示例代码显示红屏的原理。
其实只要学会了这3个命令的使用,基本上啥都能显示了,无非是效率问题。给大家留个作业,自己完成本文开头的最终效果彩带。
本节到此结束,下一节我们继续讨论。
关于颜色的补充说明
有人问博主0xF800是什么鬼?红色难道不应该是0xFF0000吗?
这里就引出一个RGB颜色数据格式的问题,0xF800和0xFF0000都是红色,只是格式不一样。
我们常见的0xFF0000这种格式一共是24位,红绿蓝各用8位表示,所以红色就是FF,00,00。
而本文使用的是另一种叫RGB565的格式,这种格式一共只有16位,红绿蓝分别使用5位6位5位。
根据上图,红色应该是11111000 00000000,也就是0xF800。
其实,这款彩屏支持以下3种颜色格式
- 4k Colors, RGB 4,4,4
3AH=“03h”
write_command(0x3a)
write_data(0x03)
- 65k Colors, RGB 5,6,5
3AH=“05h”(本文使用的格式)
write_command(0x3a)
write_data(0x05)
- 262k Colors, RGB 6,6,6
3AH=“06h”
write_command(0x3a)
write_data(0x06)
详细内容请自己参考文档(9.8 Data Color Coding)。
资源下载
主控IC芯片ST7735S资料
- « 树莓派GPIO入门10-使用TLC5940芯片输出多路PWM
- 树莓派GPIO入门11-驱动液晶屏幕(二) »
添加新评论
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_question.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_razz.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_sad.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_evil.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_exclaim.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_smile.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_redface.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_biggrin.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_surprised.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_eek.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_confused.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_cool.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_lol.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_mad.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_twisted.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_rolleyes.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_wink.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_idea.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_arrow.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_neutral.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_cry.gif)
![](http://blog.mangolovecarrot.net/usr/plugins/Smilies/wp-smilies/icon_mrgreen.gif)
昵称
邮箱
网站
提交评论
站点地图 网站地图
Copyright © 2015-2017 芒果爱吃胡萝卜
Powered by Typecho&Sgreen主题
树莓派GPIO入门11-驱动液晶屏幕(一)相关推荐
- 树莓派GPIO入门(五) :简易电子钟
一.实验要求 利用树莓派驱动数码管,使其能显示时间和日期.通过按键,可以在时间和日期之间切换 二.实验材料 按键1个 4位8段数码管(共阴极) 1个 杜邦线若干 树莓派4B.RPi.GPIO库 三.原 ...
- 树莓派GPIO入门(一):点亮一个LED灯
一.实验要求 点亮一个LED灯是电子开发最常见的入门实验.本次实验分为三个小实验: (1)点亮单个LED灯,并让其亮暗闪烁 (2)通过脉宽调制(PWM)点亮单个LED灯,并让其亮暗闪烁 (3)让LED ...
- [RPi]树莓派GPIO入门之控制LED灯
本文部分资料及图片来自网络 一.所需材料 树莓派4B.LED灯.面包板.杜邦线.电阻.Python程序 二.认识硬件材料 这里介绍下LED灯.面包板.杜邦线.电阻 LED灯:LED灯引脚长的一端为正极 ...
- 树莓派GPIO入门(三) :多种模式的LED控制器
一.实验要求 通过LED控制器可以在流水点亮.间隔点亮.追逐点亮.全部亮并闪烁这四种模式中选择点亮LED灯的方式. 其中,↓表示有键按下,1 表示无键按下,x 表示不管有没有按键: 流水点亮即为 LE ...
- 树莓派驱动数码管c 语言,树莓派GPIO入门05-驱动数码管显示数字
标准的数码管从显示内容上分7段和8段数码管两种.8段比7段多一个右下角的小数点.还有一些其他特殊的如可以显示米字形的数码管不在本文讨论范围内,其实原理都是一样的. 8段数码管由8个发光二极管组成,其中 ...
- 树莓派GPIO驱动原理
1.前言 最近认真学习了树莓派,从浅到深认真分析了wiringPi实现代码,借助树莓派学习linux收获颇丰.深入学习linux一段时间后发现它非常有魅力,一个简单的IO口输出操作尽有那么多的&quo ...
- 树莓派python界面qt_树莓派QT入门教程——使用Qt开发界面程序控制GPIO
树莓派QT入门教程--使用Qt开发界面程序控制GPIO 玩转树莓派2017-07-12 12:36 树莓派入门教程--使用Qt开发界面程序 前言 Qt是一个1991年由奇趣科技开发的跨平台C++图形用 ...
- Raspberry Pi 4B树莓派 |#入门教程02# 树莓派GPIO控制(Python、C)
树莓派GPIO编号方式 功能物理引脚 从左到右,从上到下:左边奇数,右边偶数:1-40 通过打开终端窗口并运行命令,可以在Raspberry Pi上访问方便的参考pinout.该工具由GPIO零 Py ...
- 树莓派python gpio图形_树莓派GPIO功能学习
前言 树莓派现在越来越火,网上树莓派的资料也越来越多.树莓派的学习可以分为linux系统学习和linux驱动学习,利用树莓派制作LED流水灯应该算是驱动学习吧.树莓派来自国外,国外嵌入式开源领域具备良 ...
最新文章
- python买什么书-希望更加深入了解python 有什么书可以推荐?
- php如何获取js文本框内的内容,js获取input标签的输入值(实例代码)
- 两个datatable之间的复制
- python方法_Python中的通用__eq __()方法
- HttpClient 学习整理(转)
- [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]
- 分享一个基于jQuery,backbone.js和underscore.js的消息提示框架 - Backbone.Notifier
- 吴孟超:用一生为理想去奋斗 丨纪念吴孟超医生
- python可以做特效吗_学习mel语言,Python,JavaScript到什么程度才能做一下大型特效,要自已开发插件脚本呢?...
- *循环单链表[带头结点]
- C语言输入密码为6位,C语言中如何实现输入密码?(在输入时显示为*号.)
- 20号:JAVA的值传递与引用传递的正确理解
- VC++ (MFC)调用 C#生成DLL的方法
- c语言表达式4 6的值是,C语言中,为什么指针表达式的值+1.对应的地址值却+4?/为什么两个数组元素的地址相减之差不为地址之差?...
- Spring 事务模型
- MACD顶背离和底背离是什么(图解)
- 混合策略改进鲸鱼优化算法-附代码
- 爱因斯坦论宗教与自然科学的关系
- 云班课计算机基础测试题,云班课在高职计算机基础微课教学中应用探究.doc
- Joel Spolsky在耶鲁大学的演讲(上)