Time Display unit for a GPS module (Added August 2006) (Last Update: February 2018)


I decided to build a device to permanently display accurate time received from a cheap GPS module installed in my workshop.

Having obtained a PIC18F1320 microcontroller for experimentation, I wanted to learn about the new features of the PIC18F range using only minimal hardware to control the display.
I am currently using it with the on-chip 8Mhz oscillator only and driving a six digit led display, multiplexed with further saving of chip pins by a technique pioneered by Charlie Allen of Maxim-Dallas for their MAX6951 LED display drivers called “Charlieplexing” (see their application note AN1880).
I would have liked to have used a MAX6951 chip for better display brightness, but they appear to be only available in “Quarter Size Outline Packages” (QSOP) – the leads are very close together,not easy to experiment with.
Another alternative would be to use a MAX7219 display driver, this chip has a serial interface and an option to adjust the display brightness – something I may try later.


  • Simple design, few components, no surface-mount types.
  • UTC time configurable to different time zones with DST option
  • Low power consumption
  • Uses modern Microchip PIC 18F1320 microcontroller
  • Selectable 12 or 24 hour time display modes
  • Leading zero blanking option
  • AM/PM indication in 12 hour mode
  • GGA and RMC sentence status indication

Circuit Diagram

Circuit Description

The microcontroller receives serial data from a GPS module at the standard rate of 4800 Baud.
It parses the NMEA 0183 Standard data sentences, looking for only two types of sentence – RMC and GGA. (These sentences must be sent by the GPS module every second for it to work.)
The RMC sentences include date and time information and GGA has Time and number of satellites received (no date information).
The serial time data sentences are only usually accurate to within a second, so a separate 1pps pulse from the GPS module is used to sync the seconds transitions.
(Note. Some GPS modules do not have a 1pps pulse output, these will not work with the current project firmware ).
(It has been tested ok with a Holux GM-82 module with TTL logic serial outputs.)

The controller drives the three (high efficiency) dual LED digit common cathode type display segments through series 510ohm resistors to help limit the current to remain within the 25mA per pin drive limit, together with the multiplexing action which effectively reduces the average current.
A disadvantage of this method is with the multiplexing and drive current limitations, the display is not very bright, requiring the use of high efficiency LEDs to achieve an acceptable brightness.

It is possible to increase brightness by the use of separate driver transistors for the display cathodes – but my initial tests found this produced some switching radio interference. (the MAXIM chips overcome that problem by using slew-limiting on their switching transistors).
Because the display cathodes share the same microcontroller outputs as the segments, the multiplexing action also switches outputs into high impedance (input mode) in addition to to high and low logic levels depending on which segments/cathodes are being driven.
Using the on-chip oscillator frees-up the two pins normally used for connecting a crystal to be used as ports instead.
Another extra (input only) port could have been gained by not using the MCLR pin – I decided not to do this as it can apparently cause problems when used with some types of PIC programmers (according to some web forum posts).

There are two tactile pushbuttons for configuration – a “SET” button to enter config mode and an “UP” button to increment the config values also show the date and number of satellites received.

The transistor (T1) Diode (D1)and resistor (R6) are provided to allow the unit to work with GPS modules that output the serial data using RS232 voltage levels. My GPS module outputs data at TTL logic levels (0-5v) so I have not used those components on my board yet (I will test it later by connecting to a PC emulating a GPS module).
The power requirements are very simple, It consumes less than 50mA with a 9V DC input (the 7805CT 5v regulator could be replaced with a smaller 78L05 type to save space).
The 470uF capacitor (C3) is only required if your DC power supply is not already smoothed.


When power is first applied, the display shows start-up information, including the project name and firmware version.
On receipt of 1pps pulses it will then show zeros while it waits for the GPS module to get valid satellite time. (this can take about a minute).
As soon as it has obtained valid data, it shows the time.
The red LED flashes to indicate the second pulses received from the GPS module.
Satellite time is UTC (GMT) time so there are options to change this:
Pressing the SET button will enter set-up mode and show an option to change to DST (Summer time) one hour advance.
The next press of the SET button allows the Time Zone offset (up to +/-15 hours) to be changed.
The next option toggles 12/24 hour time display mode.
The fourth option toggles leading zero blanking.
Changed settings are saved in eeprom and retained when switched off.
There are no other config options yet – I may add more later…

The DP led next to the second digit indicates an RMC sentence is detected ok.
The DP led next to the fourth digit indicates an GGA sentence is detected ok.
The DP led next to the last digit indicates time is PM (in 12 hour mode)

Firmware info

The firmware for this project is written in assembler language. The 18F1320 controller has 8Kb of memory, allowing up to 4096 instructions.
The current firmware occupies only about 25% of the available memory.
I found a few advantages to using 18F controllers, such as easier control of memory – no need to keep changing memory banks for accessing registers etc. and the additional commands make it easier to perform some tasks.
The downside is that some things are a bit more complicated – small tables are now not so simple because every entry uses two bytes of memory (It does provide some powerful commands for working with tables though).
The extra complexity added to some features such as interrupts and timers etc. can cause a few slight problems,requiring careful studying of the data sheets.

In addition to reading the 18F1320 datasheet, a more detailed coverage of 18F features can be found in the 976 page PICmicro® 18C MCU Family Reference Manual (39500a.pdf) which is available from the microchip website.

Another useful document is Application Note AN716 which explains the differences encountered when migrating from 16F to 18F devices.

I have a few ideas to expand the software features for this project and/or use them in future projects – when I have time..


You will require a PIC programmer compatible with the PIC18F1320 microcontroller.
If you don’t have one – there are various articles on the web for constructing a simple serial port “JDM” type programmer. Good Freeware programmer software is easily available – such as “IC-Prog” or “WinPic800”.
I shall update the file version here as features are added/bugs fixed etc.

The ASM source code for projects or kits is not available.

PCB Layout

The circuit is small enough to construct on stripboard, Or you may wish to try the double sided pcb layout design provided.
The microcontroller and displays should be mounted in sockets. Sockets for the displays can be made by carefully cutting-off the ends of 0.6 inch wide 24 or 28 pin ic sockets so they just have 18 pins (or cut some 18 pin 0.3 inch wide sockets down the middle).
If you decide to make the double sided pcb,the “toner transfer” method can be used (search for instructions on the web) – you will need to position both sheets on the pcb very accurately to achieve good results.
I have included some alignment marks in the pcb artwork and the topside sheet is already mirrored ready for printing.
I used a bright light to help align the two sheets together accurately.
PCB vias will have to be made with short lengths of wire soldered between pcb sides.
Many component leads will require soldering on both sides of the pcb – you need to leave a small gap between sockets and the board to allow access to the topside pads for soldering.

Gpstdu PCB Layout

Update: September 2015

Thanks very much to Stanley Hirsh for converting and supplying the PCB and Schematic files for use with ExpressPCB

GPSTDU ExpressPCB files

Stanley has successfully built the GPSTDU using the boards he ordered.

Alternative GPS module option

Stanley told me about a GPS module that can be bought from various Chinese eBay sellers at a very good price! (currently less than £6 including delivery!). (Seach eBay for “GPS Module for Car DVR GPS Tracking Device Recording for VIOFO A118 A118C ” to find it)

The GPS module is very small, plastic encased and supplied with a lead (almost 2M long) terminated with a 3.5mm stereo type jack. It is intended to be used with certain types of vehicle dash-cams. (the antenna is facing the rounded side of the case (the side without the double-sided adhesive tape) so you will need to open the case and turn the board around if you intend to stick it to a window).

Update February 2018:    Some specifications found from Ebay for these type of GPS modules: (Thanks to Ross in Australia)

Ebay title: “GPS Module for Car DVR Recording Antenna Accessory”

W-04 car GPS tracking antenna module receiver
TTL external GPS module
Suitable for car DVR  dash camera recorder  GPS navigator  etc.
Standard 3.5mm headset plug
Baud rate: 9600
Output format: NMEA 0183
Power supply: DC 3.3V 50 – 100mA
Interface type: UART
Cable length: 140cm

3.5mm Jack Plug
3.5mm Jack Plug

I opened the case (remove the double-sided tape to reveal 4 screws) and found the following board:

Cheap Chinese GPS module
Cheap Chinese GPS module

It appears to have a voltage regulator and backup battery but the GPS receiver section had no identifiable markings.

I connected the jack plug to a 3.3 volt supply and the data output to a 3.3v logic PC serial interface.

Analysis of the serial data found it is set to 9600 Baud. At power-on some diagnostic sentences indicate it probably uses a Mediatek MT3337 GPS receiver.

The device quickly obtained a gps fix although the time stamp was initially 1 second fast. After a few minutes it was corrected. I think this is due to the module initially using an internal rom GPS to UTC seconds offset value that was configured before the last leap second change in June 2015. The module eventually receives the correct offset data from satellite packets and corrects the error.

I don’t think the baud rate can be changed as there probably isn’t any non-volatile memory for saving settings. There is also no connection available for the 1PPS output.

Although the unit has a voltage regulator to allow it to be powered from a 5 volt supply, the data output is 3.3v logic (probably not 5v tolerant!).

To use this device with the GPSTDU requires a different firmware to allow the 9600 baud rate and disable the 1PPS input requirement. Also the data output from the GPS has to be directly connected to the PIC chip (pin 10). Remove transistor T1.

The 9600 baud firmware with no 1PPS requirement can be downloaded here:

GPSTDU 9600 baud (No 1PPS)

Also there is a 4800 baud version if have a GPS module that works at that rate:

GPSTDU 4800 Baud (No 1PPS)

I haven’t had time to test these firmware/hardware modifications although Stanley emailed me to say it appears to be working with his board/gps setup.