承接上篇博客的硬件电路,这次换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端口输出高低电平,来点延时,即可显示字符了。
但是如果能把手册具体里的内容看看明白,无异于是很大的提升了。