用RaspberryPi 3驱动LCD1602(八位数据总线)液晶显示屏(使用RPi.GPIO库,Python语言编写)

 承接上篇博客的硬件电路,这次换Python来驱动试试看,毕竟是看了一眼简明教程的python,才刚接触一两天,所以期间同c语言一些差距,通过不断百度慢慢解决了。直接附代码吧:

#!/usr/bin/python
# -- coding: utf-8 --
#Filename:lcd1602.py
import RPi.GPIO as GPIO
import time
RS=36                             #GPIO.27
EN=38                             #GPIO.28
PinList=[11,12,13,15,16,18,22,7]  #GPIO.0-0.7物理引脚
def Port_Init():
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(PinList,GPIO.OUT) 
    GPIO.setup([RS,EN],GPIO.OUT)
def GPIO_WriteByte(byte):        #给GPIO 0-7端口写入电平
    tmp=0x01
    for i in range(0,8):
        GPIO.output(PinList[i],bool(byte&tmp))
        tmp=tmp<<1

def Write_Cmd(cmd):            
    GPIO.output(RS,False)        #RS  = 0
    
    GPIO_WriteByte(cmd)          #P0 = cmd
    
    GPIO.output(EN,True)         #EN = 1
    time.sleep(0.005)            #延时5ms
    GPIO.output(EN,False)        #EN = 0

def Write_Dat(dat):
    GPIO.output(RS,True)         #RS = 1
    
    GPIO_WriteByte(dat)          #P0 = dat
    
    GPIO.output(EN,True)         #EN = 1
    time.sleep(0.005)            #延时5ms
    GPIO.output(EN,False)        #EN = 0
def Init_LCD1602():  
    Write_Cmd(0x38)             #设置为八位数据总线,两行显示

    Write_Cmd(0x0c)             #开启显示
    Write_Cmd(0x06)             #地址指针+1
    Write_Cmd(0x01)             #清屏
def showstring(p,row_number):
    Write_Cmd(0x80) if row_number==1 else Write_Cmd(0xc0)  #设置显示在哪一行
    for i in p:
        Write_Dat(i)
def shownumber(num,row_number):
    Write_Cmd(0x80) if row_number==1 else Write_Cmd(0xc0)  
                                #这里本想用三目运算符的,奈何python里没有,这条语句来代替
    for i in str(num):  
        Write_Dat(ord(i))  #显示数字
Port_Init()
Init_LCD1602()
showstring(map(ord,'Hello,python!'),2)
try:
    i=1
    while True:
        shownumber(i,1)
        i=i+1
        time.sleep(1)
except KeyboardInterrupt:
    pass
print'Bye Bye'
#GPIO.cleanup()

 遇到的第一个问题,可能以后有更好的解决方案吧:

   我发现python的这个RPi.GPIO一些函数,我百度来也找不到具体的,终端里也不知道如何获取RPi.GPIO里的诸多函数声明,比如iwiringPi里的给八位端口写高低电平的函数digitalWriteByte()在RPi.GPIO里找不到,索性就自己写了:

def GPIO_WriteByte(byte):
    tmp=0x01
    for i in range(0,8):
        GPIO.output(PinList[i],bool(byte&tmp))
        tmp=tmp<<1

bool得到True 等同于GPIO.HIGH ,False等同于GPIO.LOW,

然后通过与0x01、0x02、0x04、0x08....0x80逻辑与后就能给八个端口的各位送高低电平了。

遇到的第二个问题,就是中文注释,#中文 这样子编译会得到错误:

File "lcd1602.py", line 51
SyntaxError: Non-ASCII character '\xe8' in file led2.py on line 51, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

解决办法如下:

只需在第一或者第二行加入:

# -- coding: utf-8 --

遇到的第三个问题:

也就是C语言用多了,不太熟练用python,比如将‘1’单个字符转为ASCII码,调用ord('1')即可,这是针对单个字符的

针对字符串的话,可以使用map(ord,"hello,python")来实现

python功能第一次接触,发现有好多方便的函数,比如将整数逐位分解为字符,只需要str(num)即可。

还有一个就是找错误的时候,行号在vim中要显示的话加入:set nu 回车即可显示了。

综上,就是python驱动lcd1602的全部了,不同于网上花里胡哨的各种丰富功能的函数,设置光标什么的,这些东西实际需要用到的时候再编写。

再给自己加个图片吧:

其实用lcd1602很简单,无非就是IO端口输出高低电平,来点延时,即可显示字符了。
但是如果能把手册具体里的内容看看明白,无异于是很大的提升了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值