LCD显示GPS时钟[嵌入式系统]

                            夏任务102:做一个GPS钟

 

实验要求

  用RPi的串口连接一个GPS模块,从GPS得到实时时间,在7段数码管或LCD上显示

实验工具:

Raspberry Pi Model B主机,

8G c10 SD卡,

USB充电线,

电源需自备5v 1A电源充电头一个

PC机一台(这里用的操作系统是windows7 64bit旗舰版)

LED面板

GPS模块+串口线

 

实验步骤:

  1. 连接电路线路

        GPS板G3203:

          VDD->RPi的3.3V

          TXD->RPi的RXD

          GND->RPi的GND

 

 

  2。在树莓派上安装pyserial:

下载地址:http://sourceforge.net/projects/pyserial/files/pyserial/2.5/

解压后进入目录 运行

  python setup.py install

  

 

  1. 编写代码Adafruit_CharLCD.py:

      (LCD显示代码引自git clone https://github.com/lifanxi/rpimenu.git)

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

import serial

import traceback

import os

import commands

import string

 

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 show_time(i,interval):

             global num

             while True:

                    try:

                           show(num)

                    except Exception as ep:

                           print ep

 

    def __init__(self, pin_rs=4, pin_e=25, 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()

      mest="Lab102 GPS Clock \n time: "

  message="show"

      while True:

             try:

                    tmp=ser.readline()

     

                    if tmp.find('GPRMC')==1:

                           buf = tmp.split(',')

                           tim = buf[1]

                           print tim

                           num = tim[0:8]

                           message= mest+num

                           lcd.clear()

                        lcd.message(message)     

             except Exception as e:

                    print e

                    #ser.close()

                    ser = serial.Serial('/dev/ttyAMA0')

            

 

      3.SSH连接树莓派,运行该代码,LCD显示如图:

        

sudo python Adafruit_CharLCD.py

 

posted @ 2013-06-20 21:58  浪里个浪荡荡  阅读(599)  评论(0编辑  收藏  举报