#include "mbed.h" /* 割込周期に80us程度が必要なため、100uS,10000Hz周期とする リフレッシュレートを60Hz,ライン数を16とすると 10000/60/16≒10 PWMレベルは0..10とする */ DigitalOut R0(D2); DigitalOut G0(D3); DigitalOut B0(D4); DigitalOut R1(D5); DigitalOut G1(D6); DigitalOut B1(D7); DigitalOut CLK(D8); DigitalOut LAT(D10); DigitalOut OE(D9,1); BusOut line_select(A0,A1,A2,A3); Ticker ticker; uint8_t F_BUF_R[32][32]; uint8_t F_BUF_G[32][32]; uint8_t F_BUF_B[32][32]; void timerIsr()//10KHz { static uint8_t line=0; static uint8_t PWM=0; uint8_t x; for(x=0;x<32;x++){ B0=F_BUF_B[line][x]>PWM; B1=F_BUF_B[line+16][x]>PWM; R0=F_BUF_R[line][x]>PWM; R1=F_BUF_R[line+16][x]>PWM; G0=F_BUF_G[line][x]>PWM; G1=F_BUF_G[line+16][x]>PWM; CLK=1; CLK=0; } OE=1;//出力OFF LAT=1; LAT=0; line_select=line;//新しい行の選択 OE=0;//出力ON if(++line>15){ line=0; PWM++; if(PWM>=10)PWM=0; } } int main() { uint8_t x,y; uint16_t ct=0; ticker.attach_us(&timerIsr, 100);//100uS,10KHz wait(0.2); // 200 ms /*ALL TEST uint8_t R=0,G=0,B=0; while(1){ for(y=0;y<32;y++){ for(x=0;x<32;x++){ F_BUF_B[y][x]=B; F_BUF_R[y][x]=R; F_BUF_G[y][x]=G; } } R++;if(R>=10){ R=0; G++;if(G>=10){ G=0; B++;if(B>=10)B=0; } } wait_ms(100); } */ loop: ct=0; while(1) { x=32.0*rand()/RAND_MAX; y=32.0*rand()/RAND_MAX; F_BUF_R[y][x]=10.0*rand()/RAND_MAX; F_BUF_B[y][x]=10.0*rand()/RAND_MAX; F_BUF_G[y][x]=10.0*rand()/RAND_MAX; wait_ms(2); // wait_us(500); if(++ct>4000)break; } memset(F_BUF_R,0,1024); memset(F_BUF_G,0,1024); memset(F_BUF_B,0,1024); ct=0; uint8_t R=0,G=0,B=0; while(1) { for(uint8_t y=0;y<32;y++){ for(uint8_t x=0;x<32;x++){ wait_ms(10); if(++ct>3200)goto next; F_BUF_R[x][y]=R; F_BUF_G[x][y]=G; F_BUF_B[x][y]=B; if(++R>10){ R=0; if(++G>10){ G=0; if(++B>10){ B=0; } } } } } // wait_ms(500); } next: ct=0; while(1) { cllp: x=32.0*rand()/RAND_MAX; y=32.0*rand()/RAND_MAX; F_BUF_R[y][x]=0; F_BUF_B[y][x]=0; F_BUF_G[y][x]=0; for(uint8_t y=0;y<32;y++){ for(uint8_t x=0;x<32;x++){ if((F_BUF_R[y][x]!=0)||(F_BUF_B[y][x]!=0)||(F_BUF_G[y][x]!=0))goto cllp; } } goto loop; } }