moving string demo

Dependencies:   KP1632D mbed

文字列をLEDマトリクスに移動表示させるデモ

32x16 LEDドットマトリクス表示を使って、'mbed'の文字列を斜め方向に移動表示させます。
斜めに移動しますので、上下左右の端点にぶつかると、反射して反対方向に動きます。
このため、裏返しの文字になったり、上下反対の文字になったりします。

接続をサボるため、ドットマトリクス表示のArduinoシールドで接続しています。
このため、Arduino接続が可能なmbed基板で試しました。
手持ちの関係で、FRDM-KL25Z、NUCLEOのF401RE,L152RE,F103RBでの動作になりましたが、F103RBだけは、割り込みの間隔が一定しない現象が現れています。

Committer:
morita
Date:
Sun Jun 08 12:52:29 2014 +0000
Revision:
0:3caa8cdd0426
'mbed' string move demo.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
morita 0:3caa8cdd0426 1 /*
morita 0:3caa8cdd0426 2 32dot*16dot LED display demo.
morita 0:3caa8cdd0426 3 moving 'mbed'
morita 0:3caa8cdd0426 4 */
morita 0:3caa8cdd0426 5
morita 0:3caa8cdd0426 6 #include "mbed.h"
morita 0:3caa8cdd0426 7 #include "kp1632d.h"
morita 0:3caa8cdd0426 8
morita 0:3caa8cdd0426 9 //if uses push SW (speed UP ,speed DOWN)
morita 0:3caa8cdd0426 10 #define PUSH_SW
morita 0:3caa8cdd0426 11
morita 0:3caa8cdd0426 12 //Serial pc(SERIAL_TX, SERIAL_RX);
morita 0:3caa8cdd0426 13 Serial pc(USBTX, USBRX);
morita 0:3caa8cdd0426 14
morita 0:3caa8cdd0426 15 #ifdef TARGET_LPC1768
morita 0:3caa8cdd0426 16 KP1632D disp(p5,p6,p7,p8,p9,p10); //defalut interrupt speed = 200uS
morita 0:3caa8cdd0426 17 #ifdef PUSH_SW
morita 0:3caa8cdd0426 18 DigitalIn SW1(p19,PullUp),SW2(p20,PullUp);
morita 0:3caa8cdd0426 19 #endif
morita 0:3caa8cdd0426 20 #endif
morita 0:3caa8cdd0426 21 #ifdef TARGET_KLXX
morita 0:3caa8cdd0426 22 KP1632D disp(D7,D9,D10,D6,D5,D4); //defalut interrupt speed = 200uS
morita 0:3caa8cdd0426 23 #ifdef PUSH_SW
morita 0:3caa8cdd0426 24 DigitalIn SW1(D2,PullUp),SW2(D3,PullUp);
morita 0:3caa8cdd0426 25 #endif
morita 0:3caa8cdd0426 26 #endif
morita 0:3caa8cdd0426 27 #ifdef TARGET_STM
morita 0:3caa8cdd0426 28 KP1632D disp(D7,D9,D10,D6,D5,D4); //defalut interrupt speed = 200uS
morita 0:3caa8cdd0426 29 #ifdef PUSH_SW
morita 0:3caa8cdd0426 30 DigitalIn SW1(D2,PullUp),SW2(D3,PullUp);
morita 0:3caa8cdd0426 31 #endif
morita 0:3caa8cdd0426 32 #endif
morita 0:3caa8cdd0426 33 #ifndef PUSH_SW
morita 0:3caa8cdd0426 34 DigitalIn SW1(NC),SW2(NC);
morita 0:3caa8cdd0426 35 #endif
morita 0:3caa8cdd0426 36 //KP1632D disp(D7,D9,D10,D6,D5,D4,1000); //set interrupt speed = 1000uS
morita 0:3caa8cdd0426 37 //KP1632D disp(D7,D9,D10,D6,D5); //if ENB=NC, interrupt speed=defalut
morita 0:3caa8cdd0426 38 //KP1632D disp(D7,D9,D10,D6,D5,NC,1000); //if ENB=NC, interrupt speed set
morita 0:3caa8cdd0426 39
morita 0:3caa8cdd0426 40 int main() {
morita 0:3caa8cdd0426 41 Timer timer;
morita 0:3caa8cdd0426 42 uint8_t x[8],y[8];
morita 0:3caa8cdd0426 43 int8_t d_x[8],d_y[8];
morita 0:3caa8cdd0426 44
morita 0:3caa8cdd0426 45 uint32_t cg_buf[7];
morita 0:3caa8cdd0426 46 uint32_t ptn;
morita 0:3caa8cdd0426 47
morita 0:3caa8cdd0426 48 uint8_t i,j;
morita 0:3caa8cdd0426 49 uint16_t w=100;
morita 0:3caa8cdd0426 50 uint8_t point_x[7][32]={};
morita 0:3caa8cdd0426 51 uint8_t point_y[7][32]={};
morita 0:3caa8cdd0426 52 uint8_t pp=0;
morita 0:3caa8cdd0426 53
morita 0:3caa8cdd0426 54 bool sw1a=false;
morita 0:3caa8cdd0426 55 bool sw2a=false;
morita 0:3caa8cdd0426 56
morita 0:3caa8cdd0426 57 pc.printf("Start KP-1632D demo. \r\n");
morita 0:3caa8cdd0426 58
morita 0:3caa8cdd0426 59 disp.printf("mbed");//moved string
morita 0:3caa8cdd0426 60 for(i=0;i<7;i++)cg_buf[i]=disp.pbuf[i].i32; //copy string to CG buffer
morita 0:3caa8cdd0426 61 disp.cls();
morita 0:3caa8cdd0426 62 disp.printf("Startdemo");
morita 0:3caa8cdd0426 63 for(i=0;i<7;i++){
morita 0:3caa8cdd0426 64 x[i]=i;
morita 0:3caa8cdd0426 65 y[i]=10-i;
morita 0:3caa8cdd0426 66 d_x[i]=1;
morita 0:3caa8cdd0426 67 d_y[i]=1;
morita 0:3caa8cdd0426 68 }
morita 0:3caa8cdd0426 69 wait_ms(1000);
morita 0:3caa8cdd0426 70
morita 0:3caa8cdd0426 71 timer.start();
morita 0:3caa8cdd0426 72 while(1) {
morita 0:3caa8cdd0426 73 if(timer.read_ms()>w){//wait refresh time
morita 0:3caa8cdd0426 74 //frame calc.
morita 0:3caa8cdd0426 75 timer.reset();
morita 0:3caa8cdd0426 76 pp=(pp+1)&31;
morita 0:3caa8cdd0426 77 for(i=0;i<7;i++){
morita 0:3caa8cdd0426 78 x[i] += d_x[i];//move X direction
morita 0:3caa8cdd0426 79 y[i] += d_y[i];//move Y direction
morita 0:3caa8cdd0426 80 if(x[i]>=31)d_x[i]=-d_x[i];//bound left
morita 0:3caa8cdd0426 81 if(x[i]==0)d_x[i]=-d_x[i];//bound right
morita 0:3caa8cdd0426 82 if(y[i]>=15)d_y[i]=-d_y[i];//bound lower
morita 0:3caa8cdd0426 83 if(y[i]==0)d_y[i]=-d_y[i];//bound upper
morita 0:3caa8cdd0426 84 point_x[i][pp]=x[i];
morita 0:3caa8cdd0426 85 point_y[i][pp]=y[i];
morita 0:3caa8cdd0426 86 }
morita 0:3caa8cdd0426 87 for(i=0;i<16;i++)disp.abuf[i].i32=0;
morita 0:3caa8cdd0426 88 ptn=1;
morita 0:3caa8cdd0426 89 for(i=0;i<32;i++){
morita 0:3caa8cdd0426 90 for(j=0;j<7;j++){
morita 0:3caa8cdd0426 91 if(cg_buf[j] & ptn)disp.abuf[point_y[j][(pp+i)&31]].i32 |= (1<<point_x[j][(pp+i)&31]);
morita 0:3caa8cdd0426 92 }
morita 0:3caa8cdd0426 93 ptn <<= 1;
morita 0:3caa8cdd0426 94 }
morita 0:3caa8cdd0426 95 disp.tranfer_sw=true;
morita 0:3caa8cdd0426 96 }
morita 0:3caa8cdd0426 97 if(SW1==0){
morita 0:3caa8cdd0426 98 if(sw1a==false){
morita 0:3caa8cdd0426 99 sw1a=true;
morita 0:3caa8cdd0426 100 w += (w/10);
morita 0:3caa8cdd0426 101 if(w>1000)w=1000;//max 1 second
morita 0:3caa8cdd0426 102 }
morita 0:3caa8cdd0426 103 } else sw1a=false;
morita 0:3caa8cdd0426 104 if(SW2==0){
morita 0:3caa8cdd0426 105 if(sw2a==false){
morita 0:3caa8cdd0426 106 sw2a=true;
morita 0:3caa8cdd0426 107 w -= (w/10);
morita 0:3caa8cdd0426 108 if(w<20)w=20; //t>10mS (t>sw scan time)
morita 0:3caa8cdd0426 109 }
morita 0:3caa8cdd0426 110 } else sw2a=false;
morita 0:3caa8cdd0426 111
morita 0:3caa8cdd0426 112 wait_ms(10);//push sw scan time
morita 0:3caa8cdd0426 113 }
morita 0:3caa8cdd0426 114 }