suu pen
/
Library_MY9221
12-Channel LED Driver With Gray scale Adaptive Pulse Density Modulation Control IC maker MY-Semi
main.cpp
- Committer:
- suupen
- Date:
- 2017-10-22
- Revision:
- 0:104d4c4514b8
- Child:
- 1:caa6335a5b06
File content as of revision 0:104d4c4514b8:
/** * @section DESCRIPTION * maker http://www.my-semi.com/content/products/product_mean.aspx?id=9 * shop http://akizukidenshi.com/catalog/g/gI-09678/ */ /* MY9366 http://www.my-semi.com/content/products/product_mean.aspx?id=28 */ #define LIBMY9221 #include "mbed.h" #ifdef LIBMY9221 #include "MY9221.h" MY9221 MY9221(p5, p10, 1); // di, clk, number #else DigitalOut DCKI (p10); // clk DigitalOut DI(p5); //========================= // command data description //========================= // 0x0000にクリアした上で、下記の定義をorしていく // CMD[10] 0000 0x00 0000 0000 lout Tr/Tf select #define LOUT_SLOW_MODE (0x0000) #define LOUT_FAST_MODE (0x0400) // CMD[9:8] 0000 00xx 0000 0000 Gryascale resolution select #define GRAYSCALE_8BIT (0x0000) #define GRAYSCALE_12BIT (0x0100) #define GRAYSCALE_14BIT (0x0200) #define GRAYSCALE_16BIT (0x0300) // CMD[7:5] 0000 0000 xxx0 0000 Internal oscillator freq select #define ORIGINAL_FREQ1 (0x0000) #define ORIGINAL_FREQ2 (0x0020) #define ORIGINAL_FREQ4 (0x0040) #define ORIGINAL_FREQ8 (0x0060) #define ORIGINAL_FREQ16 (0x0080) #define ORIGINAL_FREQ64 (0x00a0) #define ORIGINAL_FREQ128 (0x00c0) #define ORIGINAL_FREQ256 (0x00e0) // CMD[4] 0000 0000 000x 0000 Output waveform select #define WAVE_MYPWM (0x0000) // Only Grayscale = 8bit #define WAVE_APDM (0x0010) // CMD[3] 0000 0000 0000 x000 Grayscale clock source select #define GCLOCK_INTERNAL (0x0000) #define GCLOCK_EXTERNAL (0x0008) // CMD[2] 0000 0000 0000 0x00 Output polarity select #define WORK_LED (0x0000) #define WORK_MYPWM (0x0004) // CMD[1] 0000 0000 0000 00x0 Counter reset select #define COUNTER_FREE (0x0000) #define COUNTER_RESET (0x0002) // CMD[0] 0000 0000 0000 000x One-shot select #define SHOT_REPEAT (0x0000) #define SHOT_SHOT (0x0001) // commandData_t D[]の配列番号 // MY9221のOUTxの番号と配列番号をあわせるための定義 #define OUT3 (0) #define OUT2 (1) #define OUT1 (2) #define OUT0 (3) //========================= // MY9221 command data 定義 //========================= typedef struct { uint16_t DA; uint16_t DB; uint16_t DC; } dataSet_t; typedef struct { uint16_t CMD; dataSet_t D[4]; // [0]:OUT3 [1]:OUT2 [2]:OUT1 [3]:OUT0 } commandData_t; commandData_t MY9221_data[1] = { 0x0000, // CMD 0xffff, // DA3; 0xffff, // DB3; 0xffff, // DC3; 0x00ff, // DA2; 0x00ff, // DB2; 0x00ff, // DC2; 0x000f, // DA1; 0x000f, // DB1; 0x000f, // DC1; 0x0000, // DA0; 0x0000, // DB0; 0x0000 // DC0; }; /** send one word data * @param uint16_t data : send data * @param return none */ void sendWord(uint16_t data) { uint16_t temp = data; uint8_t count = 8; __disable_irq(); // 禁止 DCKI = 0; wait_us(1); do { DI = ((temp & 0x8000) == 0x8000) ? 1 : 0; temp <<= 1; wait_us(1); DCKI = 1; wait_us(1); DI = ((temp & 0x8000) == 0x8000) ? 1 : 0; temp <<= 1; wait_us(1); DCKI = 0; wait_us(1); } while(--count > 0); DI = 0; DCKI = 0; __enable_irq(); // 許可 } /** data latch & display * @param none * @param return none */ void latch(void) { __disable_irq(); // 禁止 DCKI = 0; wait_us(1); DI = 1; wait_us(1); DI = 0; wait_us(1); DI = 1; wait_us(1); DI = 0; wait_us(1); DI = 1; wait_us(1); DI = 0; wait_us(1); DI = 1; wait_us(1); DI = 0; wait_us(1); DCKI = 0; __enable_irq(); // 許可 } /** send brock data * @param commandData_t *data : MY9221 Data * @param uint8_t number : connection number (min=1) * @param none */ void sendBrock(commandData_t *data, uint8_t number) { for(uint8_t i = 0; i < number; i++) { sendWord((data + i)->CMD); sendWord((data + i)->D[0].DA); sendWord((data + i)->D[0].DB); sendWord((data + i)->D[0].DC); sendWord((data + i)->D[1].DA); sendWord((data + i)->D[1].DB); sendWord((data + i)->D[1].DC); sendWord((data + i)->D[2].DA); sendWord((data + i)->D[2].DB); sendWord((data + i)->D[2].DC); sendWord((data + i)->D[3].DA); sendWord((data + i)->D[3].DB); sendWord((data + i)->D[3].DC); } latch(); } DigitalOut myled(LED1); #endif #ifndef LIBMY9221 int main() { uint16_t temp[12]; MY9221_data[0].CMD = 0; MY9221_data[0].CMD = LOUT_FAST_MODE | GRAYSCALE_16BIT | ORIGINAL_FREQ1 | WAVE_APDM | GCLOCK_INTERNAL | WORK_LED | COUNTER_FREE | SHOT_REPEAT; for(uint8_t i=0; i < 12; i++){ temp[i] = i * 0x0100; } while(1) { sendBrock(MY9221_data, 1); for(uint8_t i=0; i < 12; i++){ temp[i] += 0x100; if(temp[i] == 0){temp[i] = 1;} } printf("%04x %04x %04x\r\n",MY9221_data[0].CMD, temp[0], temp[1]); MY9221_data[0].D[OUT3].DA = temp[0]; MY9221_data[0].D[OUT3].DB = 0;//temp[1]; MY9221_data[0].D[OUT3].DC = 0;//temp[2]; MY9221_data[0].D[OUT2].DA = 0;//temp[3]; MY9221_data[0].D[OUT2].DB = temp[4]; MY9221_data[0].D[OUT2].DC = 0;//temp[5]; myled = 1; MY9221_data[0].D[OUT1].DA = 0;//temp[6]; MY9221_data[0].D[OUT1].DB = 0;//temp[7]; MY9221_data[0].D[OUT1].DC = temp[8]; MY9221_data[0].D[OUT0].DA = temp[9]; MY9221_data[0].D[OUT0].DB = 0;//temp[10]; MY9221_data[0].D[OUT0].DC = temp[11]; /* tempA++; tempB++; tempC++; MY9221_data[0].D[OUT3].DA = tempA; MY9221_data[0].D[OUT3].DB = tempA; MY9221_data[0].D[OUT3].DC = tempA; MY9221_data[0].D[OUT2].DA = tempA; MY9221_data[0].D[OUT2].DB = tempA; MY9221_data[0].D[OUT2].DC = tempA; myled = 1; MY9221_data[0].D[OUT1].DA = tempA; MY9221_data[0].D[OUT1].DB = tempA; MY9221_data[0].D[OUT1].DC = tempA; MY9221_data[0].D[OUT0].DA = tempA; MY9221_data[0].D[OUT0].DB = tempA; MY9221_data[0].D[OUT0].DC = tempA; */ // wait(0.1); myled = 0; // wait(0.2); } } #else int main() { MY9221.initialTest(); while(1){ MY9221.test(); } } #endif