H8/3664ではじめるマイコン制御１ スイッチで7SegLED点灯

![93046.jpg](https://qiita-image-store.s3.amazonaws.com/0/333756/28b82ba2-117c-828a-776e-294159cff7f7.jpeg)
年末年始の時間を使いH8/3664を使ってマイコン制御に挑戦してみました。
使ったマイコンはルネサステクノロジフラッシュマイコンH8/3664F
開発環境はYellowIDE5 です。

```c
//押しボタンで任意の数字を表示するプログラム 
//#include <H83664.H>
#include <stdio.h>

#define	BRR		(*((unsigned char *)0xFFA9))
#define	TMA		(*((unsigned char *)0xFFA6))

#define	PMR1	(*((unsigned char *)0xFFE0))
#define	PMR5	(*((unsigned char *)0xFFE1))

#define	PCR1	(*((unsigned char *)0xFFE4))
#define	PCR5	(*((unsigned char *)0xFFE8))
#define	PCR7	(*((unsigned char *)0xFFEA))
#define	PCR8	(*((unsigned char *)0xFFEB))

#define	PDR5	(*((unsigned char *)0xFFD8))
#define	PDR7	(*((unsigned char *)0xFFDA))

main()
   {
	BRR=12;			//16MHZ時には１２を　デフォルトは７　ボーレート変更	
 	PMR1 = 0x00;			/*ポート１を汎用ＩＯに設定*/
 	PMR5 = 0x00;			/*ポート１を汎用ＩＯに設定*/

    TMA = 0x98 ; 


 	PCR1 = 0xff;	//アドレス　FFE4
   	PCR5 = 0xff;	//FFE8
	PCR7 = 0x00;	
    PCR8 = 0xff;	//FFED		//00入力　　ff出力
    

for (;;) {/* 無限ループ */
    if ((PDR7 & 0x40)==0x00) PDR5 = 0x06;//黒　１
    else if((PDR7 & 0x20)==0x00) PDR5 = 0x5b;//白　２
    else if((PDR7 & 0x10)==0x00) PDR5 = 0x4f;//緑　３
    else PDR5 = 0x3f;//0
}
return 0;

   }
```
プログラムはこのようになります。
文頭の定義文です。

```
#define	BRR		(*((unsigned char *)0xFFA9))
#define	TMA		(*((unsigned char *)0xFFA6))

#define	PMR1	(*((unsigned char *)0xFFE0))
#define	PMR5	(*((unsigned char *)0xFFE1))

#define	PCR1	(*((unsigned char *)0xFFE4))
#define	PCR5	(*((unsigned char *)0xFFE8))
#define	PCR7	(*((unsigned char *)0xFFEA))
#define	PCR8	(*((unsigned char *)0xFFEB))

#define	PDR5	(*((unsigned char *)0xFFD8))
#define	PDR7	(*((unsigned char *)0xFFDA))
```

私の開発環境ではH83664.Hの中にまとめて定義されているのですが、
すべての開発環境に同じヘッダファイルがあるとは限らないので今回はあえて直接定義しています。

数値としてよりもビットに意味を持たせることが多いので、符号なし整数をつかいました。

例えば、BRRは、FFA9番地のバイト領域です。
C言語で「0xFFA9」は、単なる整数なのでキャスト演算子

```
(unsigned char *)0xFFA9
```

 により、バイト領域へのポインタに型変換をおこないます。

これで「0xFFA9番地のバイト領域」を指すポインタができるので続いて、このメモリ領域にアクセスするには、

```
*((unsigned char *)0xFFA9)
```

 と「参照演算子（*）」を使います。

今回使用する主なレジスタは
#PMR:ポートモードレジスタ
同じピンでも、他の機能と兼用になっているピンがあるためその切り替えをこのレジスタで設定します。
入出力ポート：0
その他の目的のために端子を使う：1
（デフォルト：1)
#PCR:ポートコントロールレジスタ
I/Oポートで、入力か出力かを設定します
出力：1
入力：0
（デフォルト：1）
#PDR:ポートデータレジスタ
データのやり取りをするポートです。
（デフォルト：1）


です。

#プッシュスイッチ
今回押しボタンはP76　P75　P74を用いています。

```c
if ((PDR7 & 0x40)==0x00) PDR5 = 0x06;//黒　１
    else if((PDR7 & 0x20)==0x00) PDR5 = 0x5b;//白　２
    else if((PDR7 & 0x10)==0x00) PDR5 = 0x4f;//緑　３
    else PDR5 = 0x3f;//0
```


押されると各Port下一桁のビットが0となるのでP76が押された時は
(1011 1111)&(0100 0000)=0000 0000
とすべて0となるようにしています。

#7segLED

7segLEDはP5xを使っています。
PDR5は7segLEDにつながるレジスタです。
7segLEDは下図のようになっております。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/333756/62b3ab6c-f42b-86ac-9c9e-211541551a6f.png)
今回使用した7segLEDは二桁表示でhは1の桁10の桁どちらを点灯させるか選ぶことができます。
1の位に出す場合
0 PDR5 =0x3f
1 PDR5 =0x06
2 PDR5 =0x5b
3 PDR5 =0x4f
4 PDR5 =0x66
5 PDR5 =0x6d
6 PDR5 =0x7d
7 PDR5 =0x27
8 PDR5 =0x7f
9 PDR5 =0x67

LED[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67};

0 PDR5 =00111111
1 PDR5 =00000110
2 PDR5 =01011011
3 PDR5 =01001111
4 PDR5 =01100110
5 PDR5 =01101101
6 PDR5 =01111101
7 PDR5 =00100111
8 PDR5 =01111111
9 PDR5 =01100111
10の位に出したいときは8bit目を1にすればよいです。

次へ [H8/3664ではじめるマイコン制御2 押した回数を7segLEDで表示](https://qiita.com/kiki0817/items/2d28db186bf5cf9e2c4b)