AVR Projects‎ > ‎

multimode clock


this is a mutli-mode clock project based on attiny2313. it employs a 8x8 led matrix as display. with the limited resolution, this 12 hour clock shows time in 6 different modes.

hhmm mode, typical hours plus minutes scrolling digits with colon separator.

seconds mode, shows only seconds.

tix mode (shown below), led matrix is divided into quadrant, the upper quadrants shows the hour in bcd (binary coded decimal) values. they are represented by the number of dots to indicate the digits. the lower quadrants show the minute in bcd. i.e. for 12:37 it shows no dot + 9 dots on the upper half and 3 dots + 7 dots on the lower half.

dice mode (shown below), the led matrix is divided into two set of 'dices'. with the upper pair showing hour from 1 - 12, the lower pair of dice shows minutes in 5 minute increments. i.e. for 9:45 it shows dice value upper 9 + lower 9 (9 hour, 9 x 5 min).

binary (bcd) mode, (shown below) the hour, minute and second digits are show as binary dot on different rows in the led matrix. the rows 0 and 1 (from top) represents the hour digits, rows 2 is blanked, row 3 and 4 represent the minute digits, row 5 is blanked, row 6 and 7 represents the second digits.

the circuit employs row and column multiplexing to drive the leds, one row at a time, this gives a 12.5% duty cycle when "sets" of leds (8 of them in each of the 8 rows) are turn on briefly. current limiting resistors are eliminated to save breadboard estate and as we are not constantly driving individual leds, they are not going to be damaged.

the control (user interface) is also arranged so that we only use one tactile button for input. the firmware capture long button presses (press and hold) for menu rotation and normal button presses for menu selection.

this is a hobby project and the clock is only as accurate as your internal oscillator calibration. i had not use a crystal in this project as doing so will upset the "matrix on top of mcu" breadboard layout. a crystal can be used to increase accuracy on a alternate breadboard layout (or pcb). with software compensation, i can achieve may be within 2 minutes off a day. i would need to adjust the time every 3 or 4 days to keep it usable. this is more a cubicle talk piece than a swiss time piece.


  • minimal components, 3 parts
  • battery operated from 3V to 5V
  • use of watchdog timer to keep time, power-down sleep mode takes about 1uA power
  • calibration allow setup of seconds to gain for each hour
  • this is a 12H clock, not 24H and has no AM/PM indicator
  • not very accurate, planning to add RTC chip

project fuse setting

  • setting at 1Mhz to conserve power
  • change according to your programmer and port

avrdude -c usbtiny -p t2313 -P /dev/ttyUSB0 -V -U lfuse:w:0x64:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m

parts list

  • attiny2313v (v is low power version that works with 3V)
  • 8x8 LED matrix display (red works best on 3V power)
  • tactile button

application notes

  • short key press in display mode cycles through HHMM, seconds, tix, dice, binary and sleep modes
  • long press enters setup mode, subsequent long press rotates thru menu
  • menu items cycles thru SE, AJ, DM
  • in 'SE' time setup mode, short press enters setup
  • once in setup, short press increments digit values (hours, minutes) and long press confirms
  • in 'AJ' calibration setup mode, minutes and seconds can be entered. this represents the time to 'gain' for each hour
  • when in sleep mode, MCU goes in power down mode, consuming less than 1uA of power, watchdog timer is set so that system wakes-up every 1/8 second. this, however makes the time keeping to be always slow as it takes a few cycles to power up the MCU again. therefore we must have a calibration value to keep accurately
  • last setup values saved in EEPROM and will be used for the next power up
  • in 'DM' dimmer setting, short presses cycles through available brightness levels, long press confirms setting
  • led segment multiplexing includes time delays to compensate for brightness differences for individual rows.

breadboard layout

the 8x8 led matrix has dot size of 1.9mm and is of common cathode, if you have common anode type, you can change a few lines in the code for adoption. see the following diagram and see if you have the right pin-outs. it appears they are quite common and if you purchase via ebay most suppliers have the same pin-out even if the model number is different.

           Gd Rt V+ Ck MI MO (tinyusb programmer)
+ + + + + +
| . . . . o . . . . . . . . . . . . |
| . . . . . . . . . . . . . . . . . |
| . . . . . +--+--+--+--+--+--+--+ . . . . |
| . . . . . C8 C7 R2 C1 R4 C6 C4 R1 . . . . |
| . . o o +--+--+--+--+--+--+--+--+--+ . . . |
| | | |+ b7..6..5..4..3..2..1..0 d6| |
| | | |R d0..1 a1..0 d2..3..4..5 -| |
| . . | | +--+--+--+--+--+--+--+--+--+- . . . |
| . . | +--o +--+--+--+--+--+--+--+ . . . . |
| . . | . . R5 R7 C2 C3 R8 C5 R6 R3 . . . . |
| . . | . . . . . . . . . . . . . . |
| . . | . . . . . . o..B..o . . . . . |
| . . +--------------------------------o . . . |


observe the ISP (in-system-programmer) pin-outs, this is a non-standard pin-out but works very well on breadboards, they lin up nicely on one side of the attiny2313 and just need to connect RESET + Gnd to complete the circuit. i am using a "usbtiny" type of programmer to do the flash.


  • follow breadboard layout and place two jumper wires on mini breadboard
  • insert attiny2313v
  • insert tactile button

  • finally insert 8x8 led matrix on top of attiny2313v

source code

[April 26th, 2011] replace makefile, the old one does not make hex output, just elf, now it makes both.
[December 23rd, 2010] source code updated and will build on avr-gcc 4.3.4 within 2k limit. will work on using crystal for accurate timing.
[December 14th, 2010] someone tried to build and w/ avr-gcc 4.3.3+ the hex is too big. i used to build this w/ 4.3.2 and get a very tight 2046 byte hex. i am attaching the hex file here. will find time to work on the source code / makefile switches to make it fit again in gcc 4.3.4. for now you can use the following binaries

click to download mclock.hex
click to download mclock.ee.hex

the source runs at about 500 lines and is rather self explanatory. the project was built in a linux ubuntu lucid box with avr-gcc toolchain.

although the project uses only a handful of letters for menu selection, i had included 38 characters in the rom. i.e. digits 0-9, letters A-Z, a '.' and a space character.

the tic mode and dice mode pattern selection is not true random as we had code size restriction.

per row leds brightness are compensated in software by adjusting how long a row of leds stays on and off. i.e. for rows with all 8 column leds on, we stay longer to make them appears to be as bright as those rows that have only one or two leds on.

watchdog timer is used as this allows for sleep mode to prolong battery life. this means that the clock is not that accurate. during sleep the timer wakes the system up 8 times a second to see if a key is pressed and to advance the clock.

if you have any questions, feel free to comment here, i will try to address them. i know this write-up does not have a lot of detail. i prefer to enrich this page with feed-backs from viewers.


  • check connections
  • check fuse setting on attiny2313
  • adjust timing by adding -B xx parameter to avrdude, if you have problem flashing