質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

4回答

4514閲覧

マイコンでのドットマトリクスLEDの制御

YT1028

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2016/06/18 06:59

編集2016/06/20 00:11

###前提・実現したいこと
Atmel社のAVRマイコンを用いて、配列に格納された任意のパターンを縦・横それぞれで表示していく 状態1 状態2 状態3・・・最終状態
該当のソースコードの部分にはled[0]~led[7]を順番に点灯させていくものですが、これに各行を左からなぞって塗りつぶしていく動きを追加したいです。
###発生している問題・エラーメッセージ

縦方向に表示していくことは可能だがそれに横方向の動きを追加したい。

###該当のソースコード
include<avr/io.h>
include<avr/wdt.h>

unsigned char led[8] = {
0b00011000,
0b00111000,
0b01111000,
0b00011000,
0b00011000,
0b00011000,
0b00011000,
0b01111110,
};

int main(void)
{
unsigned int cnt;

unsigned char sc,scan_a,scan_b = 0xff; DDRB = 0xff; DDRC = 0x0f; DDRD = 0xfa; for(;;){ wdt_reset(); if(100000 <= ++cnt) cnt = 0; if(cnt == 0){ scan_a = (scan_a - 1) & 7; sc = ~(1 << scan_a); PORTC = sc & 0x0f; PORTD = sc & 0xf0; PORTB = led[7 - scan_a]; } } return 0;

}

・開発はLinux上で行っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PineMatsu

2016/06/20 08:29

・コードは```(Shift+@)で囲うと見やすくなります。
PineMatsu

2016/06/20 08:47

LED点灯部分のハードウェアの概略を教えて下さい。ダイナミック点灯でしょうか?それともスタティック点灯ですか?
guest

回答4

0

まず、scan_aですが初期化されていません。なのでscan_a = (scan_a - 1) & 7;が一番最初どのような値になるかが不定になります。(まあ、7でANDを取ってるので0~7のどれかになるから良いということかもしれませんが、初期化はきっちりしておかないと痛い目にあいます。)

「ダイナミック点灯ではなく、一度LED点灯がONしたら次に0を出力しないとOFFにならない」という前提(つまりはスタティック点灯)として、今のプログラムは例えば「1」を上から8ラインに分割して順に表示していくプログラマになっているのだろうと思います。
それで、質問が横(例えば右)から「1」を表示したいということですよね?

それなら、マスクパターンを用意しておいてANDを取ってから出力すれば行けると思います。
例えば、以下の様な感じです。
PORTC,D,Bの使い方がよくわからないのでそのまま書いています。また、余計なものは端折ってますのでそれなりに修正して組み込んでください。

c

1unsigned char mask[] = { 2 0b00000001, 3 0b00000011, 4 0b00000111, 5 0b00001111, 6 0b00011111, 7 0b00111111, 8 0b01111111, 9 0b11111111, 10}; 11 12/* 途中省略 */ 13 int i, j, cnt = 0; 14 unsigned char sc; 15 16 for(;;) { 17 j = 0; 18 for(i = 0; i < 8; i++) { 19 sc = ~(1 << i); 20 PORTC = sc & 0x0f; 21 PORTD = sc & 0xf0; 22 PORTB = led[i] & mask[j]; 23 } 24 while(100000 > ++cnt) 25 ; 26 cnt = 0; 27 j++; 28 if (j >= 8) 29 j = 0; 30 }

投稿2016/06/20 09:33

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

分かりにくかったので変数名を変えました。
当該環境がありませんので、細かい部分は調整して下さい。

c

1unsigned char sc; 2unsigned char row = 0, column = 0; 3 : 4if(cnt == 0) 5{ 6 sc = ~(1 << row); 7 PORTC = sc & 0x0f; 8 PORTD = sc & 0xf0; 9 PORTB = led[row]; 10 PORTB &= 0xff << (7 - column); //mask 11 12 column = (column + 1) & 0x7; //next column 13 if (column == 0) 14 { 15 row = (row + 1) & 0x7; //next row 16 } 17}

投稿2016/06/20 01:38

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT1028

2016/06/20 02:45

無事実行はできたのですが実現したいことと若干違いがありました。 実現したいものは一度光ったところを光らせ続けるというものです。そうした場合一瞬ですが1が見えると思います。 そして追加機能として1にLEDを光らせたあとにそれらをLEDを付けるときと同じようになぞりつつ消灯させる追加機能も実装したいと考えています。 よろしくお願いします。
fuzzball

2016/06/20 04:02 編集

質問したいことは質問欄に書いて下さい。 現在のあなたの質問は「横方向の動きを追加したい」だけです。 ちなみに、あなたのコードでは、一度光ったところは光り続けているのでしょうか?
guest

0

ledのパターンを全て表示後に、今度はそれを1列ずつ塗りつぶしていく、そういう感じでしょうか。
例えば次のような配列を用意しておいて、led配列とORしていったらどうでしょうか。

C

1unsigned char mask[8] = { 2 0b10000000, 3 0b11000000, 4 0b11100000, 5 0b11110000, 6 0b11111000, 7 0b11111100, 8 0b11111110, 9 0b11111111, 10};

それともアルゴリズム的な話でしょうか。

投稿2016/06/20 01:32

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

直接の回答ではないのですが、
横方向の動きというのは、以下のような感じでled[]配列に
格納されているビットマップデータを横に動かしたいということでしょうか。

C

1 unsigned char led[8] = { 2 0b00011000, 3 0b00111000, 4 0b01111000, 5 0b00011000, 6 0b00011000, 7 0b00011000, 8 0b00011000, 9 0b01111110, 10 }; 11 12 unsigned char led[8] = { 13 0b00110000, 14 0b01110000, 15 0b11110000, 16 0b00110000, 17 0b00110000, 18 0b00110000, 19 0b00110000, 20 0b11111100, 21 }; 22 23 unsigned char led[8] = { 24 0b01100000, 25 0b11100000, 26 0b11100001, 27 0b01100000, 28 0b01100000, 29 0b01100000, 30 0b01100000, 31 0b11111001, 32 }; 33 34 unsigned char led[8] = { 35 0b11000000, 36 0b11000001, 37 0b11000011, 38 0b11000000, 39 0b11000000, 40 0b11000000, 41 0b11000000, 42 0b11110011, 43 }; 44 45 unsigned char led[8] = { 46 0b10000001, 47 0b10000011, 48 0b10000111, 49 0b10000001, 50 0b10000001, 51 0b10000001, 52 0b10000001, 53 0b11100111, 54 }; 55 56 unsigned char led[8] = { 57 0b00000011, 58 0b00000111, 59 0b00001111, 60 0b00000011, 61 0b00000011, 62 0b00000011, 63 0b00000011, 64 0b11001111, 65 }; 66 67 unsigned char led[8] = { 68 0b00000110, 69 0b00001110, 70 0b00011110, 71 0b00000110, 72 0b00000110, 73 0b00000110, 74 0b00000110, 75 0b10011111, 76 }; 77 78 unsigned char led[8] = { 79 0b00001100, 80 0b00011100, 81 0b00111100, 82 0b00001100, 83 0b00001100, 84 0b00001100, 85 0b00001100, 86 0b00111111, 87 }; 88

それとも、データを90度回転させて、横向きにするようなイメージでしょうか。

c

1 unsigned char led[8] = { 2 0b00011000, 3 0b00111000, 4 0b01111000, 5 0b00011000, 6 0b00011000, 7 0b00011000, 8 0b00011000, 9 0b01111110, 10 }; 11 12 unsigned char led[8] = { 13 0b00000000, 14 0b10000100, 15 0b10000110, 16 0b11111111, 17 0b11111111, 18 0b10000000, 19 0b10000000, 20 0b00000000, 21 };

やりたいことを具体的に書いて、タグに[C]を追加すれば回答が付きやすくなると思います。
また、組み込みマイコンなので、使用しているコンパイラなど開発環境を詳しく書いておくと
インラインアセンブラなど環境固有の機能を活用した回答が付くかもしれないですよ。

投稿2016/06/19 15:26

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問