Edit: adding a third shift register to the chain worked, but at the price of making the display rather dim (because of the time spent transferring all the data, I suspect). The green LEDs aren't as bright as the red ones, which made the effect worse - the red ones were just about acceptable.
#include <string.h> #include "ascii_hex.h" #define SPEED 5 #define DELAY 2 #define ROW_OFF LOW #define ROW_ON HIGH #define COL_OFF HIGH #define COL_ON LOW //Pin Definitions const byte latchPin = 8; const byte clockPin = 12; const byte dataPin = 11; const byte mask[] = {1,2,4,8,16,32,64,128}; byte led_state[8] = {0, 0, 0, 0, 0, 0, 0, 0}; void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { char to_print[] = "andrew.norman@leicester.ac.uk ()[]{} "; int length = strlen(to_print); const byte *next; for (int pos = 0; pos < length; pos++) { next = alphabet[to_print[pos]]; // next[8] is the width of the character for (int i = 0; i < next[8]; i++) { // Update each row of the current dispay // by shifting right, and inserting the // appropriate bits of the next frame for (int j = 0; j < 8; j++) { led_state[j] = (led_state[j] << 1) | ((next[j] >> (7 - i))); } showArray(); } // Insert a space between letters for (int j = 0; j < 8; j++) { led_state[j] <<= 1; } showArray(); } } void showArray(void) { byte columnSelect; // Show the array multiple times to slow down // the "refresh rate" for (int s = 0; s < SPEED; s++) { for(int column = 0; column < 8; column++) { columnSelect = ~mask[column]; sendControl(0x00, columnSelect); sendControl(led_state[column], columnSelect); delay(DELAY); } } } void sendControl(byte rc, byte cc) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, cc); shiftOut(dataPin, clockPin, MSBFIRST, rc); digitalWrite(latchPin, HIGH); }Here is the header file with all the character definitions - I put together an Excel spreadsheet to help me generate these (by ticking cells until I had the right shape, and then reading off the hex values).
#include <Arduino.h> byte alphabet[128][9] = { // First 32 characters (0 to 31) are control characters, don't print {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 000 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 001 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 002 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 003 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 004 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 005 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 006 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 007 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 008 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 009 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 010 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 011 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 012 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 013 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 014 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 015 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 016 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 017 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 018 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 019 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 020 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 021 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 022 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 023 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 024 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 025 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 026 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 027 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 028 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 029 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 030 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0}, /* ASCII 031 */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 4}, /* ASCII 032 = Space */ {0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x00, 1}, /* ASCII 033 = ! */ {0xA0, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 3}, /* ASCII 034 = " */ {0x50, 0x50, 0xF8, 0x50, 0xF8, 0x50, 0x50, 0x00, 5}, /* ASCII 035 = # */ {0x20, 0x78, 0xA0, 0x70, 0x28, 0xF0, 0x20, 0x00, 5}, /* ASCII 036 = $ */ {0x42, 0xA4, 0x48, 0x10, 0x24, 0x4A, 0x84, 0x00, 7}, /* ASCII 037 = % */ {0x60, 0x90, 0x80, 0x68, 0x90, 0x90, 0x68, 0x00, 6}, /* ASCII 038 = & */ {0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 1}, /* ASCII 039 = ' */ {0x40, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x00, 2}, /* ASCII 040 = ( */ {0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0x80, 0x00, 2}, /* ASCII 041 = ) */ {0x10, 0x92, 0x54, 0x38, 0x54, 0x92, 0x10, 0x00, 7}, /* ASCII 042 = * */ {0x00, 0x20, 0x20, 0xF8, 0x20, 0x20, 0x00, 0x00, 5}, /* ASCII 043 = + */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x80, 2}, /* ASCII 044 = , */ {0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 5}, /* ASCII 045 = - */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 1}, /* ASCII 046 = . */ {0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 7}, /* ASCII 047 = / */ {0x60, 0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, 4}, /* ASCII 048 = 0 */ {0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, 4}, /* ASCII 049 = 1 */ {0x60, 0x90, 0x10, 0x20, 0x40, 0x80, 0xF0, 0x00, 4}, /* ASCII 050 = 2 */ {0x60, 0x90, 0x10, 0x60, 0x10, 0x90, 0x60, 0x00, 4}, /* ASCII 051 = 3 */ {0x20, 0x60, 0xA0, 0xA0, 0xF0, 0x20, 0x20, 0x00, 4}, /* ASCII 052 = 4 */ {0xF0, 0x80, 0x80, 0xE0, 0x10, 0x90, 0x60, 0x00, 4}, /* ASCII 053 = 5 */ {0x60, 0x90, 0x80, 0xE0, 0x90, 0x90, 0x60, 0x00, 4}, /* ASCII 054 = 6 */ {0xF0, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x00, 4}, /* ASCII 055 = 7 */ {0x60, 0x90, 0x90, 0x60, 0x90, 0x90, 0x60, 0x00, 4}, /* ASCII 056 = 8 */ {0x60, 0x90, 0x90, 0x70, 0x10, 0x90, 0x60, 0x00, 4}, /* ASCII 057 = 9 */ {0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 1}, /* ASCII 058 = : */ {0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x80, 2}, /* ASCII 059 = ; */ {0x10, 0x20, 0x40, 0x80, 0x40, 0x20, 0x10, 0x00, 4}, /* ASCII 060 = < */ {0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x00, 0x00, 4}, /* ASCII 061 = = */ {0x80, 0x40, 0x20, 0x10, 0x20, 0x40, 0x80, 0x00, 4}, /* ASCII 062 = > */ {0x70, 0x88, 0x88, 0x10, 0x20, 0x00, 0x20, 0x00, 5}, /* ASCII 063 = ? */ {0x30, 0x48, 0x98, 0xA8, 0x98, 0x40, 0x38, 0x00, 5}, /* ASCII 064 = @ */ {0x20, 0x50, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x00, 5}, /* ASCII 065 = A */ {0xE0, 0x90, 0x90, 0xE0, 0x90, 0x90, 0xE0, 0x00, 4}, /* ASCII 066 = B */ {0x60, 0x90, 0x80, 0x80, 0x80, 0x90, 0x60, 0x00, 4}, /* ASCII 067 = C */ {0xE0, 0x90, 0x90, 0x90, 0x90, 0x90, 0xE0, 0x00, 4}, /* ASCII 068 = D */ {0xF0, 0x80, 0x80, 0xE0, 0x80, 0x80, 0xF0, 0x00, 4}, /* ASCII 069 = E */ {0xF0, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x80, 0x00, 4}, /* ASCII 070 = F */ {0x60, 0x90, 0x80, 0x80, 0xB0, 0x90, 0x60, 0x00, 4}, /* ASCII 071 = G */ {0x90, 0x90, 0x90, 0xF0, 0x90, 0x90, 0x90, 0x00, 4}, /* ASCII 072 = H */ {0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00, 3}, /* ASCII 073 = I */ {0x10, 0x10, 0x10, 0x10, 0x10, 0x90, 0x60, 0x00, 4}, /* ASCII 074 = J */ {0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88, 0x00, 5}, /* ASCII 075 = K */ {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF0, 0x00, 4}, /* ASCII 076 = L */ {0x88, 0xD8, 0xA8, 0xA8, 0x88, 0x88, 0x88, 0x00, 5}, /* ASCII 077 = M */ {0x88, 0xC8, 0xA8, 0x98, 0x88, 0x88, 0x88, 0x00, 5}, /* ASCII 078 = N */ {0x20, 0x50, 0x88, 0x88, 0x88, 0x50, 0x20, 0x00, 5}, /* ASCII 079 = O */ {0xE0, 0x90, 0x90, 0xE0, 0x80, 0x80, 0x80, 0x00, 4}, /* ASCII 080 = P */ {0x20, 0x50, 0x88, 0x88, 0xA8, 0x50, 0x28, 0x00, 5}, /* ASCII 081 = Q */ {0xE0, 0x90, 0x90, 0xE0, 0xC0, 0xA0, 0x90, 0x00, 4}, /* ASCII 082 = R */ {0x60, 0x90, 0x80, 0x60, 0x10, 0x90, 0x60, 0x00, 4}, /* ASCII 083 = S */ {0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 5}, /* ASCII 084 = T */ {0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, 4}, /* ASCII 085 = U */ {0x88, 0x88, 0x88, 0x88, 0x50, 0x50, 0x20, 0x00, 5}, /* ASCII 086 = V */ {0x88, 0x88, 0x88, 0xA8, 0xA8, 0xA8, 0x50, 0x00, 5}, /* ASCII 087 = W */ {0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, 0x00, 5}, /* ASCII 088 = X */ {0x88, 0x88, 0x50, 0x20, 0x20, 0x20, 0x20, 0x00, 5}, /* ASCII 089 = Y */ {0xF8, 0x08, 0x10, 0x20, 0x40, 0x80, 0xF8, 0x00, 5}, /* ASCII 090 = Z */ {0xE0, 0x80, 0x80, 0x80, 0x80, 0x80, 0xE0, 0x00, 3}, /* ASCII 091 = [ */ {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 7}, /* ASCII 092 = \ */ {0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0xE0, 0x00, 3}, /* ASCII 093 = ] */ {0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 5}, /* ASCII 094 = ^ */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 4}, /* ASCII 095 = _ */ {0x80, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 3}, /* ASCII 096 = ` */ {0x00, 0x00, 0x60, 0x10, 0x70, 0x90, 0x70, 0x00, 4}, /* ASCII 097 = a */ {0x80, 0x80, 0xE0, 0x90, 0x90, 0x90, 0xE0, 0x00, 4}, /* ASCII 098 = b */ {0x00, 0x00, 0x60, 0x80, 0x80, 0x80, 0x60, 0x00, 3}, /* ASCII 099 = c */ {0x10, 0x10, 0x70, 0x90, 0x90, 0x90, 0x70, 0x00, 4}, /* ASCII 100 = d */ {0x00, 0x00, 0x60, 0x90, 0xF0, 0x80, 0x70, 0x00, 4}, /* ASCII 101 = e */ {0x20, 0x50, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x00, 4}, /* ASCII 102 = f */ {0x00, 0x00, 0x60, 0x90, 0x90, 0x60, 0x10, 0x60, 4}, /* ASCII 103 = g */ {0x80, 0x80, 0xE0, 0x90, 0x90, 0x90, 0x90, 0x00, 4}, /* ASCII 104 = h */ {0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 1}, /* ASCII 105 = i */ {0x00, 0x20, 0x00, 0x20, 0x20, 0x20, 0xA0, 0x40, 3}, /* ASCII 106 = j */ {0x80, 0x80, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x00, 4}, /* ASCII 107 = k */ {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 1}, /* ASCII 108 = l */ {0x00, 0x00, 0x50, 0xA8, 0xA8, 0xA8, 0xA8, 0x00, 5}, /* ASCII 109 = m */ {0x00, 0x00, 0x60, 0x90, 0x90, 0x90, 0x90, 0x00, 4}, /* ASCII 110 = n */ {0x00, 0x00, 0x60, 0x90, 0x90, 0x90, 0x60, 0x00, 4}, /* ASCII 111 = o */ {0x00, 0x00, 0x60, 0x90, 0x90, 0xE0, 0x80, 0x80, 4}, /* ASCII 112 = p */ {0x00, 0x00, 0x60, 0x90, 0x90, 0x70, 0x10, 0x10, 4}, /* ASCII 113 = q */ {0x00, 0x00, 0x60, 0x90, 0x80, 0x80, 0x80, 0x00, 4}, /* ASCII 114 = r */ {0x00, 0x00, 0x70, 0x80, 0x60, 0x10, 0xE0, 0x00, 4}, /* ASCII 115 = s */ {0x40, 0x40, 0xE0, 0x40, 0x40, 0x50, 0x20, 0x00, 4}, /* ASCII 116 = t */ {0x00, 0x00, 0x90, 0x90, 0x90, 0x90, 0x60, 0x00, 4}, /* ASCII 117 = u */ {0x00, 0x00, 0x88, 0x88, 0x88, 0x50, 0x20, 0x00, 5}, /* ASCII 118 = v */ {0x00, 0x00, 0x88, 0x88, 0xA8, 0xA8, 0x50, 0x00, 5}, /* ASCII 119 = w */ {0x00, 0x00, 0x88, 0x50, 0x20, 0x50, 0x88, 0x00, 5}, /* ASCII 120 = x */ {0x00, 0x00, 0x90, 0x90, 0x70, 0x10, 0x90, 0x60, 4}, /* ASCII 121 = y */ {0x00, 0x00, 0xF0, 0x20, 0x40, 0x80, 0xF0, 0x00, 4}, /* ASCII 122 = z */ {0x20, 0x40, 0x40, 0x80, 0x40, 0x40, 0x20, 0x00, 3}, /* ASCII 123 = { */ {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 1}, /* ASCII 124 = | */ {0x80, 0x40, 0x40, 0x20, 0x40, 0x40, 0x80, 0x00, 3}, /* ASCII 125 = } */ {0x00, 0x50, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 4}, /* ASCII 126 = ~ */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0} /* ASCII 127 = DEL (don't print)*/ }; const byte invader1[9] = {0x18, 0x3c, 0x7e, 0xdb, 0xff, 0x24, 0x5a, 0xa5, 8}; const byte invader2[9] = {0x3c, 0x7e, 0xff, 0x99, 0xff, 0x66, 0xdb, 0x81, 8};
TSI T-TEN, titanium pipes - TITIAN ART
ReplyDeleteTSI T-TEN, titanium pipes, TSI T-TEN. TSI raft titanium T-TEN, titanium titanium element pipes, TSI T-TEN, titanium pipes, TSI can titanium rings be resized T-TEN. titanium jewelry $45.00. FOR SALE! This zinc oxide and titanium dioxide sunscreen is a complete