树莓派 1602A显示屏

标签: 树莓派 1602a 显示屏 | 发表时间:2018-02-02 20:11 | 作者:iaiai
出处:http://www.iteye.com
树莓派 1602A显示屏

下面代码本人测试过没有问题,开始运行完屏幕上什么也没有显示出来,后来调整了下电位器可以了,所以大家如果按着下面的做出来之后运行什么也没有显示的话,记得调整下电位器



LCD1602接线说明
VSS,接地
VDD,接5V电源
VO,液晶对比度调节,接电位器中间的引脚,电位器两边的引脚分别接5V和接地。
RS,寄存器选择,接GPIO14
RW,读写选择,接地,表示写模式
EN,使能信号,接GPIO15
D0,数据位0,4位工作模式下不用,不接
D1,数据位1,4位工作模式下不用,不接
D2,数据位2,4位工作模式下不用,不接
D3,数据位3,4位工作模式下不用,不接
D4,数据位4,接GPIO17
D5,数据位5,接GPIO18
D6,数据位6,接GPIO27
D7,数据位7,接GPIO22
A,液晶屏背光+,接5V
K,液晶屏背光-,接地

一共就两个文件

lcd1602.py
#!/usr/bin/python
 
#
# based on code from lrvick and LiquidCrystal
# lrvic - https://github.com/lrvick/raspi-hd44780/blob/master/hd44780.py
# LiquidCrystal - https://github.com/arduino/Arduino/blob/master/libraries/LiquidCrystal/LiquidCrystal.cpp
#
 
from time import sleep
 
class lcd1602:
 
    # commands
    LCD_CLEARDISPLAY 		= 0x01
    LCD_RETURNHOME 		= 0x02
    LCD_ENTRYMODESET 		= 0x04
    LCD_DISPLAYCONTROL 		= 0x08
    LCD_CURSORSHIFT 		= 0x10
    LCD_FUNCTIONSET 		= 0x20
    LCD_SETCGRAMADDR 		= 0x40
    LCD_SETDDRAMADDR 		= 0x80
 
    # flags for display entry mode
    LCD_ENTRYRIGHT 		= 0x00
    LCD_ENTRYLEFT 		= 0x02
    LCD_ENTRYSHIFTINCREMENT 	= 0x01
    LCD_ENTRYSHIFTDECREMENT 	= 0x00
 
    # flags for display on/off control
    LCD_DISPLAYON 		= 0x04
    LCD_DISPLAYOFF 		= 0x00
    LCD_CURSORON 		= 0x02
    LCD_CURSOROFF 		= 0x00
    LCD_BLINKON 		= 0x01
    LCD_BLINKOFF 		= 0x00
 
    # flags for display/cursor shift
    LCD_DISPLAYMOVE 		= 0x08
    LCD_CURSORMOVE 		= 0x00
 
    # flags for display/cursor shift
    LCD_DISPLAYMOVE 		= 0x08
    LCD_CURSORMOVE 		= 0x00
    LCD_MOVERIGHT 		= 0x04
    LCD_MOVELEFT 		= 0x00
 
    # flags for function set
    LCD_8BITMODE 		= 0x10
    LCD_4BITMODE 		= 0x00
    LCD_2LINE 			= 0x08
    LCD_1LINE 			= 0x00
    LCD_5x10DOTS 		= 0x04
    LCD_5x8DOTS 		= 0x00
 
 
 
    def __init__(self, pin_rs=14, pin_e=15, pins_db=[17, 18, 27, 22], GPIO = None):
	# Emulate the old behavior of using RPi.GPIO if we haven't been given
	# an explicit GPIO interface to use
	if not GPIO:
	    import RPi.GPIO as GPIO
   	self.GPIO = GPIO
        self.pin_rs = pin_rs
        self.pin_e = pin_e
        self.pins_db = pins_db
 
        self.GPIO.setmode(GPIO.BCM)
        self.GPIO.setwarnings(False)
        self.GPIO.setup(self.pin_e, GPIO.OUT)
        self.GPIO.setup(self.pin_rs, GPIO.OUT)
 
	for pin in self.pins_db:
            self.GPIO.setup(pin, GPIO.OUT)
 
	self.write4bits(0x33) # initialization
	self.write4bits(0x32) # initialization
	self.write4bits(0x28) # 2 line 5x7 matrix
	self.write4bits(0x0C) # turn cursor off 0x0E to enable cursor
	self.write4bits(0x06) # shift cursor right
 
	self.displaycontrol = self.LCD_DISPLAYON | self.LCD_CURSOROFF | self.LCD_BLINKOFF
 
	self.displayfunction = self.LCD_4BITMODE | self.LCD_1LINE | self.LCD_5x8DOTS
	self.displayfunction |= self.LCD_2LINE
 
	""" Initialize to default text direction (for romance languages) """
	self.displaymode =  self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT
	self.write4bits(self.LCD_ENTRYMODESET | self.displaymode) #  set the entry mode
 
        self.clear()
 
 
    def begin(self, cols, lines):
 
	if (lines > 1):
		self.numlines = lines
    		self.displayfunction |= self.LCD_2LINE
		self.currline = 0
 
 
    def home(self):
 
	self.write4bits(self.LCD_RETURNHOME) # set cursor position to zero
	self.delayMicroseconds(3000) # this command takes a long time!
 
 
    def clear(self):
 
	self.write4bits(self.LCD_CLEARDISPLAY) # command to clear display
	self.delayMicroseconds(3000)	# 3000 microsecond sleep, clearing the display takes a long time
 
 
    def setCursor(self, col, row):
 
	self.row_offsets = [ 0x00, 0x40, 0x14, 0x54 ]
 
	if ( row > self.numlines ): 
		row = self.numlines - 1 # we count rows starting w/0
 
	self.write4bits(self.LCD_SETDDRAMADDR | (col + self.row_offsets[row]))
 
 
    def noDisplay(self): 
	""" Turn the display off (quickly) """
 
	self.displaycontrol &= ~self.LCD_DISPLAYON
	self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)
 
 
    def display(self):
	""" Turn the display on (quickly) """
 
	self.displaycontrol |= self.LCD_DISPLAYON
	self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)
 
 
    def noCursor(self):
	""" Turns the underline cursor on/off """
 
	self.displaycontrol &= ~self.LCD_CURSORON
	self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)
 
 
    def cursor(self):
	""" Cursor On """
 
	self.displaycontrol |= self.LCD_CURSORON
	self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)
 
 
    def noBlink(self):
	""" Turn on and off the blinking cursor """
 
	self.displaycontrol &= ~self.LCD_BLINKON
	self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)
 
 
    def noBlink(self):
	""" Turn on and off the blinking cursor """
 
	self.displaycontrol &= ~self.LCD_BLINKON
	self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)
 
 
    def DisplayLeft(self):
	""" These commands scroll the display without changing the RAM """
 
	self.write4bits(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVELEFT)
 
 
    def scrollDisplayRight(self):
	""" These commands scroll the display without changing the RAM """
 
	self.write4bits(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVERIGHT);
 
 
    def leftToRight(self):
	""" This is for text that flows Left to Right """
 
	self.displaymode |= self.LCD_ENTRYLEFT
	self.write4bits(self.LCD_ENTRYMODESET | self.displaymode);
 
 
    def rightToLeft(self):
	""" This is for text that flows Right to Left """
	self.displaymode &= ~self.LCD_ENTRYLEFT
	self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)
 
 
    def autoscroll(self):
	""" This will 'right justify' text from the cursor """
 
	self.displaymode |= self.LCD_ENTRYSHIFTINCREMENT
	self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)
 
 
    def noAutoscroll(self): 
	""" This will 'left justify' text from the cursor """
 
	self.displaymode &= ~self.LCD_ENTRYSHIFTINCREMENT
	self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)
 
 
    def write4bits(self, bits, char_mode=False):
        """ Send command to LCD """
 
	self.delayMicroseconds(1000) # 1000 microsecond sleep
 
        bits=bin(bits)[2:].zfill(8)
 
        self.GPIO.output(self.pin_rs, char_mode)
 
        for pin in self.pins_db:
            self.GPIO.output(pin, False)
 
        for i in range(4):
            if bits[i] == "1":
                self.GPIO.output(self.pins_db[::-1][i], True)
 
	self.pulseEnable()
 
        for pin in self.pins_db:
            self.GPIO.output(pin, False)
 
        for i in range(4,8):
            if bits[i] == "1":
                self.GPIO.output(self.pins_db[::-1][i-4], True)
 
	self.pulseEnable()
 
 
    def delayMicroseconds(self, microseconds):
	seconds = microseconds / float(1000000)	# divide microseconds by 1 million for seconds
	sleep(seconds)
 
 
    def pulseEnable(self):
	self.GPIO.output(self.pin_e, False)
	self.delayMicroseconds(1)		# 1 microsecond pause - enable pulse must be > 450ns 
	self.GPIO.output(self.pin_e, True)
	self.delayMicroseconds(1)		# 1 microsecond pause - enable pulse must be > 450ns 
	self.GPIO.output(self.pin_e, False)
	self.delayMicroseconds(1)		# commands need > 37us to settle
 
 
    def message(self, text):
        """ Send string to LCD. Newline wraps to second line"""
 
        for char in text:
            if char == '\n':
                self.write4bits(0xC0) # next line
            else:
                self.write4bits(ord(char),True)
 
 
if __name__ == '__main__':
 
    lcd = lcd1602()
    lcd.clear()
    lcd.message("hello world!")


1602.py
#!/usr/bin/python
 
from lcd1602 import *
from datetime import *
import commands
 
def get_cpu_temp():
    tmp = open('/sys/class/thermal/thermal_zone0/temp')
    cpu = tmp.read()
    tmp.close()
    return '{:.2f}'.format( float(cpu)/1000 ) + ' C'
 
def get_gpu_temp():
    tmp = commands.getoutput('vcgencmd measure_temp|awk -F= \'{print $2}\'').replace('\'C','')
    gpu = float(tmp)
    return '{:.2f}'.format( gpu ) + ' C'
 
def get_time_now():
    return datetime.now().strftime('    %H:%M:%S\n   %Y-%m-%d')
 
def get_ip_info():
    return commands.getoutput('ifconfig wlan0|grep inet|awk -Faddr: \'{print $2}\'|awk \'{print $1}\'')
 
def get_mem_info():
    total= commands.getoutput('free -m|grep Mem:|awk \'{print $2}\'')  
    free = commands.getoutput('free -m|grep cache:|awk \'{print $4}\'')
    return 'MEM:\n    ' + free +' / '+ total +' M'
 
lcd = lcd1602()
lcd.clear()
 
if __name__ == '__main__':
 
    while(1):
        lcd.clear()
        lcd.message( get_ip_info() )
        sleep(5)
 
        lcd.clear()
        lcd.message( get_time_now() )
        sleep(5)
 
        lcd.clear()
        lcd.message( get_mem_info() )
        sleep(5)
 
        lcd.clear()
        lcd.message( 'CPU: ' + get_cpu_temp()+'\n' )
        lcd.message( 'GPU: ' + get_gpu_temp() )
        sleep(5)


将以上两个文件保存在同一个目录下,运行1602.py即可打印信息到LCD上。
自己看看代码就会用了

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [树莓派 1602a 显示屏] 推荐:

树莓派 1602A显示屏

- - 编程语言 - ITeye博客
树莓派 1602A显示屏. 下面代码本人测试过没有问题,开始运行完屏幕上什么也没有显示出来,后来调整了下电位器可以了,所以大家如果按着下面的做出来之后运行什么也没有显示的话,记得调整下电位器. VO,液晶对比度调节,接电位器中间的引脚,电位器两边的引脚分别接5V和接地. RS,寄存器选择,接GPIO14.

树莓派初级折腾

- - 极客范 - GeekFan.net
前些天在网上买了一个二手的树莓派 裸板子190包邮 (新品套装280 360什么的太贵了啊岂可修). 到手目测没有问题 主IC还有一个铜质散热片 不错. 电源就用买移动电源送的充电器(标称5v 1000mA输出 )和数据线. SD卡么… 把很久没玩的PSP掏出来 把马甲卡中的东西倒到记忆棒里 记忆棒插回PSP TF卡装到转接卡上 (话说还是个class10的呢).

安装树莓派 Raspberry PI

- - CSDN博客综合推荐文章
树莓派终于到货了,是这个样子的. 上面有一行日期是 Raspberry PI (c) 2011.12. 选择这个镜像: RASPBIAN Debian 2014-01-07. 780M的压缩包,很大的样子. 似乎还有个NOOBS的安装方式,完全无感. 顺便展示一下SD卡,通过查阅可用SD卡列表,似乎是支持个别的64G Class10的卡的,就像这个,编号是 Transcend SDXC 64G Class10 TS64GSDXC10.

在树莓派上用python控制LED

- - 极客范 - GeekFan.net
初步学习RPi.GPIO模块的过程中写了一个控制8个LED的模块,基本上只是一个对RPi.GPIO的一个封装. 一个已经安装配置好了的树莓派. 连接控制树莓派所用的其他必须设备. 按照电路图所示,在面包板上进行连接. 首先得确定RPi.GPIO已安装. 最新的系统已经自带了,如果没有的可以使用命令.

PiLarm: 便携式树莓派警报器

- - 极客范 - GeekFan.net
我一直在寻找一些能给自己孩子带来教益的瞬间. 当我五岁的儿子来寻求我的帮助,别再让他的弟弟偷偷溜进他的房间的时候,我突然灵光一现,发现这是教他关于输入、输出和其他一些编程知识的绝佳时机. 而且让他在解决自己实际问题中学习这些也会相对容易. 我本来可以用很多不同的方法来建立一个简单的警报系统,但是我想要让这个系统是一体化的并且在功能上不止能满足我儿子最初的原始需求.

树莓派的10个最佳资源

- - 极客范 - GeekFan.net
如果还没有找到答案,你是时候要从线上或者线下的资源寻找一些想法和项目,来帮助你将树莓派的潜能完全发掘出来. 树莓派没有内置的操作系统,也经常甚至连存储设备都没有. 但树莓派已经被证明了是一个非常成功的小型计算设备. 而很多学校(树莓派的目标用户),狂热爱好者,和那些想要打造一个小型家庭影音中心(包括其他设备)的用户都将树莓派作为他们的一个选择.

树莓派2 折腾记录

- - 操作系统 - ITeye博客
淘宝买来的 树莓派2代 B型. 这玩意还分国产和UK产,价格差距在10-20左右 不过不超过200. 另外就是要单独配个 5V2A 的电源,可选外壳和散热片,必备的是 TF 卡,可以用8G,我直接用的 32G TF 卡. 这玩意安装比较麻烦,简单的说第一次进系统你需要显示器,他只有HDMI接口,可以考虑用 HDMI转VGA连显示器,要么就直接HDMI连液晶电视(我就用的电视装的).

树莓派快速入门指南

- - C++博客-牵着老婆满街逛
转载自:http://segmentfault.com/a/1190000002587653. 接触树莓派已经有一年多的时间了,主要用于Linux服务器. 前一段时间树莓派2发售了,树莓派又小火了一把. 现在我介绍一下我的经验,希望对于各位读者有多帮助吧. 不过还是建议用吧,能省下不少工作. 这里下载喜欢的镜像,我选择的是RASPBIAN,Debian大法好.

树莓派搭建 HomeKit 服务

- - Harttle Land
最近总有朋友问我 Apple Home 是怎么搭建的,这篇文章提供给从零开始搭建 Apple Home 的朋友. 可以自选传感器、空气净化器、以及智能开关等设备,通过树莓派接入到苹果内置的 Home 应用中. 从 iOS 8(2014年9月)开始,苹果内置了 名为 Home 的应用,让 iPhone/iPad 可以控制智能设备.

采访树莓派之父Eben Upton的10个问题——记在树莓派诞生两周年之际

- - 极客范 - GeekFan.net
作为庆祝树莓派2周岁生日的活动之一,我采访了 Eben Upton,树莓派之父和树莓派基金会前任委托人. – Stett Holbrook,MAKE杂志高级编辑. 两年了,你看到了哪些树莓派在教育贡献方面的变化,并且你如何衡量成功. 这确实是一个有意思的问题. 如果两年前你问我如何衡量成功,我可能会说是出货数量.