全体表示

[ リスト | 詳細 ]

記事検索
検索

イメージ 1

次は、いよいよ

16文字×2行の液晶ディスプレーにチャレンジします

SC1602BSLBという型番で、ポピュラーなもののようです。

PICやAVRなど数々のマイコンチップの情報のなかで
この液晶に関する初期化の情報が

インターネットで検索できます

今回からは、それらを参考に
78k0による、初期化と

文字列の書き込みにチャレンジしてみたいと思います



78K0のI/OポートがメモリマップドI/Oということを
ちょっと実証してみました。

なんども、トラ技8月号を読み返している僕ですが
P148あたりのI/Oでまた最近、僕としての
新たな発見をしました。

図25にあるアドレスはまさに
メモリマップドI/Oであって
ここに直接アクセスすれば
I/Oをコントロールすることができるのでは??

と、いうことで
とりあえず、P142にある
リスト2の PM6.1を
直接アドレスをいじってみました♪




以下がそのプログラム
//list2_6.c
#pragma sfr
void main(){
*((unsigned char *)0xff26)= 0xfc;   //PM6.1 = 0;

while(1){
  short i;
  for(i=0;i<30000;i++){}
  
P6.1 ^= 0x01;
  }
}
7segLED表示を割り込み処理にした♪

ヘッダーファイルにして呼び出して使うことした♪


//7segled01.h
//メモリOF7FFH(CPU内部拡張RAMアッパー)に書き込んだ値を16進表示する
//割り込み処理として、呼び出す
//呼び出し元からpokeb(0x0f7ff,0x0a6);//F7FF番地にA6hを書き込んだあと intsrv_tim でタイマ割り込み
//#pragma sfr
//#pragma access

void intsrv_tim(void){

   unsigned char a = 0x00;
   short i,ii;//wait
   unsigned char work01,work_upbit,work_dnbit;//上位、下位4BIT取り出し
   //LED BITパターンセット
   unsigned char x[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe4,0xfe,0xe6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};

   //pokeb(0x0f7ff,0x0a6);//F7FF番地にA6hを書き込む
   work01= peekb(0x0f7ff);
   work_upbit= work01 & 0x0f0;//上位4BIT取り出し
   work_upbit= work_upbit >> 4;
   work_dnbit= work01 & 0x0f;//下位4BIT取り出し

   PM3.0 = 0;//スイッチトランジスタポートセット
   PM6.1 = 0;

   PM1.0 = 0;//出力モード
   PM1.1 = 0;
   PM1.2 = 0;
   PM1.3 = 0;
   PM0.0 = 0;
   PM1.5 = 0;
   PM1.6 = 0;

//**************************************************************************
//
//  上位、下位BIT 7segLED 表示の繰り返し処理
//
//**************************************************************************

//while(1){

	P3.0 = 0; //トランジスタ一桁目ON 「0点灯」
	P6.1 = 1; //二桁目off

    //上位ビット表示処理
    
    a = work_upbit;
	P1.0 = (x[a] ^ 0x80) >> 7;//第7BITから順に反転させて各ポートへ
	P1.1 = (x[a] ^ 0x40) >> 6;
	P1.2 = (x[a] ^ 0x20) >> 5;
	P1.3 = (x[a] ^ 0x10) >> 4;
	P0.0 = (x[a] ^ 0x08) >> 3;
	P1.5 = (x[a] ^ 0x04) >> 2;
	P1.6 = (x[a] ^ 0x02) >> 1;
	
	for(ii=0;ii<1;ii++){
	for(i=0;i<300;i++){}
	}

	
	P3.0 = 1;//一桁目消灯
	P6.1 = 0;//二桁目点灯

    
    //下位ビット表示処理
    a = work_dnbit;
	P1.0 = (x[a] ^ 0x80) >> 7;//第7BITから順に反転させて各ポートへ
	P1.1 = (x[a] ^ 0x40) >> 6;
	P1.2 = (x[a] ^ 0x20) >> 5;
	P1.3 = (x[a] ^ 0x10) >> 4;
	P0.0 = (x[a] ^ 0x08) >> 3;
	P1.5 = (x[a] ^ 0x04) >> 2;
	P1.6 = (x[a] ^ 0x02) >> 1;
	
	for(ii=0;ii<1;ii++){
	for(i=0;i<300;i++){}
	}

	
	//P0.1 = 1;//二桁目消灯
	
	P1.0  = 1;//一旦消去
	P1.1  = 1;
	P1.2  = 1;
	P1.3  = 1;
	P0.0  = 1;
	P1.5  = 1;
	P1.6  = 1;

//   }// while() loop

}
下が呼び出し元
//sample20_2.c
//timer_int 7セグメントLEDメモリ表示テスト
#pragma sfr     //割り込みルーチンで使うので必須
#pragma access  //割り込みルーチンで使うので必須
#include "trgbios.h"
#include "7segled01.h"

void main(){
    char c;              //trg_getc();

    trg_regintsrv(TRG_INTID_BSITM000,intsrv_tim);// 割り込みハンドラ登録
    PRM00 = 1;                                   //   4MHz
    CR000 = 0xffff;                              // 割り込み周期
    TMC00 = 0x0C;                                // カウント開始
    MK0H.6 = 0;                                  // TM000割り込み許可

    pokeb(0x0f7ff,0xff);                       //F7FF番地に値を書き込む  

    while(1){
     
	  //trg_senddata(&c,1);
	  c = trg_getc();
	  if(c == 'x') break;
	}

    TMC00 = 0x00;                                 // 割り込み復帰処理
    MK0H.6 = 1;
}


7segLED表示を割り込み処理にした♪

ヘッダーファイルにして呼び出して使うことした♪


//7segled01.h
//メモリOF7FFH(CPU内部拡張RAMアッパー)に書き込んだ値を16進表示する
//割り込み処理として、呼び出す
//呼び出し元からpokeb(0x0f7ff,0x0a6);//F7FF番地にA6hを書き込んだあと intsrv_tim でタイマ割り込み
//#pragma sfr
//#pragma access

void intsrv_tim(void){

   unsigned char a = 0x00;
   short i,ii;//wait
   unsigned char work01,work_upbit,work_dnbit;//上位、下位4BIT取り出し
   //LED BITパターンセット
   unsigned char x[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe4,0xfe,0xe6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};

   //pokeb(0x0f7ff,0x0a6);//F7FF番地にA6hを書き込む
   work01= peekb(0x0f7ff);
   work_upbit= work01 & 0x0f0;//上位4BIT取り出し
   work_upbit= work_upbit >> 4;
   work_dnbit= work01 & 0x0f;//下位4BIT取り出し

   PM3.0 = 0;//スイッチトランジスタポートセット
   PM6.1 = 0;

   PM1.0 = 0;//出力モード
   PM1.1 = 0;
   PM1.2 = 0;
   PM1.3 = 0;
   PM0.0 = 0;
   PM1.5 = 0;
   PM1.6 = 0;

//**************************************************************************
//
//  上位、下位BIT 7segLED 表示の繰り返し処理
//
//**************************************************************************

//while(1){

	P3.0 = 0; //トランジスタ一桁目ON 「0点灯」
	P6.1 = 1; //二桁目off

    //上位ビット表示処理
    
    a = work_upbit;
	P1.0 = (x[a] ^ 0x80) >> 7;//第7BITから順に反転させて各ポートへ
	P1.1 = (x[a] ^ 0x40) >> 6;
	P1.2 = (x[a] ^ 0x20) >> 5;
	P1.3 = (x[a] ^ 0x10) >> 4;
	P0.0 = (x[a] ^ 0x08) >> 3;
	P1.5 = (x[a] ^ 0x04) >> 2;
	P1.6 = (x[a] ^ 0x02) >> 1;
	
	for(ii=0;ii<1;ii++){
	for(i=0;i<300;i++){}
	}

	
	P3.0 = 1;//一桁目消灯
	P6.1 = 0;//二桁目点灯

    
    //下位ビット表示処理
    a = work_dnbit;
	P1.0 = (x[a] ^ 0x80) >> 7;//第7BITから順に反転させて各ポートへ
	P1.1 = (x[a] ^ 0x40) >> 6;
	P1.2 = (x[a] ^ 0x20) >> 5;
	P1.3 = (x[a] ^ 0x10) >> 4;
	P0.0 = (x[a] ^ 0x08) >> 3;
	P1.5 = (x[a] ^ 0x04) >> 2;
	P1.6 = (x[a] ^ 0x02) >> 1;
	
	for(ii=0;ii<1;ii++){
	for(i=0;i<300;i++){}
	}

	
	//P0.1 = 1;//二桁目消灯
	
	P1.0  = 1;//一旦消去
	P1.1  = 1;
	P1.2  = 1;
	P1.3  = 1;
	P0.0  = 1;
	P1.5  = 1;
	P1.6  = 1;

//   }// while() loop

}
下が呼び出し元
//sample20_2.c
//timer_int 7セグメントLEDメモリ表示テスト
#pragma sfr     //割り込みルーチンで使うので必須
#pragma access  //割り込みルーチンで使うので必須
#include "trgbios.h"
#include "7segled01.h"

void main(){
    char c;              //trg_getc();

    trg_regintsrv(TRG_INTID_BSITM000,intsrv_tim);// 割り込みハンドラ登録
    PRM00 = 1;                                   //   4MHz
    CR000 = 0xffff;                              // 割り込み周期
    TMC00 = 0x0C;                                // カウント開始
    MK0H.6 = 0;                                  // TM000割り込み許可

    pokeb(0x0f7ff,0xff);                       //F7FF番地に値を書き込む  

    while(1){
     
	  //trg_senddata(&c,1);
	  c = trg_getc();
	  if(c == 'x') break;
	}

    TMC00 = 0x00;                                 // 割り込み復帰処理
    MK0H.6 = 1;
}


イメージ 1
写真は、 A6 と表示されています
メモリ、0F7FF番地の値を表示するようにしています


前回作成した16進数を順次2桁で表示するプログラムを少し流用して
一定のメモリ番地の値を16進数で表示するプログラムを作ってみました

上位4BITと下位4BITをそれぞれ
2つの7segLEDで表現しました

定石どおり、ヒトの目の残像現象を利用して
短時間の間に高速で切り替えることにより
同時に2桁の点灯がされているように
見えることを利用しています


//sample18_07.c
//7segLED 2桁
//メモリOF7FFH(CPU内部拡張RAMアッパー)に書き込んだ値を16進表示する
#pragma sfr
#pragma access

void main(){

unsigned char a = 0x00;
short i,ii;//wait
unsigned char work01,work_upbit,work_dnbit;//上位、下位4BIT取り出し
//LED BITパターンセット
unsigned char x[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe4,0xfe,0xe6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};

pokeb(0x0f7ff,0x0a6);//F7FF番地にA6hを書き込む
work01= peekb(0x0f7ff);
work_upbit= work01 & 0x0f0;//上位4BIT取り出し
work_upbit= work_upbit >> 4;
work_dnbit= work01 & 0x0f;//下位4BIT取り出し

PM3.0 = 0;//スイッチトランジスタポートセット
PM6.1 = 0;

PM1.0 = 0;//出力モード
PM1.1 = 0;
PM1.2 = 0;
PM1.3 = 0;
PM0.0 = 0;
PM1.5 = 0;
PM1.6 = 0;

//**************************************************************************
//
//  上位、下位BIT 7segLED 表示の繰り返し処理
//
//**************************************************************************

while(1){

	P3.0 = 0; //トランジスタ一桁目ON 「0点灯」
	P6.1 = 1; //二桁目off

    //上位ビット表示処理
    
    a = work_upbit;
	P1.0 = (x[a] ^ 0x80) >> 7;//第7BITから順に反転させて各ポートへ
	P1.1 = (x[a] ^ 0x40) >> 6;
	P1.2 = (x[a] ^ 0x20) >> 5;
	P1.3 = (x[a] ^ 0x10) >> 4;
	P0.0 = (x[a] ^ 0x08) >> 3;
	P1.5 = (x[a] ^ 0x04) >> 2;
	P1.6 = (x[a] ^ 0x02) >> 1;
	
	for(ii=0;ii<1;ii++){
	for(i=0;i<300;i++){}
	}

	
	P3.0 = 1;//一桁目消灯
	P6.1 = 0;//二桁目点灯

    
    //下位ビット表示処理
    a = work_dnbit;
	P1.0 = (x[a] ^ 0x80) >> 7;//第7BITから順に反転させて各ポートへ
	P1.1 = (x[a] ^ 0x40) >> 6;
	P1.2 = (x[a] ^ 0x20) >> 5;
	P1.3 = (x[a] ^ 0x10) >> 4;
	P0.0 = (x[a] ^ 0x08) >> 3;
	P1.5 = (x[a] ^ 0x04) >> 2;
	P1.6 = (x[a] ^ 0x02) >> 1;
	
	for(ii=0;ii<1;ii++){
	for(i=0;i<300;i++){}
	}

	
	//P0.1 = 1;//二桁目消灯
	
	P1.0  = 1;//一旦消去
	P1.1  = 1;
	P1.2  = 1;
	P1.3  = 1;
	P0.0  = 1;
	P1.5  = 1;
	P1.6  = 1;

   }// while() loop

}



次回はこれを、タイマ割り込みで表示するようにしたいと思います

.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事