{"id":89,"date":"2011-01-05T23:34:14","date_gmt":"2011-01-05T23:34:14","guid":{"rendered":"http:\/\/paulsarduino.co.uk\/?page_id=89"},"modified":"2011-01-05T23:34:58","modified_gmt":"2011-01-05T23:34:58","slug":"scrolling-digital-clock","status":"publish","type":"page","link":"https:\/\/paulsarduino.co.uk\/?page_id=89","title":{"rendered":"Scrolling Digital Clock"},"content":{"rendered":"<pre>#include &lt;TimerOne.h&gt;\r\n\r\n\/*\r\n\r\nScrolling Digital Clock\r\n\r\nPaul Cox Dec 2010\r\n\r\n*\/\r\n\r\n\/\/ device pins\r\nbyte rows[8] = {9, 14, 8, 12, 1, 7, 2, 5};\r\nbyte cols[8] = {13, 3, 4, 10, 6, 11, 15, 16};\r\n\r\n\/\/ arduino pin mapping\r\nbyte pins[16] = {5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};\r\nbyte screen[8] = {0, 0, 0, 0, 0, 0, 0, 0};\r\nvolatile byte screenRow = 0;\r\nvolatile byte screenCol = 0;\r\n\r\n\/\/ big font\r\nbyte zero[] = {6,\r\n 0B00000000,\r\n 0B00111110,\r\n 0B01111111,\r\n 0B01000001,\r\n 0B01111111,\r\n 0B00111110\r\n };\r\n\r\nbyte one[] = {5,\r\n 0B00000000,\r\n 0B01000100,\r\n 0B01111111,\r\n 0B01111111,\r\n 0B01000000\r\n };\r\n\r\nbyte two[] = {7,\r\n 0B00000000,\r\n 0B01100010,\r\n 0B01110011,\r\n 0B01011001,\r\n 0B01001001,\r\n 0B01101111,\r\n 0B01100110\r\n };\r\n\r\nbyte three[] = {7,\r\n 0B00000000,\r\n 0B00100010,\r\n 0B01100011,\r\n 0B01001001,\r\n 0B01001001,\r\n 0B01111111,\r\n 0B00110110\r\n };\r\n\r\nbyte four[] = {8,\r\n 0B00000000,\r\n 0B00011000,\r\n 0B00011100,\r\n 0B00010110,\r\n 0B00010011,\r\n 0B01111111,\r\n 0B01111111,\r\n 0B00010000\r\n };\r\n\r\nbyte five[] = {7,\r\n 0B00000000,\r\n 0B00100111,\r\n 0B01100111,\r\n 0B01000101,\r\n 0B01000101,\r\n 0B01111101,\r\n 0B00111001\r\n };\r\n\r\nbyte six[] = {7,\r\n 0B00000000,\r\n 0B00111100,\r\n 0B01111110,\r\n 0B01001011,\r\n 0B01001001,\r\n 0B01111001,\r\n 0B00110000\r\n };\r\n\r\nbyte seven[] = {7,\r\n 0B00000000,\r\n 0B00000011,\r\n 0B01100011,\r\n 0B01110001,\r\n 0B00011001,\r\n 0B00001111,\r\n 0B00000111\r\n };\r\n\r\nbyte eight[] = {7,\r\n 0B00000000,\r\n 0B00110110,\r\n 0B01111111,\r\n 0B01001001,\r\n 0B01001001,\r\n 0B01111111,\r\n 0B00110110,\r\n };\r\n\r\nbyte nine[] = {7,\r\n 0B00000000,\r\n 0B00000110,\r\n 0B01001111,\r\n 0B01001001,\r\n 0B01101001,\r\n 0B00111111,\r\n 0B00011110\r\n };\r\n\r\nbyte colon[] = {3,\r\n 0B00000000,\r\n 0B00110110,\r\n 0B00110110\r\n };\r\n\r\nbyte space[] = {5,\r\n 0B00000000,\r\n 0B00000000,\r\n 0B00000000,\r\n 0B00000000,\r\n 0B00000000\r\n };\r\n\r\nbyte*\u00a0 nums[] = { zero, one, two, three, four,\r\n five, six, seven, eight, nine,\r\n colon, space };\r\n\r\nint\u00a0 time[] = {0,0,10,0,0,10,0,0,11,11,11,11,11,11,11};\r\nint\u00a0 iTimeIndex = 0;\r\nint\u00a0 iTimeMax = 15;\r\nint\u00a0 iCharIndex = 0;\r\nint\u00a0 iCharMax = 0;\r\nint\u00a0 iMillis = 0;\r\n\r\nunsigned long\u00a0\u00a0 ulmSperS = 1000;\r\nunsigned long\u00a0\u00a0 ulmSperM = (ulmSperS * 60);\r\nunsigned long\u00a0\u00a0 ulmSperH = (ulmSperM * 60);\r\n\r\n#define\u00a0\u00a0\u00a0 REFRESH_INTERVAL\u00a0\u00a0\u00a0\u00a0\u00a0 100\r\n#define\u00a0\u00a0\u00a0 UPDATE_INTERVAL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 150\r\n\r\nbyte**\u00a0 font = nums;\r\n\r\nvoid setup()\r\n{\r\n Timer1.initialize(REFRESH_INTERVAL);\r\n for (int i = 2; i &lt;= 17; i++)\r\n {\r\n pinMode(i, OUTPUT);\r\n }\r\n Timer1.attachInterrupt(doubleBuffer);\r\n resetAnim();\r\n}\r\n\r\nvoid doubleBuffer()\r\n{\r\n digitalWrite(translatePin(rows[screenRow]), LOW);\r\n digitalWrite(translatePin(cols[screenCol]), HIGH);\r\n\r\n screenCol++;\r\n if (screenCol &gt;= 8)\r\n {\r\n screenCol = 0;\r\n screenRow++;\r\n if (screenRow &gt;= 8)\r\n {\r\n screenRow = 0;\r\n }\r\n }\r\n\r\n if((screen[screenRow] &gt;&gt; screenCol) &amp; B1 == B1)\r\n {\r\n digitalWrite(translatePin(rows[screenRow]), HIGH);\r\n digitalWrite(translatePin(cols[screenCol]), LOW);\r\n }\r\n else\r\n {\r\n digitalWrite(translatePin(rows[screenRow]), LOW);\r\n digitalWrite(translatePin(cols[screenCol]), HIGH);\r\n }\r\n}\r\n\r\nbyte translatePin(byte original)\r\n{\r\n return pins[original - 1];\r\n}\r\n\r\nvoid allOFF()\r\n{\r\n for (int i = 0; i &lt; 8; i++)\r\n {\r\n screen[i] = 0;\r\n }\r\n}\r\n\r\nvoid scrollLeft()\r\n{\r\n for (int i = 0; i &lt; 7; i++)\r\n {\r\n screen[i] = screen[i+1];\r\n }\r\n}\r\n\r\nvoid scrollRight()\r\n{\r\n for (int i = 7; i &gt; 0; i--)\r\n {\r\n screen[i] = screen[i-1];\r\n }\r\n}\r\n\r\nvoid makeTime()\r\n{\r\n \/\/ calc hms since we started\r\n unsigned long\u00a0 ulMillis = millis();\r\n int iHour = ulMillis \/ ulmSperH;\r\n int iMin = (ulMillis - (iHour * ulmSperH)) \/ ulmSperM;\r\n int iSec = (ulMillis - (iHour * ulmSperH) - (iMin * ulmSperM)) \/ ulmSperS;\r\n\r\n time[0] = floor(iHour \/ 10);\r\n time[1] = iHour - (time[0] * 10);\r\n\r\n time[3] = floor(iMin \/ 10);\r\n time[4] = iMin - (time[3] * 10);\r\n\r\n time[6] = floor(iSec \/ 10);\r\n time[7] = iSec - (time[6] * 10);\r\n}\r\n\r\nvoid on(byte row, byte column)\r\n{\r\n screen[column-1] |= (B1 &lt;&lt; (row - 1));\r\n}\r\n\r\nvoid off(byte row, byte column)\r\n{\r\n screen[column-1] &amp;= ~(B1 &lt;&lt; (row - 1));\r\n}\r\n\r\nvoid resetAnim()\r\n{\r\n for (int i = 0; i &lt; 8; i++)\r\n {\r\n screen[i] = B11111111;\r\n delay(25);\r\n }\r\n for (int i = 0; i &lt; 8; i++)\r\n {\r\n screen[i] = B00000000;\r\n delay(25);\r\n }\r\n}\r\n\r\nvoid loop()\r\n{\r\n makeTime();\r\n drawTime();\r\n delay(UPDATE_INTERVAL);\r\n updateTime();\r\n}\r\n\r\nvoid drawTime()\r\n{\r\n int\u00a0\u00a0\u00a0 iLoop = 7;\r\n int\u00a0\u00a0\u00a0 iC = iCharIndex;\r\n int\u00a0\u00a0\u00a0 iCM = iCharMax;\r\n int\u00a0\u00a0\u00a0 iT = iTimeIndex;\r\n\r\n while(iLoop &gt;= 0)\r\n {\r\n screen[iLoop] = font[time[iT]][iC];\r\n iC++;\r\n if (iC &gt; iCM)\r\n {\r\n iT++;\r\n if (iT &gt;= iTimeMax)\r\n {\r\n iT = 0;\r\n }\r\n iC = 1;\r\n iCM = font[time[iT]][0];\r\n }\r\n iLoop--;\r\n }\r\n}\r\n\r\nvoid updateTime()\r\n{\r\n iCharIndex++;\r\n if (iCharIndex &gt; iCharMax)\r\n {\r\n iTimeIndex++;\r\n if (iTimeIndex &gt;= iTimeMax)\r\n {\r\n iTimeIndex = 0;\r\n }\r\n iCharIndex = 1;\r\n iCharMax = font[time[iTimeIndex]][0];\r\n }\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>#include &lt;TimerOne.h&gt; \/* Scrolling Digital Clock Paul Cox Dec 2010 *\/ \/\/ device pins byte rows[8] = {9, 14, 8, 12, 1, 7, 2, 5}; byte cols[8] = {13, 3, 4, 10, 6, 11, 15, 16}; \/\/ arduino pin mapping byte pins[16] = {5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":16,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":{"footnotes":""},"class_list":["post-89","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/89","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=89"}],"version-history":[{"count":2,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/89\/revisions"}],"predecessor-version":[{"id":91,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/89\/revisions\/91"}],"up":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/16"}],"wp:attachment":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=89"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}