First steps with mbed an ht1632 with borrowed code. Print a message to a 0832 Dot Matrix Display from sure... I hope to form a library for such Displays in the next weeks...
main.cpp@0:d2b901ef8f4a, 2010-12-04 (annotated)
- Committer:
- relef
- Date:
- Sat Dec 04 10:42:09 2010 +0000
- Revision:
- 0:d2b901ef8f4a
First steps with mbed an ht1632 with borrowed code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
relef | 0:d2b901ef8f4a | 1 | #include "mbed.h" |
relef | 0:d2b901ef8f4a | 2 | #include "ht1632.h" |
relef | 0:d2b901ef8f4a | 3 | #include "font3.h" |
relef | 0:d2b901ef8f4a | 4 | |
relef | 0:d2b901ef8f4a | 5 | #define HIGH 1 |
relef | 0:d2b901ef8f4a | 6 | #define LOW 0 |
relef | 0:d2b901ef8f4a | 7 | |
relef | 0:d2b901ef8f4a | 8 | DigitalOut ht1632_wrclk(p23); // For Test : Led1 is Clock |
relef | 0:d2b901ef8f4a | 9 | DigitalOut ht1632_data(p22); // Led2 is Data .... |
relef | 0:d2b901ef8f4a | 10 | DigitalOut ht1632_cs(p21); // Led3 is CS |
relef | 0:d2b901ef8f4a | 11 | |
relef | 0:d2b901ef8f4a | 12 | typedef unsigned char byte; |
relef | 0:d2b901ef8f4a | 13 | |
relef | 0:d2b901ef8f4a | 14 | void byteOut(byte c); |
relef | 0:d2b901ef8f4a | 15 | void ht1632_chipselect(byte chipno); |
relef | 0:d2b901ef8f4a | 16 | static void ht1632_sendcmd (byte command); |
relef | 0:d2b901ef8f4a | 17 | static void ht1632_senddata (byte address, byte data); |
relef | 0:d2b901ef8f4a | 18 | void ht1632_chipfree(byte chipno); |
relef | 0:d2b901ef8f4a | 19 | void ht1632_writebits (byte bits, byte firstbit); |
relef | 0:d2b901ef8f4a | 20 | void ht1632_plot (int x, int y, char val); |
relef | 0:d2b901ef8f4a | 21 | void setup(); |
relef | 0:d2b901ef8f4a | 22 | void loop(); |
relef | 0:d2b901ef8f4a | 23 | |
relef | 0:d2b901ef8f4a | 24 | int main() { |
relef | 0:d2b901ef8f4a | 25 | setup(); |
relef | 0:d2b901ef8f4a | 26 | while(1) { |
relef | 0:d2b901ef8f4a | 27 | loop(); |
relef | 0:d2b901ef8f4a | 28 | } |
relef | 0:d2b901ef8f4a | 29 | } |
relef | 0:d2b901ef8f4a | 30 | |
relef | 0:d2b901ef8f4a | 31 | /*********************************************************************** |
relef | 0:d2b901ef8f4a | 32 | * HT1624.pde - Arduino demo program for Holtek HT1632 LED driver chip, |
relef | 0:d2b901ef8f4a | 33 | * As implemented on the Sure Electronics DE-DP016 display board |
relef | 0:d2b901ef8f4a | 34 | * (16*24 dot matrix LED module.) |
relef | 0:d2b901ef8f4a | 35 | * Nov, 2008 by Bill Westfield ("WestfW") |
relef | 0:d2b901ef8f4a | 36 | * Copyrighted and distributed under the terms of the Berkely license |
relef | 0:d2b901ef8f4a | 37 | * (copy freely, but include this notice of original author.) |
relef | 0:d2b901ef8f4a | 38 | * |
relef | 0:d2b901ef8f4a | 39 | * Adapted for 8x32 display by FlorinC. |
relef | 0:d2b901ef8f4a | 40 | ***********************************************************************/ |
relef | 0:d2b901ef8f4a | 41 | |
relef | 0:d2b901ef8f4a | 42 | // comment out this line for the 8x32 display; |
relef | 0:d2b901ef8f4a | 43 | //#define _16x24_ |
relef | 0:d2b901ef8f4a | 44 | |
relef | 0:d2b901ef8f4a | 45 | |
relef | 0:d2b901ef8f4a | 46 | #ifdef _16x24_ |
relef | 0:d2b901ef8f4a | 47 | #define X_MAX 23 |
relef | 0:d2b901ef8f4a | 48 | #define Y_MAX 15 |
relef | 0:d2b901ef8f4a | 49 | #else |
relef | 0:d2b901ef8f4a | 50 | #define X_MAX 31 |
relef | 0:d2b901ef8f4a | 51 | #define Y_MAX 7 |
relef | 0:d2b901ef8f4a | 52 | #endif |
relef | 0:d2b901ef8f4a | 53 | |
relef | 0:d2b901ef8f4a | 54 | #define plot(x,y,v) ht1632_plot(x,y,v) |
relef | 0:d2b901ef8f4a | 55 | #define cls ht1632_clear |
relef | 0:d2b901ef8f4a | 56 | |
relef | 0:d2b901ef8f4a | 57 | #define DISPDELAY 0 |
relef | 0:d2b901ef8f4a | 58 | |
relef | 0:d2b901ef8f4a | 59 | char* msg = " Guten Morgen liebe Kollegen ! - Alles im Lack ? Noch 20 Tage bis Entwicklungsschluss ....... "; |
relef | 0:d2b901ef8f4a | 60 | int crtPos = 0; |
relef | 0:d2b901ef8f4a | 61 | |
relef | 0:d2b901ef8f4a | 62 | /*********************************************************************** |
relef | 0:d2b901ef8f4a | 63 | * ht1632_chipselect / ht1632_chipfree |
relef | 0:d2b901ef8f4a | 64 | * Select or de-select a particular ht1632 chip. |
relef | 0:d2b901ef8f4a | 65 | * De-selecting a chip ends the commands being sent to a chip. |
relef | 0:d2b901ef8f4a | 66 | * CD pins are active-low; writing 0 to the pin selects the chip. |
relef | 0:d2b901ef8f4a | 67 | ***********************************************************************/ |
relef | 0:d2b901ef8f4a | 68 | |
relef | 0:d2b901ef8f4a | 69 | void ht1632_chipselect(byte chipno) |
relef | 0:d2b901ef8f4a | 70 | { |
relef | 0:d2b901ef8f4a | 71 | ht1632_cs = 0; |
relef | 0:d2b901ef8f4a | 72 | } |
relef | 0:d2b901ef8f4a | 73 | |
relef | 0:d2b901ef8f4a | 74 | void ht1632_chipfree(byte chipno) |
relef | 0:d2b901ef8f4a | 75 | { |
relef | 0:d2b901ef8f4a | 76 | ht1632_cs = 1; |
relef | 0:d2b901ef8f4a | 77 | } |
relef | 0:d2b901ef8f4a | 78 | |
relef | 0:d2b901ef8f4a | 79 | /* |
relef | 0:d2b901ef8f4a | 80 | * we keep a copy of the display controller contents so that we can |
relef | 0:d2b901ef8f4a | 81 | * know which bits are on without having to (slowly) read the device. |
relef | 0:d2b901ef8f4a | 82 | * Note that we only use the low four bits of the shadow ram, since |
relef | 0:d2b901ef8f4a | 83 | * we're shadowing 4-bit memory. This makes things faster, and we |
relef | 0:d2b901ef8f4a | 84 | * use the other half for a "snapshot" when we want to plot new data |
relef | 0:d2b901ef8f4a | 85 | * based on older data... |
relef | 0:d2b901ef8f4a | 86 | */ |
relef | 0:d2b901ef8f4a | 87 | // (fc) covers the case for 32x8 as well (64 bytes, 4 bits) |
relef | 0:d2b901ef8f4a | 88 | byte ht1632_shadowram[96]; // our copy of the display's RAM |
relef | 0:d2b901ef8f4a | 89 | |
relef | 0:d2b901ef8f4a | 90 | /* |
relef | 0:d2b901ef8f4a | 91 | * ht1632_writebits |
relef | 0:d2b901ef8f4a | 92 | * Write bits (up to <img src="http://timewitharduino.com/wp-includes/images/smilies/icon_cool.gif" alt="8)" class="wp-smiley"> to h1632 on pins HT1632_DATA, HT1632_WRCLK |
relef | 0:d2b901ef8f4a | 93 | * Chip is assumed to already be chip-selected |
relef | 0:d2b901ef8f4a | 94 | * Bits are shifted out from MSB to LSB, with the first bit sent |
relef | 0:d2b901ef8f4a | 95 | * being (bits & firstbit), shifted till firsbit is zero. |
relef | 0:d2b901ef8f4a | 96 | */ |
relef | 0:d2b901ef8f4a | 97 | void ht1632_writebits (byte bits, byte firstbit) |
relef | 0:d2b901ef8f4a | 98 | { |
relef | 0:d2b901ef8f4a | 99 | while (firstbit) { |
relef | 0:d2b901ef8f4a | 100 | ht1632_wrclk = 0; |
relef | 0:d2b901ef8f4a | 101 | if (bits & firstbit) { |
relef | 0:d2b901ef8f4a | 102 | ht1632_data = 1; |
relef | 0:d2b901ef8f4a | 103 | } |
relef | 0:d2b901ef8f4a | 104 | else { |
relef | 0:d2b901ef8f4a | 105 | ht1632_data = 0; |
relef | 0:d2b901ef8f4a | 106 | } |
relef | 0:d2b901ef8f4a | 107 | ht1632_wrclk = 1; |
relef | 0:d2b901ef8f4a | 108 | firstbit >>= 1; |
relef | 0:d2b901ef8f4a | 109 | } |
relef | 0:d2b901ef8f4a | 110 | } |
relef | 0:d2b901ef8f4a | 111 | |
relef | 0:d2b901ef8f4a | 112 | /* |
relef | 0:d2b901ef8f4a | 113 | * ht1632_sendcmd |
relef | 0:d2b901ef8f4a | 114 | * Send a command to the ht1632 chip. |
relef | 0:d2b901ef8f4a | 115 | * A command consists of a 3-bit "CMD" ID, an 8bit command, and |
relef | 0:d2b901ef8f4a | 116 | * one "don't care bit". |
relef | 0:d2b901ef8f4a | 117 | * Select 1 0 0 c7 c6 c5 c4 c3 c2 c1 c0 xx Free |
relef | 0:d2b901ef8f4a | 118 | */ |
relef | 0:d2b901ef8f4a | 119 | static void ht1632_sendcmd (byte command) |
relef | 0:d2b901ef8f4a | 120 | { |
relef | 0:d2b901ef8f4a | 121 | ht1632_chipselect(ht1632_cs); // Select chip |
relef | 0:d2b901ef8f4a | 122 | ht1632_writebits(ID_CMD, 1<<2); // send 3 bits of id: COMMMAND |
relef | 0:d2b901ef8f4a | 123 | ht1632_writebits(command, 1<<7); // send the actual command |
relef | 0:d2b901ef8f4a | 124 | ht1632_writebits(0, 1); /* one extra dont-care bit in commands. */ |
relef | 0:d2b901ef8f4a | 125 | ht1632_chipfree(ht1632_cs); //done |
relef | 0:d2b901ef8f4a | 126 | } |
relef | 0:d2b901ef8f4a | 127 | |
relef | 0:d2b901ef8f4a | 128 | |
relef | 0:d2b901ef8f4a | 129 | /* |
relef | 0:d2b901ef8f4a | 130 | * ht1632_clear |
relef | 0:d2b901ef8f4a | 131 | * clear the display, and the shadow memory, and the snapshot |
relef | 0:d2b901ef8f4a | 132 | * memory. This uses the "write multiple words" capability of |
relef | 0:d2b901ef8f4a | 133 | * the chipset by writing all 96 words of memory without raising |
relef | 0:d2b901ef8f4a | 134 | * the chipselect signal. |
relef | 0:d2b901ef8f4a | 135 | */ |
relef | 0:d2b901ef8f4a | 136 | void ht1632_clear() |
relef | 0:d2b901ef8f4a | 137 | { |
relef | 0:d2b901ef8f4a | 138 | char i; |
relef | 0:d2b901ef8f4a | 139 | |
relef | 0:d2b901ef8f4a | 140 | ht1632_chipselect(HT1632_CS); // Select chip |
relef | 0:d2b901ef8f4a | 141 | ht1632_writebits(ID_WR, 1<<2); // send ID: WRITE to RAM |
relef | 0:d2b901ef8f4a | 142 | ht1632_writebits(0, 1<<6); // Send address |
relef | 0:d2b901ef8f4a | 143 | for (i = 0; i < 96/2; i++) // Clear entire display |
relef | 0:d2b901ef8f4a | 144 | ht1632_writebits(0, 1<<7); // send 8 bits of data |
relef | 0:d2b901ef8f4a | 145 | ht1632_chipfree(HT1632_CS); // done |
relef | 0:d2b901ef8f4a | 146 | for (i=0; i < 96; i++) |
relef | 0:d2b901ef8f4a | 147 | ht1632_shadowram[i] = 0; |
relef | 0:d2b901ef8f4a | 148 | } |
relef | 0:d2b901ef8f4a | 149 | |
relef | 0:d2b901ef8f4a | 150 | /* |
relef | 0:d2b901ef8f4a | 151 | * ht1632_senddata |
relef | 0:d2b901ef8f4a | 152 | * send a nibble (4 bits) of data to a particular memory location of the |
relef | 0:d2b901ef8f4a | 153 | * ht1632. The command has 3 bit ID, 7 bits of address, and 4 bits of data. |
relef | 0:d2b901ef8f4a | 154 | * Select 1 0 1 A6 A5 A4 A3 A2 A1 A0 D0 D1 D2 D3 Free |
relef | 0:d2b901ef8f4a | 155 | * Note that the address is sent MSB first, while the data is sent LSB first! |
relef | 0:d2b901ef8f4a | 156 | * This means that somewhere a bit reversal will have to be done to get |
relef | 0:d2b901ef8f4a | 157 | * zero-based addressing of words and dots within words. |
relef | 0:d2b901ef8f4a | 158 | */ |
relef | 0:d2b901ef8f4a | 159 | static void ht1632_senddata (byte address, byte data) |
relef | 0:d2b901ef8f4a | 160 | { |
relef | 0:d2b901ef8f4a | 161 | ht1632_chipselect(HT1632_CS); // Select chip |
relef | 0:d2b901ef8f4a | 162 | ht1632_writebits(ID_WR, 1<<2); // send ID: WRITE to RAM |
relef | 0:d2b901ef8f4a | 163 | ht1632_writebits(address, 1<<6); // Send address |
relef | 0:d2b901ef8f4a | 164 | ht1632_writebits(data, 1<<3); // send 4 bits of data |
relef | 0:d2b901ef8f4a | 165 | ht1632_chipfree(HT1632_CS); // done |
relef | 0:d2b901ef8f4a | 166 | } |
relef | 0:d2b901ef8f4a | 167 | |
relef | 0:d2b901ef8f4a | 168 | void ht1632_setup() |
relef | 0:d2b901ef8f4a | 169 | { |
relef | 0:d2b901ef8f4a | 170 | ht1632_cs = HIGH; // unselect (active low) |
relef | 0:d2b901ef8f4a | 171 | ht1632_sendcmd(CMD_SYSDIS); // Disable system |
relef | 0:d2b901ef8f4a | 172 | |
relef | 0:d2b901ef8f4a | 173 | #ifdef _16x24_ |
relef | 0:d2b901ef8f4a | 174 | ht1632_sendcmd(CMD_COMS11); // 16*32, PMOS drivers |
relef | 0:d2b901ef8f4a | 175 | #else |
relef | 0:d2b901ef8f4a | 176 | // (fc) |
relef | 0:d2b901ef8f4a | 177 | ht1632_sendcmd(CMD_COMS10); // 32x8, PMOS drivers |
relef | 0:d2b901ef8f4a | 178 | #endif |
relef | 0:d2b901ef8f4a | 179 | |
relef | 0:d2b901ef8f4a | 180 | ht1632_sendcmd(CMD_MSTMD); // Master Mode |
relef | 0:d2b901ef8f4a | 181 | ht1632_sendcmd(CMD_SYSON); // System on |
relef | 0:d2b901ef8f4a | 182 | ht1632_sendcmd(CMD_LEDON); // LEDs on |
relef | 0:d2b901ef8f4a | 183 | |
relef | 0:d2b901ef8f4a | 184 | for (byte i=0; i<64; i++) |
relef | 0:d2b901ef8f4a | 185 | ht1632_senddata(i, 0); // clear the display! |
relef | 0:d2b901ef8f4a | 186 | |
relef | 0:d2b901ef8f4a | 187 | wait(0.1); // ? |
relef | 0:d2b901ef8f4a | 188 | } |
relef | 0:d2b901ef8f4a | 189 | |
relef | 0:d2b901ef8f4a | 190 | /* |
relef | 0:d2b901ef8f4a | 191 | * Copy a character glyph from the myfont data structure to |
relef | 0:d2b901ef8f4a | 192 | * display memory, with its upper left at the given coordinate |
relef | 0:d2b901ef8f4a | 193 | * This is unoptimized and simply uses plot() to draw each dot. |
relef | 0:d2b901ef8f4a | 194 | */ |
relef | 0:d2b901ef8f4a | 195 | void ht1632_putchar(int x, int y, char c) |
relef | 0:d2b901ef8f4a | 196 | { |
relef | 0:d2b901ef8f4a | 197 | // fonts defined for ascii 32 and beyond (index 0 in font array is ascii 32); |
relef | 0:d2b901ef8f4a | 198 | byte charIndex; |
relef | 0:d2b901ef8f4a | 199 | |
relef | 0:d2b901ef8f4a | 200 | // replace undisplayable characters with blank; |
relef | 0:d2b901ef8f4a | 201 | if (c < 32 || c > 126) |
relef | 0:d2b901ef8f4a | 202 | { |
relef | 0:d2b901ef8f4a | 203 | charIndex = 0; |
relef | 0:d2b901ef8f4a | 204 | } |
relef | 0:d2b901ef8f4a | 205 | else |
relef | 0:d2b901ef8f4a | 206 | { |
relef | 0:d2b901ef8f4a | 207 | charIndex = c - 32; |
relef | 0:d2b901ef8f4a | 208 | } |
relef | 0:d2b901ef8f4a | 209 | |
relef | 0:d2b901ef8f4a | 210 | // move character definition, pixel by pixel, onto the display; |
relef | 0:d2b901ef8f4a | 211 | // fonts are defined as one byte per row; |
relef | 0:d2b901ef8f4a | 212 | for (byte row=0; row<8; row++) |
relef | 0:d2b901ef8f4a | 213 | { |
relef | 0:d2b901ef8f4a | 214 | byte rowDots = myfont[charIndex][row]; |
relef | 0:d2b901ef8f4a | 215 | for (byte col=0; col<6; col++) |
relef | 0:d2b901ef8f4a | 216 | { |
relef | 0:d2b901ef8f4a | 217 | if (rowDots & (1<<(5-col))) |
relef | 0:d2b901ef8f4a | 218 | plot(x+col, y+row, 1); |
relef | 0:d2b901ef8f4a | 219 | else |
relef | 0:d2b901ef8f4a | 220 | plot(x+col, y+row, 0); |
relef | 0:d2b901ef8f4a | 221 | } |
relef | 0:d2b901ef8f4a | 222 | } |
relef | 0:d2b901ef8f4a | 223 | } |
relef | 0:d2b901ef8f4a | 224 | |
relef | 0:d2b901ef8f4a | 225 | /* |
relef | 0:d2b901ef8f4a | 226 | * plot a point on the display, with the upper left hand corner |
relef | 0:d2b901ef8f4a | 227 | * being (0,0), and the lower right hand corner being (23, 15). |
relef | 0:d2b901ef8f4a | 228 | * Note that Y increases going "downward" in contrast with most |
relef | 0:d2b901ef8f4a | 229 | * mathematical coordiate systems, but in common with many displays |
relef | 0:d2b901ef8f4a | 230 | * No error checking; bad things may happen if arguments are out of |
relef | 0:d2b901ef8f4a | 231 | * bounds! (The ASSERTS compile to nothing by default |
relef | 0:d2b901ef8f4a | 232 | */ |
relef | 0:d2b901ef8f4a | 233 | void ht1632_plot (int x, int y, char val) |
relef | 0:d2b901ef8f4a | 234 | { |
relef | 0:d2b901ef8f4a | 235 | if (x<0 || x>X_MAX || y<0 || y>Y_MAX) |
relef | 0:d2b901ef8f4a | 236 | return; |
relef | 0:d2b901ef8f4a | 237 | |
relef | 0:d2b901ef8f4a | 238 | char addr, bitval; |
relef | 0:d2b901ef8f4a | 239 | |
relef | 0:d2b901ef8f4a | 240 | /* |
relef | 0:d2b901ef8f4a | 241 | * The 4 bits in a single memory word go DOWN, with the LSB |
relef | 0:d2b901ef8f4a | 242 | * (first transmitted) bit being on top. However, writebits() |
relef | 0:d2b901ef8f4a | 243 | * sends the MSB first, so we have to do a sort of bit-reversal |
relef | 0:d2b901ef8f4a | 244 | * somewhere. Here, this is done by shifting the single bit in |
relef | 0:d2b901ef8f4a | 245 | * the opposite direction from what you might expect. |
relef | 0:d2b901ef8f4a | 246 | */ |
relef | 0:d2b901ef8f4a | 247 | bitval = 8>>(y&3); // compute which bit will need set |
relef | 0:d2b901ef8f4a | 248 | |
relef | 0:d2b901ef8f4a | 249 | #ifdef _16x24_ |
relef | 0:d2b901ef8f4a | 250 | addr = (x<<2) + (y>>2); // compute which memory word this is in |
relef | 0:d2b901ef8f4a | 251 | #else |
relef | 0:d2b901ef8f4a | 252 | // (fc) |
relef | 0:d2b901ef8f4a | 253 | addr = (x<<1) + (y>>2); // compute which memory word this is in |
relef | 0:d2b901ef8f4a | 254 | #endif |
relef | 0:d2b901ef8f4a | 255 | |
relef | 0:d2b901ef8f4a | 256 | if (val) { // Modify the shadow memory |
relef | 0:d2b901ef8f4a | 257 | ht1632_shadowram[addr] |= bitval; |
relef | 0:d2b901ef8f4a | 258 | } |
relef | 0:d2b901ef8f4a | 259 | else { |
relef | 0:d2b901ef8f4a | 260 | ht1632_shadowram[addr] &= ~bitval; |
relef | 0:d2b901ef8f4a | 261 | } |
relef | 0:d2b901ef8f4a | 262 | // Now copy the new memory value to the display |
relef | 0:d2b901ef8f4a | 263 | ht1632_senddata(addr, ht1632_shadowram[addr]); |
relef | 0:d2b901ef8f4a | 264 | } |
relef | 0:d2b901ef8f4a | 265 | |
relef | 0:d2b901ef8f4a | 266 | /* |
relef | 0:d2b901ef8f4a | 267 | * get_shadowram |
relef | 0:d2b901ef8f4a | 268 | * return the value of a pixel from the shadow ram. |
relef | 0:d2b901ef8f4a | 269 | */ |
relef | 0:d2b901ef8f4a | 270 | byte get_shadowram(byte x, byte y) |
relef | 0:d2b901ef8f4a | 271 | { |
relef | 0:d2b901ef8f4a | 272 | byte addr, bitval; |
relef | 0:d2b901ef8f4a | 273 | |
relef | 0:d2b901ef8f4a | 274 | bitval = 8>>(y&3); // compute which bit will need set |
relef | 0:d2b901ef8f4a | 275 | addr = (x<<2) + (y>>2); // compute which memory word this is in |
relef | 0:d2b901ef8f4a | 276 | return (0 != (ht1632_shadowram[addr] & bitval)); |
relef | 0:d2b901ef8f4a | 277 | } |
relef | 0:d2b901ef8f4a | 278 | |
relef | 0:d2b901ef8f4a | 279 | /* |
relef | 0:d2b901ef8f4a | 280 | * snapshot_shadowram |
relef | 0:d2b901ef8f4a | 281 | * Copy the shadow ram into the snapshot ram (the upper bits) |
relef | 0:d2b901ef8f4a | 282 | * This gives us a separate copy so we can plot new data while |
relef | 0:d2b901ef8f4a | 283 | * still having a copy of the old data. snapshotram is NOT |
relef | 0:d2b901ef8f4a | 284 | * updated by the plot functions (except "clear") |
relef | 0:d2b901ef8f4a | 285 | */ |
relef | 0:d2b901ef8f4a | 286 | void snapshot_shadowram() |
relef | 0:d2b901ef8f4a | 287 | { |
relef | 0:d2b901ef8f4a | 288 | for (char i=0; i< sizeof ht1632_shadowram; i++) { |
relef | 0:d2b901ef8f4a | 289 | ht1632_shadowram[i] = (ht1632_shadowram[i] & 0x0F) | ht1632_shadowram[i] << 4; // Use the upper bits |
relef | 0:d2b901ef8f4a | 290 | } |
relef | 0:d2b901ef8f4a | 291 | } |
relef | 0:d2b901ef8f4a | 292 | |
relef | 0:d2b901ef8f4a | 293 | /* |
relef | 0:d2b901ef8f4a | 294 | * get_snapshotram |
relef | 0:d2b901ef8f4a | 295 | * get a pixel value from the snapshot ram (instead of |
relef | 0:d2b901ef8f4a | 296 | * the actual displayed (shadow) memory |
relef | 0:d2b901ef8f4a | 297 | */ |
relef | 0:d2b901ef8f4a | 298 | byte get_snapshotram(byte x, byte y) |
relef | 0:d2b901ef8f4a | 299 | { |
relef | 0:d2b901ef8f4a | 300 | byte addr, bitval; |
relef | 0:d2b901ef8f4a | 301 | |
relef | 0:d2b901ef8f4a | 302 | bitval = 128>>(y&3); // user upper bits! |
relef | 0:d2b901ef8f4a | 303 | |
relef | 0:d2b901ef8f4a | 304 | #ifdef _16x24_ |
relef | 0:d2b901ef8f4a | 305 | addr = (x<<2) + (y>>2); // compute which memory word this is in |
relef | 0:d2b901ef8f4a | 306 | #else |
relef | 0:d2b901ef8f4a | 307 | // (fc) |
relef | 0:d2b901ef8f4a | 308 | addr = (x<<1) + (y>>2); // compute which memory word this is in |
relef | 0:d2b901ef8f4a | 309 | #endif |
relef | 0:d2b901ef8f4a | 310 | |
relef | 0:d2b901ef8f4a | 311 | if (ht1632_shadowram[addr] & bitval) |
relef | 0:d2b901ef8f4a | 312 | return 1; |
relef | 0:d2b901ef8f4a | 313 | return 0; |
relef | 0:d2b901ef8f4a | 314 | } |
relef | 0:d2b901ef8f4a | 315 | |
relef | 0:d2b901ef8f4a | 316 | /* |
relef | 0:d2b901ef8f4a | 317 | * This works equally well for both 16x24 and 8x32 matrices. |
relef | 0:d2b901ef8f4a | 318 | */ |
relef | 0:d2b901ef8f4a | 319 | void displayScrollingLine() |
relef | 0:d2b901ef8f4a | 320 | { |
relef | 0:d2b901ef8f4a | 321 | // shift the whole screen 6 times, one column at a time; |
relef | 0:d2b901ef8f4a | 322 | for (int x=0; x < 6; x++) |
relef | 0:d2b901ef8f4a | 323 | { |
relef | 0:d2b901ef8f4a | 324 | ht1632_putchar(-x, 0, msg[crtPos]); |
relef | 0:d2b901ef8f4a | 325 | ht1632_putchar(-x+6, 0, ((crtPos+1 < strlen(msg)) ? msg[crtPos+1] : ' ')); |
relef | 0:d2b901ef8f4a | 326 | ht1632_putchar(-x+12, 0, ((crtPos+2 < strlen(msg)) ? msg[crtPos+2] : ' ')); |
relef | 0:d2b901ef8f4a | 327 | ht1632_putchar(-x+18, 0, ((crtPos+3 < strlen(msg)) ? msg[crtPos+3] : ' ')); |
relef | 0:d2b901ef8f4a | 328 | ht1632_putchar(-x+24, 0, ((crtPos+4 < strlen(msg)) ? msg[crtPos+4] : ' ')); |
relef | 0:d2b901ef8f4a | 329 | ht1632_putchar(-x+30, 0, ((crtPos+5 < strlen(msg)) ? msg[crtPos+5] : ' ')); |
relef | 0:d2b901ef8f4a | 330 | ht1632_putchar(-x+36, 0, ((crtPos+6 < strlen(msg)) ? msg[crtPos+6] : ' ')); |
relef | 0:d2b901ef8f4a | 331 | wait(0.05); |
relef | 0:d2b901ef8f4a | 332 | } |
relef | 0:d2b901ef8f4a | 333 | |
relef | 0:d2b901ef8f4a | 334 | crtPos++; |
relef | 0:d2b901ef8f4a | 335 | if (crtPos >= strlen(msg)) |
relef | 0:d2b901ef8f4a | 336 | { |
relef | 0:d2b901ef8f4a | 337 | crtPos = 0; |
relef | 0:d2b901ef8f4a | 338 | } |
relef | 0:d2b901ef8f4a | 339 | } |
relef | 0:d2b901ef8f4a | 340 | |
relef | 0:d2b901ef8f4a | 341 | /*********************************************************************** |
relef | 0:d2b901ef8f4a | 342 | * traditional Arduino sketch functions: setup and loop. |
relef | 0:d2b901ef8f4a | 343 | ***********************************************************************/ |
relef | 0:d2b901ef8f4a | 344 | |
relef | 0:d2b901ef8f4a | 345 | void setup () |
relef | 0:d2b901ef8f4a | 346 | { |
relef | 0:d2b901ef8f4a | 347 | ht1632_setup(); |
relef | 0:d2b901ef8f4a | 348 | cls(); |
relef | 0:d2b901ef8f4a | 349 | } |
relef | 0:d2b901ef8f4a | 350 | |
relef | 0:d2b901ef8f4a | 351 | void loop () |
relef | 0:d2b901ef8f4a | 352 | { |
relef | 0:d2b901ef8f4a | 353 | // display line; |
relef | 0:d2b901ef8f4a | 354 | displayScrollingLine(); |
relef | 0:d2b901ef8f4a | 355 | } |