DIPマイコンLPC1114FNでmbed入門 Ledマトリックスで遊びましょう ~ その4 ~
DIPマイコンLPC1114FNでmbed入門
Ledマトリックスで遊びましょう ~その4 あこがれの文字スクロール~
mbed LPC1114FN(以後、1114FN)は安価に購入できて、mbedクラウド開発環境を使ってプログラムを開発することができるマイコンです。1114FNを使って、8×8ドット=64個のLEDを使ったLEDマトリックスに文字を表示します。
1枚のLEDマトリックスに「0」を表示できましたか。1枚のLEDマトリックスに「0~9」を表示できましたか。今回はこのユニットに0~9を横に右から左へスクロールし、流れるように表示します。
注)
mbed LPC1114FNは発売からずいぶん経過しており、
Arm社が提供する「Mbed OS」および「Mbedプラットフォーム」は、2026年7月をもって完全にサポートを終了します。期間終了後はウェブサイトがアーカイブされ、オンラインでのプロジェクトビルドやコンパイルは一切できなくなります。回路図やプログラムは参考資料として公表します。
○スクロール文字の表示原理
流れるようなスクロール文字はあちこちで見かけるのですが、プログラムの方法やプログラム例はなかなか見つからず、筆者流で考えました。
(1)最初に1列目をLEDマトリックス8に表示します。
00000000
00011000
00011000
00111000
00011000
00011000
00011000
01111110
12345678
(2) (1)をLEDマトリックス7に、次の列を8に表示します。
00000000
00011000
00011000
00111000
00011000
00011000
00011000
01111110
12345678
(3)これを繰り返します。
00000000
00011000
00011000
00111000
00011000
00011000
00011000
01111110
12345678
##(4)このように表示するので、データは8列単位で直線に並べられていた方がわかりやすいのです。これをデータの数だけ繰り返します。1文字なら8列、2文字なら16列、10文字なら80列のデータとなります。
○プログラミング
■データ変換部
前回と同じです。二次元配列bitsum[i][j]に入っているLEDマトリックス点灯データを一元配列bitline[k]に変換し、スクロール文字表示がやりやすいようにします。
数字 0~9の10文字=80列を変換します。1文字8列なので、bitline[k]は0~79となります。
k=0;
for(i=0;i<10;i++){// scroll data henkan
for(j=0;j<8;j++){
bitline[k]=bitsum[i][j];
k++;
}
}
■スクロール文字表示部
数字 0~9の10文字を表示します。1文字8列なので、80列を表示します。最後の文字は、i=72 → i+7=79となり、最後の列を表示して終了します。最終文字を最後までクロールする方法ですが・・・ぜひ考えて工夫してください。
for(i=0;i<80-8;i++){ //scroll hyouji
maxSingle(1,bitline[i+0]);
maxSingle(2,bitline[i+1]);
maxSingle(3,bitline[i+2]);
maxSingle(4,bitline[i+3]);
maxSingle(5,bitline[i+4]);
maxSingle(6,bitline[i+5]);
maxSingle(7,bitline[i+6]);
maxSingle(8,bitline[i+7]);
wait(0.1);
}
○プログラム全体
プログラム全体を示します。
// LedMatrix 1mai
#include "mbed.h"
DigitalOut led(dp28);
// spi(mosi,miso,sck)
SPI max72_spi(dp2, NC, dp6);
DigitalOut load(dp14);//spi load
// CPU MT7219
// dp1 mosi(Master In Salve Out) => DIN
// dp2 miso(Master OutSlave) => nc
// dp6 sck (Serial Clock) => clk
// dp14 =>(Slave Select) load
int maxInUse = 1; //change this variable to set how many MAX7219's you'll use
// define max7219 registers
#define max7219_reg_noop 0x00
#define max7219_reg_digit0 0x01
#define max7219_reg_digit1 0x02
#define max7219_reg_digit2 0x03
#define max7219_reg_digit3 0x04
#define max7219_reg_digit4 0x05
#define max7219_reg_digit5 0x06
#define max7219_reg_digit6 0x07
#define max7219_reg_digit7 0x08
#define max7219_reg_decodeMode 0x09
#define max7219_reg_intensity 0x0a
#define max7219_reg_scanLimit 0x0b
#define max7219_reg_shutdown 0x0c
#define max7219_reg_displayTest 0x0f
#define LOW 0
#define HIGH 1
#define MHZ 1000000
#define ON 1
#define OFF 0
void maxSingle( int reg, int col) {
//maxSingle is the "easy" function to use for a
//single max7219
load = LOW; // begin
max72_spi.write(reg); // specify register
max72_spi.write(col); // put data
load = HIGH; // make sure data is loaded (on rising edge of LOAD/CS)
}
void maxAll (int reg, int col) { // initialize all MAX7219's in the system
load = LOW; // begin
for ( int c=1; c<= maxInUse; c++) {
max72_spi.write(reg); // specify register
max72_spi.write(col); // put data
}
load = HIGH;
}
void maxOne(int maxNr, int reg, int col) {
//maxOne is for adressing different MAX7219's,
//while having a couple of them cascaded
int c = 0;
load = LOW;
for ( c = maxInUse; c >= maxNr; c--) {
max72_spi.write(0); // no-op
max72_spi.write(0); // no-op
}
max72_spi.write(reg); // specify register
max72_spi.write(col); // put data
for ( c=maxNr-1; c >= 1; c--) {
max72_spi.write(0); // no-op
max72_spi.write(0); // no-op
}
load = HIGH;
}
void setup () {
// initiation of the max 7219
// SPI setup: 8 bits, mode 0
max72_spi.format(8, 0);
// going by the datasheet, min clk is 100ns so theoretically 10MHz should work...
// max72_spi.frequency(10*MHZ);
maxAll(max7219_reg_scanLimit, 0x07);
maxAll(max7219_reg_decodeMode, 0x00); // using an led matrix (not digits)
maxAll(max7219_reg_shutdown, 0x01); // not in shutdown mode
maxAll(max7219_reg_displayTest, 0x00); // no display test
for (int e=1; e<=8; e++) { // empty registers, turn all LEDs off
maxAll(e,0);
}
maxAll(max7219_reg_intensity, 0x0f & 0x0f); // the first 0x0f is the value you can set
// range: 0x00 to 0x0f
}
void led_flash(){
int i;
for(i=0;i<3;i++){
led=ON;
wait(0.1);
led=OFF;
wait(0.1);
}
}
int main(void) {
const uint64_t moji_font[] = {// bold font , kagami moji font
0x3c66666e76663c00,//0~9
0x7e1818181c181800,
0x7e060c3060663c00,
0x3c66603860663c00,
0x30307e3234383000,
0x3c6660603e067e00,
0x3c66663e06663c00,
0x1818183030667e00,
0x3c66663c66663c00,
0x3c66607c66663c00,
};
int i,j,k;
uint8_t bitsum[1][8],bit1gyou,bitline[80];
uint64_t moji1;
setup();
led_flash();
wait(0.1);
while(1){
for(i=0;i<10;i++){
moji1=moji_font[i];// 0~9
for(j=0;j<8;j++){
bitsum[i][j]=0;
}
for(j=0;j<8;j++){
bit1gyou=moji1 & 0xff;
for(k=0;k<8;k++){// kagamimoji no font
//for(k=8;k>=1;k--){ // futuu no font
bitsum[i][k]=bitsum[i][k]+(bit1gyou & 0x01)*pow((double)2,(double)(j));
bit1gyou=bit1gyou >> 1;
}//i
moji1=moji1 >> 8;
}//j
}
k=0;
for(i=0;i<10;i++){// scroll data henkan
for(j=0;j<8;j++){
bitline[k]=bitsum[i][j];
k++;
}
}
for(i=0;i<80-8;i++){ //scroll hyouji
maxSingle(1,bitline[i+0]);
maxSingle(2,bitline[i+1]);
maxSingle(3,bitline[i+2]);
maxSingle(4,bitline[i+3]);
maxSingle(5,bitline[i+4]);
maxSingle(6,bitline[i+5]);
maxSingle(7,bitline[i+6]);
maxSingle(8,bitline[i+7]);
wait(0.1);
}
}//while
}//main
○Publish
次のURLでPublishしています。
https://developer.mbed.org/users/takeuchi/code/20160505_V14_LedMatrix/
憧れの文字スクロール表示はうまくできましたか。原理を理解すれば、16×16ドットマトリックスにも対応することができます。次回はLEDマトリックスユニットを2枚に増やします。お楽しみに!
投稿者の人気記事

-
taketea2018
さんが
2026/07/01
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する