![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
moving string demo
文字列をLEDマトリクスに移動表示させるデモ
32x16 LEDドットマトリクス表示を使って、'mbed'の文字列を斜め方向に移動表示させます。
斜めに移動しますので、上下左右の端点にぶつかると、反射して反対方向に動きます。
このため、裏返しの文字になったり、上下反対の文字になったりします。
接続をサボるため、ドットマトリクス表示のArduinoシールドで接続しています。
このため、Arduino接続が可能なmbed基板で試しました。
手持ちの関係で、FRDM-KL25Z、NUCLEOのF401RE,L152RE,F103RBでの動作になりましたが、F103RBだけは、割り込みの間隔が一定しない現象が現れています。
main.cpp
- Committer:
- morita
- Date:
- 2014-06-08
- Revision:
- 0:3caa8cdd0426
File content as of revision 0:3caa8cdd0426:
/* 32dot*16dot LED display demo. moving 'mbed' */ #include "mbed.h" #include "kp1632d.h" //if uses push SW (speed UP ,speed DOWN) #define PUSH_SW //Serial pc(SERIAL_TX, SERIAL_RX); Serial pc(USBTX, USBRX); #ifdef TARGET_LPC1768 KP1632D disp(p5,p6,p7,p8,p9,p10); //defalut interrupt speed = 200uS #ifdef PUSH_SW DigitalIn SW1(p19,PullUp),SW2(p20,PullUp); #endif #endif #ifdef TARGET_KLXX KP1632D disp(D7,D9,D10,D6,D5,D4); //defalut interrupt speed = 200uS #ifdef PUSH_SW DigitalIn SW1(D2,PullUp),SW2(D3,PullUp); #endif #endif #ifdef TARGET_STM KP1632D disp(D7,D9,D10,D6,D5,D4); //defalut interrupt speed = 200uS #ifdef PUSH_SW DigitalIn SW1(D2,PullUp),SW2(D3,PullUp); #endif #endif #ifndef PUSH_SW DigitalIn SW1(NC),SW2(NC); #endif //KP1632D disp(D7,D9,D10,D6,D5,D4,1000); //set interrupt speed = 1000uS //KP1632D disp(D7,D9,D10,D6,D5); //if ENB=NC, interrupt speed=defalut //KP1632D disp(D7,D9,D10,D6,D5,NC,1000); //if ENB=NC, interrupt speed set int main() { Timer timer; uint8_t x[8],y[8]; int8_t d_x[8],d_y[8]; uint32_t cg_buf[7]; uint32_t ptn; uint8_t i,j; uint16_t w=100; uint8_t point_x[7][32]={}; uint8_t point_y[7][32]={}; uint8_t pp=0; bool sw1a=false; bool sw2a=false; pc.printf("Start KP-1632D demo. \r\n"); disp.printf("mbed");//moved string for(i=0;i<7;i++)cg_buf[i]=disp.pbuf[i].i32; //copy string to CG buffer disp.cls(); disp.printf("Startdemo"); for(i=0;i<7;i++){ x[i]=i; y[i]=10-i; d_x[i]=1; d_y[i]=1; } wait_ms(1000); timer.start(); while(1) { if(timer.read_ms()>w){//wait refresh time //frame calc. timer.reset(); pp=(pp+1)&31; for(i=0;i<7;i++){ x[i] += d_x[i];//move X direction y[i] += d_y[i];//move Y direction if(x[i]>=31)d_x[i]=-d_x[i];//bound left if(x[i]==0)d_x[i]=-d_x[i];//bound right if(y[i]>=15)d_y[i]=-d_y[i];//bound lower if(y[i]==0)d_y[i]=-d_y[i];//bound upper point_x[i][pp]=x[i]; point_y[i][pp]=y[i]; } for(i=0;i<16;i++)disp.abuf[i].i32=0; ptn=1; for(i=0;i<32;i++){ for(j=0;j<7;j++){ if(cg_buf[j] & ptn)disp.abuf[point_y[j][(pp+i)&31]].i32 |= (1<<point_x[j][(pp+i)&31]); } ptn <<= 1; } disp.tranfer_sw=true; } if(SW1==0){ if(sw1a==false){ sw1a=true; w += (w/10); if(w>1000)w=1000;//max 1 second } } else sw1a=false; if(SW2==0){ if(sw2a==false){ sw2a=true; w -= (w/10); if(w<20)w=20; //t>10mS (t>sw scan time) } } else sw2a=false; wait_ms(10);//push sw scan time } }