DIPマイコンLPC1114FNでmbed入門 Ledマトリックスで遊びましょう ~その3~
DIPマイコンLPC1114FNでmbed入門
Ledマトリックスで遊びましょう ~その3~
mbed LPC1114FN(以後、1114FN)は安価に購入できて、mbedクラウド開発環境を使ってプログラムを開発することができるマイコンです。1114FNを使って、8×8ドット=64個のLEDを使ったLEDマトリックスに文字を表示します。
1枚のLEDマトリックスに「0」を表示できましたか。今回はこのユニットに0~9を一文字ずつ表示します。
注)
mbed LPC1114FNは発売からずいぶん経過しており、
Arm社が提供する「Mbed OS」および「Mbedプラットフォーム」は、2026年7月をもって完全にサポートを終了します。期間終了後はウェブサイトがアーカイブされ、オンラインでのプロジェクトビルドやコンパイルは一切できなくなります。回路図やプログラムは参考資料として公表します。
○フォントについて
文字や数字を表示するにはフォントを作る必要があります。フォント製作用ツールやサイトがいくつかあります。ここでは次のサイトを利用させて頂きました。このサイトは製作したLEDマトリックスユニットの使用を想定しているようです。ただ、ターゲットとしているマイコンはArduinoと思われます。
http://xantorohara.github.io/led-matrix-editor/
ここで制作するフォントは鏡文字のフォントです。左右が逆に配置されている点に注意して、プログラムを作成します。
○プログラムについて
■表示データ変換部
bitsum[i][j] i:0~9 数字の0~9を示します。j:0~7 LEDマトリックス 1列目から8列目のデータが入ります。
bitline[k] 二次元配列bitsum[i][j]のデータを表示しやすいように一元配列bitline[k]に入れます。この変換は後のスクロール文字を表示しやすくするために行っています。
k=0;
for(i=0;i<10;i++){// matrix data henkan
for(j=0;j<8;j++){
bitline[k]=bitsum[i][j];
k++;
}
}
■LEDマトリックス表示部
bitline[0~]のデータを8つずつ順番にLEDマトリックスに表示します。確認用LEDのON/OFFが入っていますが、なくてもかまいません。
for(i=0;i<80;i=i+8){//1 moji goto hyouji
led=ON;
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.2);
led=OFF;
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++){// matrix data henkan
for(j=0;j<8;j++){
bitline[k]=bitsum[i][j];
k++;
}
}
for(i=0;i<80;i=i+8){//1 moji goto hyouji
led=ON;
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.2);
led=OFF;
wait(0.1);
}
}//while
}//main
■Publish
このプログラムは下記URLにてPublishしています。
https://developer.mbed.org/users/takeuchi/code/20160505_V13_LedMatrix/
次回はスクロール文字表示に挑戦します。
投稿者の人気記事

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