• 締切済み

8×8ドットマトリクスLED表示について

ForCy-USBのプログラミング http://www.recursion.jp/product/forcyusb/manual.pdf ForCy-USBを使って8×8のドットマトリクスLEDを一つ一つ点灯させたいのですがやり方が分かりません。(64個のLEDを任意に点灯)サイトの情報ではほとんどがc言語のプログラムなので質問させていただきました。 0xff 0x24 =sfr// ポートB を出力 0x0f 0x27 =sfr// ポートC 下位4bit を出力 0xfa 0x2a =sfr// ポートD 上位4bit を出力 :init ;scan [8]led 0 0x25 =sfr scan ++ 7 & =scan 1 scan << ~ dup 0x28 =sfr 0xf0 & 0x2b =sfr scan led 0x25 =sfr @c :main ↑(このようなプログラミングです) 例えば、斜め線を作るプログラムを作成していただけませんか。 ○○○○○○○● ○○○○○○●○ ○○○○○●○○ ○○○○●○○○ ○○○●○○○○ ○○●○○○○○ ○●○○○○○○ ●○○○○○○○ ____________________________________________ 0xff 0x24 =sfr // DDRB 0x0f 0x27 =sfr // DDRC 0xfa 0x2a =sfr // DDRD :ポート設定 ;行 [8]内容 0 0x25 =sfr // いったん消灯 行 ++ 7 & =行 // 表示行を巡回移動 1 行 << ~ // 対応する行のビットを0 dup 0x0f & 0x30 | 0x28 =sfr // SW1,2 はプルアップ 0xf0 & 0x2b =sfr 行 内容 0x25 =sfr // その行の内容表示 :走査 8 0 { dup 内容 ~ over =内容 ++ } for .. :反転 ポート設定 0 =行 8 0 { 0xff over << over =内容 ++ } for .. { 走査 反転 } interrupt @c . :LED表示 上記サイトの25Pをみてやっています

みんなの回答

  • ts3m-ickw
  • ベストアンサー率43% (1248/2897)
回答No.1

うわ‥‥これは判りにくい言語だこと。 ; が変数の定義で、変数名に漢字が使えるのか‥‥ってことは、 内容[]に表示したいデータを入れておけば良さそうだね。 0x01 0 =内容 0x02 1 =内容 0x04 2 =内容 0x08 3 =内容 0x10 4 =内容 0x20 5 =内容 0x40 6 =内容 0x80 7 =内容 を「;行 [8]内容」の下にでも入れておいたらいいんじゃない? どっちがMSBだか調べてないけど斜めには表示されるでしょう。

abcdefgzxy
質問者

お礼

ありがとうございます。さっそく試してみます

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • LEDマトリクスについて質問です。

    LEDマトリクスについて質問です。 今LEDマトリクスを制御しようとしているのですが、プログラムの方法がいまちよく分かりません。 LEDマトリクスはアノードコモン、アノード側の制御はPNPトランジスタ、 カソード側の制御はNPNトランジスタで行っています。 なので、自分は1行目(アノード)1列目(カソード)のLEDを表示させるために1行目 (PNPトランジスタ)に0を、1列目(NPNトランジスタ)に1を出力しているのですが点灯してくれません。 アノード側のPNPトランジスタに接続しているのはポートAで、カソード側NPNトランジスタに接続しているのはポートBです。 以下にソースコードを示すので、間違いの指摘のことよろしくお願いします。 void wait(long wait) /* 時間を指定できる時間稼ぎ関数 */ { while(wait--); } int main(void) /* 実際に表示をする関数 */ { PADDR = 0xff; /* ポートA全ビット入力 */ PAPCR = 0xff; PBDDR = 0xff; /* ポートB全ビット出力 */ int i; for(;;) { for(i = 0;i <= 8;i++) { /* 1列目の表示 */ PADR = 0x01 ; PBDR = 0x01 << i; wait(50000); PBDR = 0; } PADR = 0; wait(1000); for(i = 8;i >= 0;i--) { /* 2列目の表示 */ PADR = 0x01 << 1; PBDR = 0x01 << i; wait(50000); PBDR = 0; } PADR = 0; wait(1000); for(i = 0;i <= 8;i++) { /* 3列目の表示 */ PADR = 0x01 << 2; PBDR = 0x01 << i; wait(50000); PBDR = 0; } PADR = 0; wait(1000); for(i = 8;i >= 0;i--) { /* 4列目の表示 */ PADR = 0x01 << 3; PBDR = 0x01 << i; wait(50000); PBDR = 0; } PADR = 0; wait(1000); for(i = 0;i <= 8;i++) { /* 5列目の表示 */ PADR = 0x01 << 4; PBDR = 0x01 << i; wait(50000); PBDR = 0; } PADR = 0; wait(1000); for(i = 8;i >= 0;i--) { /* 6列目の表示 */ PADR = 0x01 << 5; PBDR = 0x01 << i; wait(50000); PBDR = 0; } PADR = 0; wait(1000); for(i = 0;i <= 8;i++) { /* 7列目の表示 */ PADR = 0x01 << 6; PBDR = 0x01 << i; wait(50000); PBDR = 0; } PADR = 0; wait(1000); for(i = 8;i >= 0;i--) { /* 8列目の表示 */ PADR = 0x01 << 7; PBDR = 0x01 << i; wait(50000); PBDR = 0; } PADR = 0; wait(1000); } }

  • 32×16ドットLEDマトリクス表示装置をCで動かしたい!

    AKI-H8-3048/Fを使って32×16ドットLEDマトリクス表示装置を動かそうとしています。以前投稿して、そのときの意見やいろんなサイトを参考にCでプログラムを作ってみましたが動きません。 ↓が作ったプログラムです。 #include <3048f.h> #include <stdio.h> /* 待ち時間発生初期化 ************************************/ void timer_init(void){ ITU0.TCR.BYTE = 0x23; ITU0.GRA = 0x07d0; ITU.TSTR.BIT.STR0 = 0; return; } /* 待ち時間発生 引数に、必要なミリ秒を指定する***********/ void wait(int msec){ int i; ITU.TSTR.BIT.STR0 = 1; for(i=0;i<msec;i++){ do{ }while(ITU0.TSR.BIT.IMFA == 0); ITU0.TSR.BIT.IMFA = 0; } ITU.TSTR.BIT.STR0 = 0; return; } /* 表示 ********************************************/ void print(void){ int a=0; int sin1[16]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; int sin2[16]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; int sin3[16]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; while(1){ P1.DR.BIT.B0 =0; wait(100); P1.DR.BIT.B0 =1; wait(100); P1.DR.BIT.B4 =1; for(a=0;a<=16;a++){ P1.DR.BIT.B2 =sin1[a]; P1.DR.BIT.B1 =sin2[a]; P1.DR.BIT.B3 =sin3[a]; } } return; } /* メイン関数 ********************************************/ void main(void){ timer_init(); /* timerの初期化 */ P1.DDR = 0x1f; /* port1出力に設定 */ print(); } 何が違うのかわからないのでご指摘をお願いします。

  • 組み込みアカデミー LEDを1個点灯のはずが2個点灯してしまいます

    組み込みアカデミー第1回 LEDを1個点灯のはずが2個点灯してしまいます。 対象は付録の「NE-R8C/25」です。動作確認プログラムのslos.hwsを実行するとLED1と2が交互・同時点灯を繰り返し、正常に動作しています。 ところが以下のプログラムをC:\WorkSpace\step01\step01\step01.a30として実行してもLEDが2個点灯してしまいます。 プログラム中 LED1点灯のところがMOV.B #11111110b,p2でもLED1と2同時に点灯してしまいます。 指定されたsfr_r825.incファイルはc:\WorkSpase\STEP01\STEP01以下にコピーしています。 .INCLUDE sfr_r825.inc ;SFR定義ファイルのインクルード .SECTION PROGRAM,CODE ;コードセクション .ORG 0009000h Start: MOV.B #11111111b,pd2 ;入出力ポートP2を出力ポートに設定 BCLR p2_0      ;LED1点灯  BSET p2_1      ;LED2消灯 Loop: JMP Loop .SECTION FIXVECTOR,ROMDATA .ORG 0FFFCh Reset: .LWORD Start|0FF000000h .END

  • PIC 8このLEDの点灯 左から右 右から左

    ↓のコードで 8つのLEDを右から左に一つずつ順番に点灯したあと左から右に順番に点灯させるプログラムをつくりたい そして下のコードに ~~~~ここに1行~~~~と書いているところがあります。 そこになにか一行書くとできるらしいのです。 でもどうやってもできません。 loop1: btfsc PORT_A,1 goto loop1 多分、↑に書いたコードの箇所がずっと無限に回ってるからだとおもいます。 この↓のコードで~~~~ここに1行~~~~の場所に本当になにか一つつけくわえるだけでできるのであれば教えてほしいです。 また、この問題が間違ってるというのであればどこが間違っているかを教えてほしいです。 少しだけならコードをかきかえても大丈夫だそうです。 わかるかたもしいましたら、おねがいします。 INDF EQU 0x00 TMR0 EQU 0x01 PCL EQU 0x02 STATUS EQU 0x03 FSR EQU 0x04 TRIS_A EQU 0x05 TRIS_B EQU 0x06 TRIS_C EQU 0x07 PORT_A EQU 0x08 PORT_B EQU 0x09 PORT_C EQU 0x0A org 0x00 ;ここから↓ MOVLW 0x3F MOVWF TRIS_A CLRW MOVWF TRIS_B MOVWF TRIS_C MOVWF PORT_B MOVWF PORT_C loop1: btfsc PORT_A,1 goto loop1 ~~~~ここに1行~~~~ loop2: btfss PORT_A,0 goto  loop2 goto loop1 -----------------------------------------

  • UTF-8コードの正規表現

    PHPの正規表現で、下記文字コードを対象とするパターンはどのように書けば良いのでしょうか。 0xF0 0x9F 0x8C 0x80 - 0xF0 0x9F 0x97 0xBF 例えば 0xF0 0x9F 0x98 0x80 - 0xF0 0x9F 0x99 0x8f であれば、preg_match('/'\xf0\x9f\x98[\x80-\xff]|\xf0\x9f\x99[\x00-\x8f]/') という記述になると思いますが、2バイト目が8c-97のようにまたがる場合のスマートな書き方を知りたいです。

    • ベストアンサー
    • PHP
  • PIC16f88でLEDの点灯をしたいのですが、

    PIC16f88でLEDの点灯をしたいのですが、 9番ピン(RB3)だけLEDが点灯しません。 #include<htc.h> __CONFIG(UNPROTECT & DEBUGEN & MCLRDIS & PWRTEN & WDTDIS & HS); void main() { PORTB = 0xff; TRISB = 0x00; } 上記のプログラムでBポートをすべて出力にしてLEDを光らせているつもりです。 書き込みを行い試してみたところ、6,7,8番は点灯してくれました。 いろいろと調べてみたのですが、PWM設定(CCP1)と関係があるのでしょうか? また何かしらの設定が必要でしたら、教えていただけると助かります。

  • Arduinoで複数のLEDマトリクスに映像出力

    私はこのページを参考に( http://kousaku-kousaku.blogspot.jp/2008/08/arduinoprocessingledweb.html )ArduinoMegaの互換機ChipKitMax32を使用して、12×32のLEDマトリクスを制御し映像を表示させています。 が、映像を表示させるには速度的に問題があり、参考先のプログラムではdelayMicrosecondsで各ドットの明るさを制御していますがそれも怪しく、映像自体のフレームレートを下げるなどしても改善せず、マイコン1台で映像表示するのは厳しいか…と思い、 8×8のLEDマトリクスにつき1台のArduino unoを使用し、それを何個も連結させ大きなLEDマトリクスにしようと考えました。 複数のArduinoを接続する方法として、I2CやSPI通信等がありますが、SPIでは後々Arduino unoのピン数が足りなくなるかもという不安もあり、複雑そうですがI2CでArduino同士を通信させようと思いました。 回路のイメージは添付画像の通り、 プログラムの内容は、 1 Processingから映像の各ドットの明るさの数値を受け取る 2 Arduinoマスタからスレーブ1へ最初の8つの数値を送る 3 スレーブ1がマスタから受け取った8つの数値をLEDマトリクス1の一行目の各ドットの明るさに割り振り点灯 4 Arduinoマスタからスレーブ2へ次の8つの数値を送る 5 スレーブ2がマスタから受け取った8つの数値をLEDマトリクス2の一行目の各ドットの明るさに割り振り点灯(LEDマトリクス1・2の一行目が点灯完了) これをあと7回くりかえし、LEDマトリクスの全画面の点灯完了 最終的には8×8のLEDマトリクスを10台程使用して、16×40のLEDマトリクスに映像を表示させたいです。 Arduinoで複数のLEDマトリクスを扱う場合、「映像表示の速度に耐えられるようにするために、Arduino自体の数を増やす、その通信をI2Cで行い、上記のようなプログラムで制御する」という方法で正しいか、可能かどうかの判断をお願いしたいです。 また、これより良い方法や、その他アドバイス等ありましたらお願い致します。

  • 16F88を用いてLEDの点灯パターンを制御する

    16F88を用いてLEDの点灯パターンを制御するプログラムを作ったのですが、思うように動作してくれません。 電源を入れたときはLEDはすべて消灯しており、スタートのためのスイッチを押すとすべてのLEDが3回点滅するはずなのですが、実際のところ、全てのLEDが点灯しっぱなしになってしまいます。 心当たりはコンフィギュレーションビットの設定が間違っている、PICの出力が間違っている(A/Dが正しく設定されていない)といったことを考えたのですが、結局解決には至りませんでした。 ほぼ同じプログラムを16F84Aにて作ったところ正常に作動したため、PICの移行に伴って不具合が生じてしまったのでしょうか。 どなたかお力をお貸しください。 プログラムはMPLAB v8.85 にて作成しており、コンパイラはHI-TECH ANSI C Compiler で、書き込みにはPICKIT2を用いています。 RB0~7にLEDが接続されており、RA0にスイッチが接続されています。 以下、ソースコードになります。 #define _LEGACY_HEADERS #include <htc.h> #define _XTAL_FREQ 20000000 __CONFIG ( HS & WDTDIS & PWRTDIS & UNPROTECT & MCLREN & BOREN & LVPDIS & DEBUGDIS & IESODIS & FCMDIS); void kaeru(void){ ////////////準備点灯3回////////////// PORTB=0xFF; __delay_ms(500); PORTB=0x00; __delay_ms(500); PORTB=0xFF; __delay_ms(500); PORTB=0x00; __delay_ms(500); PORTB=0xFF; __delay_ms(500); PORTB=0x00; __delay_ms(800); //////////////////////////////////// //スペースの都合で省略しています。 } void main(void) { ANSEL=0b00000000;//16F88のPORTAのA/D変換の無効化 OPTION=0x7F;//PORTBのプルアップ PORTA=0x00;//初期設定 PORTB=0x00;//初期設定 TRISA=0x01;//RA0を入力 TRISB=0x00;//RB0~7を出力 if(RA0==1) kaeru(); }

  • C言語でLEDを点灯させるプログラムです

    C言語を使ってLEDを点灯させるプログラムです。 以下のプログラムを変更して、Aポートの入力(下位4ビット) と、Cポートの入力(下位4ビット)を加算した値をBポートに出力しなさい 。 という問題なのですが、加算した値を出力するにはどうプログラムを記述すればいいか 分かりません。教えてください。 また、加算するというのは、たとえばどういうふうにしろ ということなのか、教えてください。 #include<18F452/h> #device HIGH_INTS=TRUE #priority ext,rb #fuses NOOSCSEN,HS,BORV45,NOBROWNOUT,PUT #fuses WDT128,NOWDT #fuses NODEBUG,NOLVP,NOSTVREN #fuses NOPROTECT,NOCPD,NOCPB #fuses NOWRT,NOWRTD,NOWRTB,NOWRTC,NOEBTR,NOEBTRB #use delay (CLOCK=20000000) #use fast_io(A) #use fast_io(B) #use fast_io(C) #use fast_io(D) #use fast_io(E) #byte port_a=0xf80 #byte port_b=0xf81 #byte port_c=0xf82 #byte port_d=0xf83 #byte port_e=0xf84 int i=0,j=0; void main() { if(input(PIN_b4)){output_high(PIN_d4);} else{output_low(PIN_d4);} if(input(PIN_b5)){output_high(PIN_d5);} else{output_low(PIN_d5);} if(input(PIN_b6)){output_high(PIN_d6);} else{output_low(PIN_d6);} if(input(PIN_b7)){output_high(PIN_d7);} else{output_low(PIN_d7);} while(1) { output_c(0b10101010); } }

  • あらかじめ入力されたテキストエリア内のバイト数表示

    以下のようなスクリプトで、テキストエリアに入力された文字のバイト数をカウントしているのですが、 あらかじめテキストエリアに文字が入力されてる場合に「0文字」と表示されます。 ページを開いたとき、あらかじめテキストエリアに文字が入力されてる場合に、そのバイト数を 表示させる方法はあるでしょうか。 もし、おわかりになる方がおられましたら、ご教示いただければ幸いです。 function ShowLength( str ) { len = 0; for(i=0;i<str.length;i++) { var c = str.charCodeAt(i); if ( (c >= 0x0 && c < 0x81) || (c == 0xf8f0) || (c >= 0xff61 && c < 0xffa0) || (c >= 0xf8f1 && c < 0xf8f4)){ len += 1; } else { len += 2; } } document.getElementById("inputlength").innerHTML = len + "文字"; } <textarea onkeyup="ShowLength(this.value);"></textarea> ちなみに、onload="ShowLength(this.value);"では上手くいきませんでした。 宜しくお願い申し上げます。