CPUがZ-80のマイクロコンピュータで7セグメントLED表示の回路とプログラムを教えてください。プログラム言語はC言語でお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

少しだけ補足させて下さい。



#3の方の言われているメモリの問題ですが、ターゲットをZ-80としてクロスコンパイルで使う分には、C言語での開発でも全然大丈夫ですよ。
ROM32KByte/ROM32Kbyteの様な構成で有れば、ROMICEを乗せても開発が可能でした。

勿論、OSなんかを乗せるつもりなら工夫をしないと辛いかも知れませんし、OSを乗せてターゲット上での開発は、少し困難なメモリエリアでは有ると思います。
どうしてもメモリエリアが不足する様な場合はバンク切り替え等でも対処可能ですが、この御質問のケースでは余り必要無い様に感じられます。
(何を、どう制御するかには寄りますが。)
    • good
    • 0

Z-80のような.8ビットCPUではアドレスが64kbしかなく.C言語は難しいと思います。


ハンドアセンブラでよいならば.バスIC(8255?8253?)の出口にドライバーIC(744??)をつけて直接操作する方法と.ドライバーICを7447?7449?にして.16しん数で制御する方法があります。
out命令を使います。

別の方法としては.メモリーの一部としてラッチ(番号忘却)をつけてラッチ出力にドライバーをつなぎ表示する方法があります。命令はSTだったでしょうか.LDだったでしょうか.記憶があいまいです。


なお.C言語をお使いになるのであれば.Z-80インラインアセンブラプログラムが作成可能であり.インラインアセンブラを独立して実行できる環境にあると解釈しました。8080(8086-ペンテを含めて)とは弱冠命令が異なります。
    • good
    • 0

No.1の方が書かれているように、条件がそろっていないと説明するのは不可能です。



まず、プログラムといっても、I/O素子のアドレス、プログラムとインタプリンターを入れるROM、CPUの使用するRAMのメモリマップ、ペリフェラルのアドレスと構成等の情報が無ければ何の役にもたちません。

Z80といっても最近では上位互換機種が多くあって、そういった事も選考の対象になりますし・・(高級言語を使用する以上は結構な容量のROMが必要になりますよ)
    • good
    • 0

先ず、何をしたいのでしょうか?



それと、マイコンの回路を組んだ事はありますか?
ココで回路を書くのは、かなり無理が有るので...。

単純に言うとICは、CPU,ROM,RAM,PIOの構成で出来ますね。
(勿論、他にもLEDのドライブ回路や,LED,電源回路等の回路も必要ですけど...。)

他にも、ROMライター等の機材が必要です。

先ず御自分で回路を書かれて、解らない部分が有れば補足下さい。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語のプログラムについて(LEDの点灯)

C言語初心者です.
LEDを以下のように点灯させるプログラムをC言語でつくりたいのですが,わからなくて困っており,質問させていただきました.
「LEDを1秒間点灯させ,0.5秒間消灯させ,また1秒間点灯させ,次は0.6秒間消灯させるというように消灯時間を0.1秒おきに増やしていき,消灯時間を1.5秒間まで増やした後,今度は0.1秒おきに消灯時間を減らしていき,消灯時間を0.5秒間まで減らし,これを繰り返す.」(分かりづらくてすみません…)
というようなプログラムはどのようにつくればいいでしょうか?

ちなみに1秒おきに点灯,消灯を繰り返すプログラムは,メイン関数を
void main()
{
while(1){
LED1_ON();
delay_us(1000);
LED1_OFF();
delay_us(1000);
}
}
とすることで出来ました.

Aベストアンサー

まず、

while(1)
{
LED1_ON();delay_ms(1000);
LED1_OFF();delay_ms(1000);
}

で、本当に、1秒間隔になっていることを確認してください。
次は、

int timeON = 1000;
int timeOFF = 1000;

while(1)
{
LED1_ON();delay_ms(timeON);
LED1_OFF();delay_ms(timeOFF);
}

を確認してください。
このあと、timfOFF を 500 とか、800 とかに変更して確認してみてください。
ここでおかしいようだと、delay_ms() の設計ミスで、異なる引数で呼ばれたときにおかしな事が起きているというのが考えられます。

ここまで大丈夫だと、タイミングがおかしいのは気のせいのような気がしますが。

あとは、


LED1_ON();delay_ms(500);
LED1_OFF();delay_ms(1000);

LED1_ON();delay_ms(600);
LED1_OFF();delay_ms(1000);

LED1_ON();delay_ms(700);
LED1_OFF();delay_ms(1000);

LED1_ON();delay_ms(800);
LED1_OFF();delay_ms(1000);

という感じで、点滅の感覚をつかむと良いかもしれません。

まず、

while(1)
{
LED1_ON();delay_ms(1000);
LED1_OFF();delay_ms(1000);
}

で、本当に、1秒間隔になっていることを確認してください。
次は、

int timeON = 1000;
int timeOFF = 1000;

while(1)
{
LED1_ON();delay_ms(timeON);
LED1_OFF();delay_ms(timeOFF);
}

を確認してください。
このあと、timfOFF を 500 とか、800 とかに変更して確認してみてください。
ここでおかしいようだと、delay_ms() の設計ミスで、異なる引数で呼ばれたときにおかしな事が起きているというのが考えられます。

ここまで...続きを読む

Qc言語でAからZまでを表示するプログラム

#include <stdio.h>

int main(void)
{
char C;

for (C = 'A';C <= 'Z';C++) {
printf("%c",C);
}
printf("\n");

return 0;
}

これ以外の作り方を知っているという方、ぜひ教えてください。

Aベストアンサー

#include <stdio.h>

int main(void)
{
 int a;

 for(a = 'A';a <= 'Z';a++) {
  putchar(a);
 }
 putchar('\n');

 return 0;
}



#include <stdio.h>

int main(void)
{
 char *str = "ABC (中略) XYZ\n";

 do {
  printf("%c", *str);
  str++;
 } while(*str);

 return 0;
}

質問が抽象的過ぎるので「これ以外の作り方」だとどうとでもできそうな気がしますけど。

QAKI-h8 3069f C言語 HEW マイコン DIPスイッチで LED ON_OFF プログラム 「組込みI/O制御演習」

こんにちは。

標記開発環境でマイコンを制御しています。

下記ソースでDIPスイッチのONOFFでLEDを点灯させたいのですが
うまくいきません。

多分
P4DR.BIT.B0 =~P5DR.BIT.B0;
の部分の修正が必要かと思うのですが。

どなたかご存知の方よろしくお願いします。
//------------------
#include "iodefine.h"


void main(void);
#ifdef __cplusplus
extern "C" {
void abort(void);
}
#endif

void main(void)
{
P5DDR = 0;
P5PCR.BYTE = 0xff;
P4DDR = 0xff;

while(1)
{
P4DR.BIT.B0 =~P5DR.BIT.B0;
}

}

#ifdef __cplusplus
void abort(void)
{

}
#endif

こんにちは。

標記開発環境でマイコンを制御しています。

下記ソースでDIPスイッチのONOFFでLEDを点灯させたいのですが
うまくいきません。

多分
P4DR.BIT.B0 =~P5DR.BIT.B0;
の部分の修正が必要かと思うのですが。

どなたかご存知の方よろしくお願いします。
//------------------
#include "iodefine.h"


void main(void);
#ifdef __cplusplus
extern "C" {
void abort(void);
}
#endif

void main(void)
{
P5DDR = 0;
P5PCR.BYTE = 0xff;
...続きを読む

Aベストアンサー

ご想像とおり、確かにちがっているような・・・

>>P4DR.BIT.B0 =~P5DR.BIT.B0;
ですが、
私が所持しているAKI-3069fボードでは、
赤LEDを制御する場合、
P4DR.BIT.B6 = !P5DR.BIT.B0;

緑LEDを制御する場合、
P4DR.BIT.B7 = !P5DR.BIT.B0;

だと思います。

Q電子工作 C言語の練習 電子回路、論理回路の体験学習

電子工作 C言語の練習 電子回路、論理回路の体験学習

http://bbradio.hp.infoseek.co.jp/avr31/avr31.html
を見ていて思いました。

BASIC(興味がない)ではなく、C言語(興味がある)の練習
を兼ねるような電子工作キットがあればな。

・C言語でプログラムを書いて、それを機械語に直す?なりして、
30分後に光でアラームする簡単なタイマーを作りたいのです。

・電子回路や論理回路を本で勉強するので、
それを基盤で実現して体験学習できたらさらに良いです。


そういう電子工作できる安い初心者向けのキットなり部品なりあれば教えてください。
まったく電子工作したことがありません。

Aベストアンサー

この位の事を実現するにはPICやAVRでもいけると思います。
5千円くらいってことで、私がお勧めのマイコンボードですが、
http://akizukidenshi.com/catalog/g/gK-00168/
です。5,700円ですね(送料とか、RS232Cケーブルは別)
H8-3069というCPUです。RAMが2MByteのってます。LCD、LED、DIP SWが付いており、
空きランドもありますので、ちょっとした工作もできます。
ルネサスよりHEWという統合環境開発ツールも制限はありますが、
無償で入手できます。
で、開発の手法ですが、いちいち完成したプログラムをROMに書込む
のではなく、ROMにはモニタやスタブと呼ばれるものを一回書いておいて
完成したプログラムは2MByteのRAM上で動作させるってのがポイント。
H8マイコンはROMの書込み回数が他に比べて少ない
(書込み回数が多くなると、いずれ正常に書込む事ができなくなる)ので。

あとは、圧電ブザーでも良いですし、PWMポートに繋いでアラームを
鳴らすプログラムを作成すればOKかと。光は最初から付いている
LEDを使えばよいし・・・。

この位の事を実現するにはPICやAVRでもいけると思います。
5千円くらいってことで、私がお勧めのマイコンボードですが、
http://akizukidenshi.com/catalog/g/gK-00168/
です。5,700円ですね(送料とか、RS232Cケーブルは別)
H8-3069というCPUです。RAMが2MByteのってます。LCD、LED、DIP SWが付いており、
空きランドもありますので、ちょっとした工作もできます。
ルネサスよりHEWという統合環境開発ツールも制限はありますが、
無償で入手できます。
で、開発の手法ですが、いちいち完成したプログラ...続きを読む

QJava言語のプログラムをC言語にする場合

次の2つのJava言語のプログラムをC言語にしたいのですが、C言語でプログラムを書いたことがありません。C言語にする場合はどう書けばいいのでしょうか?

import java.io.*;

public class Sort {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("整数値を入力してください");
String line = reader.readLine();
int a = Integer.parseInt(line);

String line2 = reader.readLine();
int b = Integer.parseInt(line2);

String line3 = reader.readLine();
int c = Integer.parseInt(line3);

String line4 = reader.readLine();
int d = Integer.parseInt(line4);

int[] data = {a, b, c, d};

for (int i = 0; i< data.length - 1 ; i++) {
for (int j = i + 1; j< data.length; j++) {
if(data[i] > data[j]) {
int e = data[i];
data[i] = data[j];
data[j] = e;
}
}
}

System.out.println("昇順に並べ替えると、");
for (int i = 0; i< data.length; i++) {
System.out.print(data[i] + " ");
}

System.out.println("です。");

} catch (IOException e){
System.out.println(e);
} catch (NumberFormatException e) {
System.out.println("数式の形式が正しくありません。");
}
}
}



import java.io.*;

public class Yakusu {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("2つの整数値を入力してください");
System.out.print("整数A : ");
String line = reader.readLine();
int a = Integer.parseInt(line);

System.out.print("整数B : ");
String line2 = reader.readLine();
int b = Integer.parseInt(line2);

if(a%b == 0){
System.out.println("BはAの約数です");
} else {
System.out.println("BはAの約数ではありません");
}

} catch (IOException e){
System.out.println(e);
} catch (NumberFormatException e) {
System.out.println("数式の形式が正しくありません。");

}
}
}

次の2つのJava言語のプログラムをC言語にしたいのですが、C言語でプログラムを書いたことがありません。C言語にする場合はどう書けばいいのでしょうか?

import java.io.*;

public class Sort {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("整数値を入力してください");
String line = reader.readLine();
int a = Integer.parseInt(line);

String line2 = reader.readLine();
int b = Integer.parseI...続きを読む

Aベストアンサー

半角スペース2個を全角スペース1個に置換しています。

#include <stdio.h>

int main(void) {
 int a,b,c,d;
 printf("整数値を入力してください\n");
 scanf("%d",&a);
 scanf("%d",&b);
 scanf("%d",&c);
 scanf("%d",&d);

 int data[] = {a,b,c,d};
 int length = 4;
 int i,j,e;

 for (i = 0; i< length - 1 ; i++) {
  for (j = i + 1; j< length; j++) {
   if(data[i] > data[j]) {
    e = data[i];
    data[i] = data[j];
    data[j] = e;
   }
  }
 }

 printf("昇順に並べ替えると、");

 for (i = 0; i< length; i++) {
  printf("%d ",data[i]);
 }

 printf("です。\n");
}


#include <stdio.h>

int main(void) {
 int a,b;
 printf("2つの整数値を入力してください\n");
 printf("整数A : ");
 scanf("%d",&a);
 printf("整数B : ");
 scanf("%d",&b);

 if(a%b == 0){
  printf("BはAの約数です\n");
 } else {
  printf("BはAの約数ではありません\n");
 }
}

半角スペース2個を全角スペース1個に置換しています。

#include <stdio.h>

int main(void) {
 int a,b,c,d;
 printf("整数値を入力してください\n");
 scanf("%d",&a);
 scanf("%d",&b);
 scanf("%d",&c);
 scanf("%d",&d);

 int data[] = {a,b,c,d};
 int length = 4;
 int i,j,e;

 for (i = 0; i< length - 1 ; i++) {
  for (j = i + 1; j< length; j++) {
   if(data[i] > data[j]) {
    e = data[i];
    data[i] = data[j];
    data[j] = e;
   }
  }
 }

 print...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報