00001
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 #include <stdarg.h>
00053 #include <stdio.h>
00054 #include "board.h"
00055 #include "dip204.h"
00056 #include "gpio.h"
00057 #include "compiler.h"
00058 #include "spi.h"
00059 #include "pwm.h"
00060 #include "delay.h"
00061
00062
00064 #define DIP204_WRITE_COMMAND 0xF8
00065
00067 #define DIP204_WRITE_DATA 0xFA
00068
00070 #define DIP204_READ_COMMAND 0xFC
00071
00073 #define DIP204_READ_DATA 0xFE
00074
00075 #define DIP204_PERIOD_MAX 50
00076
00077 #define DIP204_CGRAM_BASE_ADDR 0x40
00078
00079
00080 static void dip204_write_byte(unsigned char byte);
00081 static void dip204_read_byte(unsigned char *byte);
00082 static void dip204_select(void);
00083 static void dip204_unselect(void);
00084 static void dip204_wait_busy(void);
00085
00086
00088 static unsigned short pwm_duty;
00089
00091 static avr32_pwm_channel_t pwm_channel;
00092
00094 static int channel_id = -1;
00095
00096 #ifdef _ASSERT_ENABLE_
00097 static spi_status_t spi_status;
00098 #endif
00099
00100
00101
00102
00103 void dip204_init(backlight_options option, Bool backlight_on)
00104 {
00105 pwm_opt_t pwm_opt;
00106
00107 if (option == backlight_PWM)
00108 {
00109 channel_id = DIP204_PWM_CHANNEL;
00110 gpio_enable_module_pin(AVR32_PWM_6_PIN, AVR32_PWM_6_FUNCTION);
00111
00112
00113 pwm_opt.diva=0;
00114 pwm_opt.divb=0;
00115 pwm_opt.prea=0;
00116 pwm_opt.preb=0;
00117
00118 pwm_init(&pwm_opt);
00119 pwm_duty = (backlight_on) ? DIP204_PERIOD_MAX - 1 : 1;
00120 pwm_channel.CMR.calg = PWM_MODE_LEFT_ALIGNED;
00121 pwm_channel.CMR.cpol = PWM_POLARITY_LOW;
00122 pwm_channel.CMR.cpd = PWM_UPDATE_PERIOD;
00123 pwm_channel.CMR.cpre = AVR32_PWM_CPRE_MCK_DIV_256;
00124 pwm_channel.cdty = pwm_duty;
00125 pwm_channel.cprd = DIP204_PERIOD_MAX;
00126 pwm_channel.cupd = 0;
00127
00128 pwm_channel_init(channel_id, &pwm_channel);
00129
00130 pwm_start_channels(1 << channel_id);
00131 }
00132 else
00133 {
00134 if (backlight_on)
00135 {
00136 gpio_clr_gpio_pin(DIP204_BACKLIGHT_PIN);
00137 }
00138 else
00139 {
00140 gpio_set_gpio_pin(DIP204_BACKLIGHT_PIN);
00141 }
00142 }
00143
00144 delay_ms(20);
00145
00146 dip204_select();
00147
00148 dip204_write_byte(DIP204_WRITE_COMMAND);
00149
00150 dip204_write_byte(0x34);
00151
00152 delay_ms(1);
00153
00154 dip204_write_byte(0x09);
00155
00156 delay_ms(1);
00157
00158 dip204_write_byte(0x30);
00159
00160 delay_ms(1);
00161
00162 dip204_write_byte(0x0F);
00163
00164 delay_ms(1);
00165
00166 dip204_write_byte(0x01);
00167
00168 delay_ms(5);
00169
00170 dip204_write_byte(0x06);
00171
00172 delay_ms(1);
00173 dip204_wait_busy();
00174
00175 dip204_unselect();
00176 }
00177
00178
00179 void dip204_set_backlight(backlight_power power)
00180 {
00181 if (channel_id != -1)
00182 {
00183 if (power == backlight_power_decrease)
00184 {
00185
00186 pwm_duty = Max(pwm_duty - (DIP204_PERIOD_MAX / 10), 1);
00187 pwm_channel.CMR.cpd = PWM_UPDATE_DUTY;
00188
00189 pwm_channel.cupd = pwm_duty;
00190
00191 pwm_sync_update_channel(channel_id, &pwm_channel);
00192 }
00193 else if (power == backlight_power_increase)
00194 {
00195
00196 pwm_duty = Min(pwm_duty + (DIP204_PERIOD_MAX / 10), DIP204_PERIOD_MAX - 1);
00197 pwm_channel.CMR.cpd = PWM_UPDATE_DUTY;
00198
00199 pwm_channel.cupd = pwm_duty;
00200
00201 pwm_sync_update_channel(channel_id, &pwm_channel);
00202 }
00203 }
00204 else
00205 {
00206 if (power == backlight_power_decrease)
00207 {
00208 gpio_set_gpio_pin(DIP204_BACKLIGHT_PIN);
00209 }
00210 else if (power == backlight_power_increase)
00211 {
00212 gpio_clr_gpio_pin(DIP204_BACKLIGHT_PIN);
00213 }
00214 }
00215 }
00216
00217
00218 void dip204_show_cursor(void)
00219 {
00220
00221 dip204_select();
00222
00223 dip204_write_byte(DIP204_WRITE_COMMAND);
00224
00225 dip204_write_byte(0x0F);
00226 dip204_wait_busy();
00227
00228 dip204_unselect();
00229 }
00230
00231
00232 void dip204_hide_cursor(void)
00233 {
00234
00235 dip204_select();
00236
00237 dip204_write_byte(DIP204_WRITE_COMMAND);
00238
00239 dip204_write_byte(0x0C);
00240 dip204_wait_busy();
00241
00242 dip204_unselect();
00243 }
00244
00245
00246 void dip204_write_data(unsigned char data)
00247 {
00248 dip204_select();
00249
00250 dip204_write_byte(DIP204_WRITE_DATA);
00251
00252 dip204_write_byte(data);
00253 dip204_wait_busy();
00254 dip204_unselect();
00255 }
00256
00257
00258 void dip204_read_data(unsigned char *data)
00259 {
00260 dip204_select();
00261
00262 dip204_write_byte(DIP204_READ_DATA);
00263
00264 dip204_read_byte(data);
00265
00266 dip204_wait_busy();
00267 dip204_unselect();
00268 }
00269
00270
00271 void dip204_create_char(char ascii_code, const unsigned char data[8])
00272 {
00273 unsigned char i;
00274 unsigned char column, line;
00275
00276
00277 dip204_select();
00278
00279
00280
00281 dip204_write_byte(DIP204_READ_COMMAND);
00282
00283 dip204_read_byte(&i);
00284
00285 line = ((i&0x60) >> 5) + 1;
00286 column = (i&0x1F) + 1;
00287
00288
00289 dip204_write_byte(DIP204_WRITE_COMMAND);
00290
00291 dip204_write_byte(DIP204_CGRAM_BASE_ADDR + ((ascii_code << 3)&0x38));
00292
00293 dip204_wait_busy();
00294
00295
00296 for(i=0; i<8; i++)
00297 {
00298
00299 dip204_write_byte(DIP204_WRITE_DATA);
00300
00301 dip204_write_byte(data[i] & 0x1F);
00302
00303 dip204_wait_busy();
00304 }
00305
00306
00307 dip204_unselect();
00308
00309
00310 dip204_set_cursor_position(column, line);
00311 }
00312
00313
00314 void dip204_set_cursor_position(unsigned char column, unsigned char line)
00315 {
00316 unsigned char address = 0;
00317
00318 dip204_select();
00319 if ((column <= 20) && (line <= 4))
00320 {
00321
00322 address = ( (line-1) * 32 ) + ( column-1 ) + 128;
00323 }
00324
00325 dip204_write_byte(DIP204_WRITE_COMMAND);
00326
00327 dip204_write_byte(address);
00328 dip204_wait_busy();
00329 dip204_unselect();
00330 }
00331
00332
00333 void dip204_clear_display(void)
00334 {
00335 dip204_select();
00336
00337 dip204_write_byte(DIP204_WRITE_COMMAND);
00338
00339 dip204_write_byte(0x01);
00340
00341 delay_ms(4);
00342 dip204_wait_busy();
00343 dip204_unselect();
00344 }
00345
00346
00347 void dip204_write_string(const char *string)
00348 {
00349 unsigned char i=0;
00350
00351 dip204_select();
00352
00353 while(string[i]!=0)
00354 {
00355
00356 dip204_write_byte(DIP204_WRITE_DATA);
00357
00358 dip204_write_byte(string[i]);
00359
00360 i++;
00361 dip204_wait_busy();
00362 }
00363 dip204_unselect();
00364 }
00365
00366
00367 void dip204_printf_string(const char *format, ...)
00368 {
00369 va_list arg;
00370 char string[21];
00371 unsigned char i=0;
00372
00373 va_start(arg, format);
00374 i = vsprintf(string, format, arg);
00375 while (i < sizeof(string) - 1) string[i++] = '\0';
00376 va_end(arg);
00377 dip204_select();
00378
00379 i = 0;
00380 while(string[i]!='\0')
00381 {
00382
00383 dip204_write_byte(DIP204_WRITE_DATA);
00384
00385 dip204_write_byte(string[i]);
00386
00387 i++;
00388 dip204_wait_busy();
00389 }
00390 dip204_unselect();
00391 }
00392
00393
00394
00395
00399 static void dip204_select(void)
00400 {
00401 spi_selectChip(DIP204_SPI, DIP204_SPI_NPCS);
00402 }
00403
00404
00408 static void dip204_unselect(void)
00409 {
00410 #ifdef _ASSERT_ENABLE_
00411 spi_status =
00412 #endif
00413 spi_unselectChip(DIP204_SPI, DIP204_SPI_NPCS);
00414 Assert( SPI_OK==spi_status );
00415 }
00416
00417
00424 static void dip204_write_byte(unsigned char byte)
00425 {
00426 unsigned char reverse;
00427
00428 switch (byte)
00429 {
00430
00431 case DIP204_READ_COMMAND:
00432 case DIP204_WRITE_COMMAND:
00433 case DIP204_READ_DATA:
00434 case DIP204_WRITE_DATA:
00435 {
00436
00437 #ifdef _ASSERT_ENABLE_
00438 spi_status =
00439 #endif
00440 spi_write(DIP204_SPI, byte);
00441 Assert( SPI_OK==spi_status );
00442 break;
00443 }
00444
00445 default:
00446 {
00447
00448 reverse = bit_reverse8(byte);
00449
00450 #ifdef _ASSERT_ENABLE_
00451 spi_status =
00452 #endif
00453 spi_write(DIP204_SPI, (reverse & 0xF0));
00454 Assert( SPI_OK==spi_status );
00455
00456 #ifdef _ASSERT_ENABLE_
00457 spi_status =
00458 #endif
00459 spi_write(DIP204_SPI, ((reverse << 4) & 0xF0));
00460 Assert( SPI_OK==spi_status );
00461 break;
00462 }
00463 }
00464 }
00465
00466
00473 static void dip204_read_byte(unsigned char *byte)
00474 {
00475 unsigned short reverse = 0x00;
00476
00477
00478 #ifdef _ASSERT_ENABLE_
00479 spi_status =
00480 #endif
00481 spi_write(DIP204_SPI, 0x00);
00482 Assert( SPI_OK==spi_status );
00483
00484 #ifdef _ASSERT_ENABLE_
00485 spi_status =
00486 #endif
00487 spi_read(DIP204_SPI, &reverse);
00488 Assert( SPI_OK==spi_status );
00489
00490 *byte = bit_reverse8(reverse);
00491 }
00492
00493
00497 static void dip204_wait_busy(void)
00498 {
00499 unsigned char status = 0x00;
00500
00501
00502 dip204_write_byte(DIP204_READ_COMMAND);
00503
00504 do {
00505 dip204_read_byte(&status);
00506
00507 }while (status & 0x80);
00508 }