树莓派1602lcd实验

为利用学习单片机时留下的1602lcd,在树莓派下尝试使用,查找资料时发现了李凡希大神的博客早有记载,故利用他的实验代码,仿照搭建了下。其博客原地址为:https://www.freemindworld.com/blog/2013/130310_raspberry_pi_with_lcd.shtml

LCD1602液晶屏模块提供了16个引脚,我们只需接其中的12个即可:

1. VSS,接地,RPi PIN 6
 2. VDD,接5V电源,PRi PIN 2
 3. VO,液晶对比度调节,接电位器中间的引脚
 4. RS,寄存器选择,接GPIO 14,RPi PIN 8
 5. RW,读写选择,接地,表示写模式,PRi PIN 6
 6. EN,使能信号,接GPIO 15,RPi PIN 10
 7. D0,数据位0,4位工作模式下不用,不接
 8. D1,数据位1,4位工作模式下不用,不接
 9. D2,数据位2,4位工作模式下不用,不接
 10. D3,数据位3,4位工作模式下不用,不接
 11. D4,数据位4,接GPIO 17,RPi PIN 11
 12. D5,数据位5,接GPIO 18,RPi PIN 12
 13. D6,数据位6,接GPIO 27,RPi PIN 13
 14. D7,数据位7,接GPIO 22,RPi PIN 15
 15. A,液晶屏背光+,接5V,RPi PIN 2
 16. K,液晶屏背光-,接地,RPi PIN 6

注意:
1.请注意GIPO引脚编号与Raspberry Pi上P1扩展口的PIN编号的区别,别搞混了。
2.如果你的液晶屏没有背光,则15,16脚可能不会引出,也就不用接线。
3.LCD1602工作电压是5V,而RPi的GPIO口工作电压是3.3V,所以RW脚请确保接地进入写模式,否则尝试从LCD1602读取数据可能会烧掉RPi。
4.VO脚接的是电位器,电位器的另外两个脚分别接5V和地。通过调节这个电位器,可以调节液晶屏的对比度。
5.Raspberry Pi有Rev 1和Rev 2两个版本,它们对于PIN 13的定义是不同的。市面上现在大部分都是Rev 2版本,PIN 13对应GPIO 27。如果你的RPi是老的Rev 1版本,PIN 13对应是GPIO 21,你需要调整程序中的参数,把27改为21。

以上基本沿用

代码如下:

#!/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 Adafruit_CharLCD:

    # 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.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 = Adafruit_CharLCD()

    lcd.clear()
    lcd.message(" LCD 1602 Test \n123456789ABCDEF")
时间: 2024-10-08 10:44:50

树莓派1602lcd实验的相关文章

【树莓派】实验1:GPIO点亮led灯

详细请参考网友博文. 实验目的:控制GPIO,点亮一个led灯 实验步骤: 1.使用wiscp传输GPIO的库文件(下载地址)到树莓派中,并解压(可以像windows操作一样解压,或者使用命令行解压). 2.解压后,可以看到其中有一个文件setup.py 使用命令行切换到此文件的路径:cd /home/pi/Downloads/RPi.GPIO-0.6.3 再使用命令行安装setup.py: sudo python setup.py install 3.编写GPIO程序 1 import RPi

树莓派启动:for Mac

树莓派启动 实验器材: 硬件准备: 实验主板一块(树莓派): 5V/1A电源一个(手机电源): microUSB线一根: USB-TTL串口线一根(FT232RL芯片或PL2303芯片). PC一台(Mac OS): 路由器 软件需求: PC上的USB-TTL串口线配套的驱动程序 PC上的串口终端软件:minicom PC上的SSH软件(Mac自带) 交叉编译软件 实验步骤: 硬件准备: 连接串口线:串口线黑线接地,白线接GPIO14,绿线接GPIO15,示意图如下: 电源由手机电源提供 下载一

共享充电,是雪中送炭还是暗藏危险?——恶意充电宝实验

重温一遍今年的315晚会.看完只想骂一句奸商!晚会上披露了一个可以通过充电控制用户手机的内容,作为离了手机就丢了半条命的现代人,经常会遇到在外手机没电借别人充电器.充电宝的情况.借到了你以为是遇上了好人,也很有可能是被卖了还帮着数钱.作为网络安全维护者的我们,为了防止更多的人上当,我们要坚决地披露这种行为.不过视频中的控制方式不是很清晰,刚好实验室到了一批树莓派(卡片式电脑),于是决定用树莓派进行本次实验. 准备材料 需要的材料如下图所示:(这个有毒的充电宝中主要是树莓派carry全场,2.3.

实验一:认识树莓派

实验器材 硬件 树莓派板子一块: 5V/1A电源一个: microUSB线一根: USB-TTL串口线一根(FT232RL芯片或PL2303芯片). PC(Windows/MacOS/Linux)一台: 以太网线一根: 路由器一台 软件 PC上的USB-TTL串口线配套的驱动程序: PC上的串口终端软件putty等: PC上的SSH软件putty等: sftp传输软件FileZilla: 交叉编译软件: samba.samba-common-bin软件. 实验步骤 1.给出拷贝得到的pcDuin

树莓派+12864液晶视频播放实验

树莓派+12864液晶视频播放实验 51单片机学习笔记:ST7920控制器的12864液晶使用总结 总结: 1. 控制芯片不同,液晶接口定义,或者寄存器定义也可能不同 2. 显示方式有并行和串行,串行方式据说不能读数据寄存器(DR),那指令暂存器IR是否可读? 3. 含字库芯片显示字符时不必对字符取模了,但字库有可能缺斤少两,就是说有一部分字(哪怕是常用字),在字库中没有,如果你第一次测试代码就遇到该字在字库中没有的情况,建议去买体育彩票,支持体育运动! 4. 对芯片的结构地址一定要理解清楚,个

树莓派研发笔记 一

树莓派组装及操作系统安装 一.树莓派原件 1.Raspberry Pi 2 Model B 开发板 2.SD卡(本次实验项目选用内存为8G的SD卡) 3.网线一根 4.HDMI连接线1根 5.液晶显示屏 6.电源 7.USB无线网卡 二.安装系统 1.SD卡格式化 用读卡器将SD卡与PC相连,在WINDOWS环境下使用SDFormatter,将SD卡格式化. 2.下载系统压缩包 去树莓派官网下载,地址为http://www.raspberrypi.org/downloads,下载NOOBS_v1

用树莓派实现环境监测自动上传微博(一)

实验环境: 树莓派2b+ 操作系统:Raspbian Jessie 4.4, 下载地址: https://www.raspberrypi.org/downloads/raspbian/ 传感器: DHT11温湿度传感器 usb无线网卡一个 这个小项目的目的是: 树莓派通过DHT11传感器获取温度和湿度信息, 然后将其上传微博. 具体可以分为如下三个部分: 树莓派的联网 使用python上传微博 使用wiringPi库操作树莓派GPIO获取传感器数据 其中, 程序主体使用c语言, 上传微博部分由p

树莓派玩耍笔记3 -- LCD1602显示篇

LCD1602是一块成本低廉的输出设备,它有着体积小.操作简单.功耗低等优点,所以在一些DIY 产品上会用它来输出一些信息.昨天在使用时,虽然借鉴网上的资源,但是仍然有遇到一些问题,在这里写出来以便大家遇到时能够正确处理. 一.LCD1602 相关[1] 工业字符型液晶,能够同时显示16x02即32个字符.(16列2行) 1.1 管脚 1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线. 引脚 符号 功能说明 1 VSS 一般接地 2 VDD 接电源(+5V

树莓派笔记——初始化及系统设置(3)

接着上一章,系统已经安装好. 一.连接树莓派 准备工具:putty.网线 将树莓派插上电源和SD卡,并插入网线,网线的另一端连到路由器.同时,笔记本(电脑)也连到该路由器上. 笔记本(电脑)打开putty,在主机名称(或IP地址)中输入树莓派IP地址. 出现登陆界面: 输入用户名:pi  密码:raspberry(输入密码的过程中,密码是看不到的) 回车确认,就连接上了树莓派. 二.更换软件源 (1)备份 cd /etc/apt cp sources.list sources.list_bak