moving string demo

Dependencies:   KP1632D mbed

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

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

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

Revision:
0:3caa8cdd0426
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jun 08 12:52:29 2014 +0000
@@ -0,0 +1,114 @@
+/*
+    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
+    }
+}