为树莓派3B添加LCD1602液晶屏

树莓派3B针脚说明

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,液晶屏背光-,接地

调整电位器

  因为缺少1个5V的线,直接破皮拧一根进去就行,电位器调整到屏幕显示正常的对比度即可,第一次玩烙铁,焊的略丑…

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上。

效果图

参考链接

http://www.cnblogs.com/xiaowuyi/p/4051238.html
https://www.6zou.net/tech/raspberry-pi-lcd1602-system-monitor.html

原文地址:https://www.cnblogs.com/zhengAloha/p/8781530.html

时间: 2024-11-07 17:17:58

为树莓派3B添加LCD1602液晶屏的相关文章

树莓派3b添加python时间同步脚本

树莓派没有电池,因此断电后系统时间会停止,直到你开机后又继续计时. 因为项目需要用到本地时间,精度要求不高不想折腾(如果需要高精度,需要安装ntp),所以考虑用python脚本同步百度的时间,精度误差很小在0.5-1秒之内,需要网络支持. 1.创建python程序 sudo nano date.py 2.写入python代码 # -*- coding: UTF-8 -*- import os import time import httplib #获取远程服务器时间并同步本地 def get_w

LCD1602,4位数据总线液晶屏时钟,STC12C5A60S2的10位ADC功能程序

/* 程序名:   LCD1602,4位数据总线液晶屏时钟,STC12C5A60S2的10位ADC功能程序 编写时间: 2015年10月4日 硬件支持: LCD1602液晶屏  STC12C5A60S2 外部12MHZ晶振  接线定义:   DB7 --> P1^7              DB6 --> P1^6              DB5 --> P1^5              DB4 --> P1^5              RS  --> P3^2;  

51单片机学习笔记【五】——1602液晶屏

一.1602液晶屏基础 1.LCD1602简介 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母.数字.符号的点阵型液晶模块.它是由若干个5x7或者5x11的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片.本次使用型号为SMC1602A LCM的液晶屏. 2.LCD1602接口信号说明 3.控制接口说明 4.指令说明 二.实验例程 1.电路原理图 2.实验说明 本实验通

openvino:yolov3转换成tenserflow模型再转换成openvino模型,并用神经计算棒一代加速树莓派3b+

在转换yolo3是时遇到了问题: [ ERROR ]  List of operations that cannot be converted to IE IR:        [ ERROR ]      LeakyRelu (72)        [ ERROR ]          detector/darknet-53/Conv/LeakyRelu ........ [ ERROR ]  Part of the nodes was not translated to IE. Stoppe

树莓派3B 运行 LEDE(OPENWRT),使用vlan

1.树莓派3B的网卡: 内置一个无限网卡,内置一个有线以太网卡 2.下载LEDE固件: LEDE官网:https://lede-project.org/ http://downloads.lede-project.org/releases/17.01.2/targets/brcm2708/bcm2710/ 在下载界面根据这个路径选择合适的版本(目前17.01.2), lede-17.01.2-brcm2708-bcm2710-rpi-3-ext4-sdcard.img.gz 下载后解压, 使用E

s3c2440液晶屏驱动新内核 linux-4.1.24

自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev/s3c2410fb.c 先打开调试功能,这样内核在启动的时候,就可以输出这些信息,或者使用 dmesg 查看到这些信息.当然,你配置内核 make menuconfig 也可以打开,但是太麻烦了,不如这样. 1 #define CONFIG_FB_S3C2410_DEBUG 2 #define d

树莓派3B+搭建Nginx流媒体服务器

树莓派3B+搭建流媒体服务器 一.硬件准备 1)树莓派3B+ 2)配套电源 3)连接到网络 二.软件安装包 1)nginx源码包nginx-1.8.1.tar.gz 下载地址: http://nginx.org/download/nginx-1.8.1.tar.gz 2)h264数据流支持包nginx_mod_h264_streaming-2.2.7.tar.gz 下载地址: http://h264.code-shop.com/download/nginx_mod_h264_streaming-

51单片机实现SMC1602液晶屏显示实例

-------------------------------------------- LCD1602 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1602的意思是每行显示16个字符,一共可以显示两行.如果是12232液晶(图形型液晶)则表示由1

将树莓派3B+变成WiFi热点

我有一个树莓派3B+,安装的是官方的Raspbian Stretch操作系统,该系统和Debian 9很类似,很多命令都是通用的. 接下来我将演示如何利用树莓派搭建WiFi热点,此热点就和家里的无线路由器一样,手机.平板电脑等设备均可连接. 第一步:修改wlan0为静态IP 网卡的配置文件为:/etc/network/interfaces,这里我用vim编辑器打开此文件. 树莓派3B+有两个网卡:有线网卡(eth0)和无线网卡(wlan0).在这里我们主要是修改wlan0的配置信息,将其配置为静