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