It is a program to turn on the LED serial two Jksoft Blue mbed Board. Jksoft Blue mbed Boardの2つのシリアルLEDを点灯させるプログラムです。
LEDStrip_WS2812.cpp
00001 /* 00002 * WS2812 tape led IC 00003 * 00004 * 0.35us 0.8us (+-150ns) 00005 * 0: |^^^^^|__________| 00006 * 00007 * 0.7us 0.6us (+-150ns) 00008 * 1: |^^^^^^^^^^|_____| 00009 * 00010 * >50us 00011 * RESET: |________________| 00012 */ 00013 #include "mbed.h" 00014 #include "LEDStrip.h" 00015 00016 SPI tape(p11, NC, NC); 00017 00018 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) 00019 LPC_SSP_TypeDef *_ssp = LPC_SSP0; 00020 #elif defined(TARGET_LPC11U24) 00021 LPC_SSPx_Type *_ssp = LPC_SSP1; 00022 #endif 00023 00024 int num = 100; 00025 int *data; 00026 volatile int busy = 0, wakeup = 0; 00027 00028 00029 extern "C" 00030 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) 00031 void SSP0_IRQHandler() { 00032 #elif defined(TARGET_LPC11U24) 00033 void SSP1_IRQHandler() { 00034 #endif 00035 static int addr = 0, bit = 0x800000; 00036 repeat: 00037 if (busy) { 00038 // led data 00039 while (_ssp->SR & (1<<1)) { // TNF 00040 if (data[addr] & bit) { 00041 // 1 00042 //_ssp->DR = 0x01f; 00043 _ssp->DR = 0x007; 00044 } else { 00045 // 0 00046 _ssp->DR = 0x07f; 00047 } 00048 bit = bit >> 1; 00049 if (bit == 0) { 00050 bit = 0x800000; 00051 addr ++; 00052 if (addr >= num) { 00053 addr = 0; 00054 busy = 0; 00055 goto repeat; 00056 } 00057 } 00058 } 00059 } else { 00060 // blank 00061 while (_ssp->SR & (1<<1)) { // TNF 00062 _ssp->DR = 0xfff; 00063 if (addr < 50) { 00064 addr ++; 00065 } else { 00066 addr = 0; 00067 if (wakeup) { 00068 busy = 1; 00069 wakeup = 0; 00070 goto repeat; 00071 } 00072 } 00073 } 00074 } 00075 } 00076 00077 void tapeInit (int freq, int n) { 00078 00079 num = n; 00080 // data = new int(num); 00081 data = (int*)malloc(sizeof(int) * num); 00082 for (int i = 0; i < num; i ++) { 00083 data[i] = 0; 00084 } 00085 00086 tape.format(10, 1); 00087 if (freq) { 00088 tape.frequency(freq * 1000); 00089 } else { 00090 tape.frequency(8000000); 00091 } 00092 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) 00093 NVIC_SetVector(SSP0_IRQn, (uint32_t)SSP0_IRQHandler); 00094 NVIC_SetPriority(SSP0_IRQn, 0); 00095 NVIC_EnableIRQ(SSP0_IRQn); 00096 #elif defined(TARGET_LPC11U24) 00097 NVIC_SetVector(SSP1_IRQn, (uint32_t)SSP1_IRQHandler); 00098 NVIC_SetPriority(SSP1_IRQn, 0); 00099 NVIC_EnableIRQ(SSP1_IRQn); 00100 #endif 00101 _ssp->IMSC |= (1<<3); // TXIM 00102 } 00103 00104 void tapeSet (int n, int dat) { 00105 if (n >= 0 && n < num) { 00106 // RGB -> GRB 00107 data[n] = ((dat & 0xff0000) >> 8) | ((dat & 0xff00) << 8) | (dat & 0xff); 00108 } 00109 } 00110 void tapeSet(int n, int red , int green , int blue) { 00111 if (n >= 0 && n < num) { 00112 // RGB -> GRB 00113 data[n] = ((red & 0xff) << 8) | ((green & 0xff) << 16) | (blue & 0xff); 00114 } 00115 } 00116 00117 void tapeSend () { 00118 if (busy) { 00119 while (busy); 00120 wait_us(50); 00121 } 00122 wakeup = 1; 00123 while (wakeup); 00124 } 00125 00126 int tapeGet (int n) { 00127 return ((data[n] & 0xff0000) >> 8) | ((data[n] & 0xff00) << 8) | (data[n] & 0xff); 00128 }
Generated on Tue Jul 12 2022 17:47:54 by 1.7.2