00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <avr/io.h>
00012 #include <avr/interrupt.h>
00013 #include <util/delay.h>
00014 #include "common.h"
00015 #include "lcdproxima.h"
00016
00017
00018
00019
00020 uint64_t latches = 0;
00021
00022
00023
00024
00025
00026
00027 const uint64_t LCDP_characters[4][16] =
00028 {
00029 {
00030 LCDP_SEGMENT_0A | LCDP_SEGMENT_0B | LCDP_SEGMENT_0C | LCDP_SEGMENT_0D | LCDP_SEGMENT_0E | LCDP_SEGMENT_0F,
00031 LCDP_SEGMENT_0B | LCDP_SEGMENT_0C,
00032 LCDP_SEGMENT_0A | LCDP_SEGMENT_0B | LCDP_SEGMENT_0D | LCDP_SEGMENT_0E | LCDP_SEGMENT_0G,
00033 LCDP_SEGMENT_0A | LCDP_SEGMENT_0B | LCDP_SEGMENT_0C | LCDP_SEGMENT_0D | LCDP_SEGMENT_0G,
00034 LCDP_SEGMENT_0B | LCDP_SEGMENT_0C | LCDP_SEGMENT_0F | LCDP_SEGMENT_0G,
00035 LCDP_SEGMENT_0A | LCDP_SEGMENT_0C | LCDP_SEGMENT_0D | LCDP_SEGMENT_0F | LCDP_SEGMENT_0G,
00036 LCDP_SEGMENT_0A | LCDP_SEGMENT_0C | LCDP_SEGMENT_0D | LCDP_SEGMENT_0E | LCDP_SEGMENT_0F | LCDP_SEGMENT_0G,
00037 LCDP_SEGMENT_0A | LCDP_SEGMENT_0B | LCDP_SEGMENT_0C,
00038 LCDP_SEGMENT_0A | LCDP_SEGMENT_0B | LCDP_SEGMENT_0C | LCDP_SEGMENT_0D | LCDP_SEGMENT_0E | LCDP_SEGMENT_0F | LCDP_SEGMENT_0G,
00039 LCDP_SEGMENT_0A | LCDP_SEGMENT_0B | LCDP_SEGMENT_0C | LCDP_SEGMENT_0D | LCDP_SEGMENT_0F | LCDP_SEGMENT_0G,
00040 LCDP_SEGMENT_0A | LCDP_SEGMENT_0B | LCDP_SEGMENT_0C | LCDP_SEGMENT_0E | LCDP_SEGMENT_0F | LCDP_SEGMENT_0G,
00041 LCDP_SEGMENT_0C | LCDP_SEGMENT_0D | LCDP_SEGMENT_0E | LCDP_SEGMENT_0F | LCDP_SEGMENT_0G,
00042 LCDP_SEGMENT_0A | LCDP_SEGMENT_0D | LCDP_SEGMENT_0E | LCDP_SEGMENT_0F,
00043 LCDP_SEGMENT_0B | LCDP_SEGMENT_0C | LCDP_SEGMENT_0D | LCDP_SEGMENT_0E | LCDP_SEGMENT_0G,
00044 LCDP_SEGMENT_0A | LCDP_SEGMENT_0D | LCDP_SEGMENT_0E | LCDP_SEGMENT_0F | LCDP_SEGMENT_0G,
00045 LCDP_SEGMENT_0A | LCDP_SEGMENT_0E | LCDP_SEGMENT_0F | LCDP_SEGMENT_0G,
00046 },
00047 {
00048 LCDP_SEGMENT_1A | LCDP_SEGMENT_1B | LCDP_SEGMENT_1C | LCDP_SEGMENT_1D | LCDP_SEGMENT_1E | LCDP_SEGMENT_1F,
00049 LCDP_SEGMENT_1B | LCDP_SEGMENT_1C,
00050 LCDP_SEGMENT_1A | LCDP_SEGMENT_1B | LCDP_SEGMENT_1D | LCDP_SEGMENT_1E | LCDP_SEGMENT_1G,
00051 LCDP_SEGMENT_1A | LCDP_SEGMENT_1B | LCDP_SEGMENT_1C | LCDP_SEGMENT_1D | LCDP_SEGMENT_1G,
00052 LCDP_SEGMENT_1B | LCDP_SEGMENT_1C | LCDP_SEGMENT_1F | LCDP_SEGMENT_1G,
00053 LCDP_SEGMENT_1A | LCDP_SEGMENT_1C | LCDP_SEGMENT_1D | LCDP_SEGMENT_1F | LCDP_SEGMENT_1G,
00054 LCDP_SEGMENT_1A | LCDP_SEGMENT_1C | LCDP_SEGMENT_1D | LCDP_SEGMENT_1E | LCDP_SEGMENT_1F | LCDP_SEGMENT_1G,
00055 LCDP_SEGMENT_1A | LCDP_SEGMENT_1B | LCDP_SEGMENT_1C,
00056 LCDP_SEGMENT_1A | LCDP_SEGMENT_1B | LCDP_SEGMENT_1C | LCDP_SEGMENT_1D | LCDP_SEGMENT_1E | LCDP_SEGMENT_1F | LCDP_SEGMENT_1G,
00057 LCDP_SEGMENT_1A | LCDP_SEGMENT_1B | LCDP_SEGMENT_1C | LCDP_SEGMENT_1D | LCDP_SEGMENT_1F | LCDP_SEGMENT_1G,
00058 LCDP_SEGMENT_1A | LCDP_SEGMENT_1B | LCDP_SEGMENT_1C | LCDP_SEGMENT_1E | LCDP_SEGMENT_1F | LCDP_SEGMENT_1G,
00059 LCDP_SEGMENT_1C | LCDP_SEGMENT_1D | LCDP_SEGMENT_1E | LCDP_SEGMENT_1F | LCDP_SEGMENT_1G,
00060 LCDP_SEGMENT_1A | LCDP_SEGMENT_1D | LCDP_SEGMENT_1E | LCDP_SEGMENT_1F,
00061 LCDP_SEGMENT_1B | LCDP_SEGMENT_1C | LCDP_SEGMENT_1D | LCDP_SEGMENT_1E | LCDP_SEGMENT_1G,
00062 LCDP_SEGMENT_1A | LCDP_SEGMENT_1D | LCDP_SEGMENT_1E | LCDP_SEGMENT_1F | LCDP_SEGMENT_1G,
00063 LCDP_SEGMENT_1A | LCDP_SEGMENT_1E | LCDP_SEGMENT_1F | LCDP_SEGMENT_1G,
00064 },
00065 {
00066 LCDP_SEGMENT_2A | LCDP_SEGMENT_2B | LCDP_SEGMENT_2C | LCDP_SEGMENT_2D | LCDP_SEGMENT_2E | LCDP_SEGMENT_2F,
00067 LCDP_SEGMENT_2B | LCDP_SEGMENT_2C,
00068 LCDP_SEGMENT_2A | LCDP_SEGMENT_2B | LCDP_SEGMENT_2D | LCDP_SEGMENT_2E | LCDP_SEGMENT_2G,
00069 LCDP_SEGMENT_2A | LCDP_SEGMENT_2B | LCDP_SEGMENT_2C | LCDP_SEGMENT_2D | LCDP_SEGMENT_2G,
00070 LCDP_SEGMENT_2B | LCDP_SEGMENT_2C | LCDP_SEGMENT_2F | LCDP_SEGMENT_2G,
00071 LCDP_SEGMENT_2A | LCDP_SEGMENT_2C | LCDP_SEGMENT_2D | LCDP_SEGMENT_2F | LCDP_SEGMENT_2G,
00072 LCDP_SEGMENT_2A | LCDP_SEGMENT_2C | LCDP_SEGMENT_2D | LCDP_SEGMENT_2E | LCDP_SEGMENT_2F | LCDP_SEGMENT_2G,
00073 LCDP_SEGMENT_2A | LCDP_SEGMENT_2B | LCDP_SEGMENT_2C,
00074 LCDP_SEGMENT_2A | LCDP_SEGMENT_2B | LCDP_SEGMENT_2C | LCDP_SEGMENT_2D | LCDP_SEGMENT_2E | LCDP_SEGMENT_2F | LCDP_SEGMENT_2G,
00075 LCDP_SEGMENT_2A | LCDP_SEGMENT_2B | LCDP_SEGMENT_2C | LCDP_SEGMENT_2D | LCDP_SEGMENT_2F | LCDP_SEGMENT_2G,
00076 LCDP_SEGMENT_2A | LCDP_SEGMENT_2B | LCDP_SEGMENT_2C | LCDP_SEGMENT_2E | LCDP_SEGMENT_2F | LCDP_SEGMENT_2G,
00077 LCDP_SEGMENT_2C | LCDP_SEGMENT_2D | LCDP_SEGMENT_2E | LCDP_SEGMENT_2F | LCDP_SEGMENT_2G,
00078 LCDP_SEGMENT_2A | LCDP_SEGMENT_2D | LCDP_SEGMENT_2E | LCDP_SEGMENT_2F,
00079 LCDP_SEGMENT_2B | LCDP_SEGMENT_2C | LCDP_SEGMENT_2D | LCDP_SEGMENT_2E | LCDP_SEGMENT_2G,
00080 LCDP_SEGMENT_2A | LCDP_SEGMENT_2D | LCDP_SEGMENT_2E | LCDP_SEGMENT_2F | LCDP_SEGMENT_2G,
00081 LCDP_SEGMENT_2A | LCDP_SEGMENT_2E | LCDP_SEGMENT_2F | LCDP_SEGMENT_2G,
00082 },
00083 {
00084 LCDP_SEGMENT_3A | LCDP_SEGMENT_3B | LCDP_SEGMENT_3C | LCDP_SEGMENT_3D | LCDP_SEGMENT_3E | LCDP_SEGMENT_3F,
00085 LCDP_SEGMENT_3B | LCDP_SEGMENT_3C,
00086 LCDP_SEGMENT_3A | LCDP_SEGMENT_3B | LCDP_SEGMENT_3D | LCDP_SEGMENT_3E | LCDP_SEGMENT_3G,
00087 LCDP_SEGMENT_3A | LCDP_SEGMENT_3B | LCDP_SEGMENT_3C | LCDP_SEGMENT_3D | LCDP_SEGMENT_3G,
00088 LCDP_SEGMENT_3B | LCDP_SEGMENT_3C | LCDP_SEGMENT_3F | LCDP_SEGMENT_3G,
00089 LCDP_SEGMENT_3A | LCDP_SEGMENT_3C | LCDP_SEGMENT_3D | LCDP_SEGMENT_3F | LCDP_SEGMENT_3G,
00090 LCDP_SEGMENT_3A | LCDP_SEGMENT_3C | LCDP_SEGMENT_3D | LCDP_SEGMENT_3E | LCDP_SEGMENT_3F | LCDP_SEGMENT_3G,
00091 LCDP_SEGMENT_3A | LCDP_SEGMENT_3B | LCDP_SEGMENT_3C,
00092 LCDP_SEGMENT_3A | LCDP_SEGMENT_3B | LCDP_SEGMENT_3C | LCDP_SEGMENT_3D | LCDP_SEGMENT_3E | LCDP_SEGMENT_3F | LCDP_SEGMENT_3G,
00093 LCDP_SEGMENT_3A | LCDP_SEGMENT_3B | LCDP_SEGMENT_3C | LCDP_SEGMENT_3D | LCDP_SEGMENT_3F | LCDP_SEGMENT_3G,
00094 LCDP_SEGMENT_3A | LCDP_SEGMENT_3B | LCDP_SEGMENT_3C | LCDP_SEGMENT_3E | LCDP_SEGMENT_3F | LCDP_SEGMENT_3G,
00095 LCDP_SEGMENT_3C | LCDP_SEGMENT_3D | LCDP_SEGMENT_3E | LCDP_SEGMENT_3F | LCDP_SEGMENT_3G,
00096 LCDP_SEGMENT_3A | LCDP_SEGMENT_3D | LCDP_SEGMENT_3E | LCDP_SEGMENT_3F,
00097 LCDP_SEGMENT_3B | LCDP_SEGMENT_3C | LCDP_SEGMENT_3D | LCDP_SEGMENT_3E | LCDP_SEGMENT_3G,
00098 LCDP_SEGMENT_3A | LCDP_SEGMENT_3D | LCDP_SEGMENT_3E | LCDP_SEGMENT_3F | LCDP_SEGMENT_3G,
00099 LCDP_SEGMENT_3A | LCDP_SEGMENT_3E | LCDP_SEGMENT_3F | LCDP_SEGMENT_3G,
00100 },
00101 };
00102
00103
00104
00105
00106 void LCDP_init (void)
00107 {
00108 LCDP_DDR |= LCDP_DATA | LCDP_CLB | LCDP_DLEN;
00109 LCDP_PORT &= ~(LCDP_DATA | LCDP_CLB | LCDP_DLEN);
00110 }
00111
00112
00113
00114
00115 void LCDP_toggleCLB (void)
00116 {
00117 LCDP_PORT |= LCDP_CLB;
00118 _delay_us (10);
00119 LCDP_PORT &= ~LCDP_CLB;
00120 _delay_us (10);
00121 }
00122
00123
00124
00125
00126
00127
00128
00129
00130 void LCDP_writeLatch (uint32_t segments, bool_t latchA)
00131 {
00132 uint8_t i;
00133
00134 LCDP_PORT |= LCDP_DLEN;
00135 LCDP_PORT &= ~(LCDP_DATA | LCDP_CLB);
00136 LCDP_toggleCLB ();
00137
00138 for (i = 0; i < 32; i++)
00139 {
00140 if (segments & 0x0001)
00141 {
00142 LCDP_PORT |= LCDP_DATA;
00143 }
00144 else
00145 {
00146 LCDP_PORT &= ~LCDP_DATA;
00147 }
00148 segments >>= 1;
00149 LCDP_toggleCLB ();
00150 }
00151
00152 if (latchA)
00153 {
00154 LCDP_PORT |= LCDP_DATA;
00155 }
00156 else
00157 {
00158 LCDP_PORT &= ~LCDP_DATA;
00159 }
00160 LCDP_toggleCLB ();
00161 LCDP_PORT &= ~LCDP_DLEN;
00162 LCDP_toggleCLB ();
00163 }
00164
00165
00166
00167
00168 void LCDP_writeLatches (void)
00169 {
00170 LCDP_writeLatch (latches >> 32, TRUE);
00171 LCDP_writeLatch (latches & 0xFFFFFFFFul, FALSE);
00172 }
00173
00174
00175
00176
00177
00178
00179 void LCDP_clear (void)
00180 {
00181 latches = (uint64_t) 0;
00182 LCDP_writeLatches ();
00183 }
00184
00185
00186
00187
00188
00189
00190 void LCDP_all (void)
00191 {
00192 latches = (uint64_t) 0xFFFFFFFFFFFFFFFFul;
00193 LCDP_writeLatches ();
00194 }
00195
00196
00197
00198
00199
00200
00201
00202
00203 void LCDP_printNumber (uint16_t number, bool_t leadingZeros)
00204 {
00205 uint8_t digit = 0;
00206
00207 latches &= ~(LCDP_characters[0][8] |
00208 LCDP_characters[1][8] |
00209 LCDP_characters[2][8] |
00210 LCDP_characters[3][8]);
00211 if (number < 10000u)
00212 {
00213 if (number == 0u)
00214 {
00215 if (leadingZeros)
00216 {
00217 latches |= LCDP_characters[0][0] | LCDP_characters[1][0] | LCDP_characters[2][0] |
00218 LCDP_characters[3][0];
00219 }
00220 else
00221 {
00222 latches |= LCDP_characters[0][0];
00223 }
00224 }
00225 else
00226 {
00227 while ((leadingZeros && digit < 4u) || number > 0)
00228 {
00229 latches |= LCDP_characters[digit][number % 10u];
00230 number /= 10u;
00231 digit++;
00232 }
00233 }
00234 }
00235 else
00236 {
00237
00238 latches |= LCDP_characters[0][0xE] | LCDP_SEGMENT_MAX;
00239 }
00240 LCDP_writeLatches ();
00241 }
00242
00243
00244
00245
00246
00247
00248
00249 void LCDP_printNumberHex (uint16_t number)
00250 {
00251 uint8_t digit = 0;
00252
00253 latches &= ~(LCDP_characters[0][8] |
00254 LCDP_characters[1][8] |
00255 LCDP_characters[2][8] |
00256 LCDP_characters[3][8]);
00257 if (number == 0)
00258 {
00259
00260 latches |= LCDP_characters[0][0];
00261 }
00262 else
00263 {
00264 while (number > 0)
00265 {
00266 latches |= LCDP_characters[digit][number & 0xF];
00267 number >>= 4;
00268 digit++;
00269 }
00270 }
00271 LCDP_writeLatches ();
00272 }
00273
00274
00275
00276
00277
00278
00279
00280 void LCDP_printNumberHexLZ (uint16_t number)
00281 {
00282 uint8_t digit = 0;
00283
00284 latches &= ~(LCDP_characters[0][8] |
00285 LCDP_characters[1][8] |
00286 LCDP_characters[2][8] |
00287 LCDP_characters[3][8]);
00288 while (digit < 4)
00289 {
00290 latches |= LCDP_characters[digit][number & 0xF];
00291 number >>= 4;
00292 digit++;
00293 }
00294 LCDP_writeLatches ();
00295 }
00296
00297 #if 0
00298
00299
00300
00301
00302
00303
00304
00305
00306 void LCDP_setBacklight (bool_t on)
00307 {
00308 if (on)
00309 {
00310
00311 }
00312 else
00313 {
00314
00315 }
00316 }
00317 #endif