スポンサーリンク


RAKUTEN

  • スポンサーリンク

« Aitdndoのラジオ用LCD | メイン | Aitendoのラジオ用LCD(その3) »

2012/12/31

Aitendoのラジオ用LCD(その2)

その2です。前回の回路で、とにかく表示だけテストするソフトを組んでみました。

Dscf1481  動作はこんな感じです。

仕様として以下を考慮しています。

 ・周波数4桁表示

 ・AM/SW/FMアイコンの表示

 ・AM時はKHzアイコン、SW/FM時はMHzアイコンの表示

 ・AM時は小数点なし、SW時は小数点2桁、FM時は小数点1桁表示

ソースは以下の通りです。

#include "P24FJ64GA004.h"

void Set_Lcd(unsigned int) ;

//config
_CONFIG2(0xF9FC);
_CONFIG1(0x3F7F);

unsigned int coldata[3];

//main loop
int main(void)
{

   unsigned int i,t;

   //Setup clock
   OSCCON = 0x11C0;  // FRCPLL
   CLKDIV =  0x0030;  // 1MIPS SETTING

   //IO PORT SETTING
AD1PCFG = 0xffff; // Analog input disable
TRISA = 0x000f; // All output (Will be changed)
TRISB = 0x0000; // All output
TRISC = 0x0000; // All output

// INITIALIZE
coldata[0] = 0;coldata[1] = 0;coldata[2] = 0;
Set_Num(1234);    // 4桁で周波数を指定
Set_Band(1);  // バンド指定 0=AM / 1=SW / 2=FM

   //Test Loop テストなのでとりあえず適当なループ。後でタイマー割り込みにする。
   while(1){
for (i=0;i<=2;i++) {
  Set_Lcd(i);
}
   }
}

// NUMERIC SET 4桁の数字を一気にバッファにセットする

void Set_Num(unsigned int num){
coldata[0] &= 0xf9db;coldata[1] &= 0x0001;coldata[2] = 0xe000;
Set_1digit(3,num/1000);
Set_1digit(2,(num%1000)/100);
Set_1digit(1,(num%100)/10);
Set_1digit(0,num%10);

}

// BAND SET SW/AM/FM MHz/KHz/少数点 インジケータをセットする

void Set_Band(unsigned int band){
if (band ==0) { coldata[2] &= 0x1ffe;
     coldata[0] &= 0x0924;
     coldata[0] |= 0x2001;     // AM KHz 小数点以下なし
     coldata[1] &= 0x1ffe;    
}               
if (band ==1) { coldata[2] &= 0x1ffe;
     coldata[0] &= 0xfff6;
     coldata[0] |= 0x8010;     // SW MHz 小数点以下2桁
     coldata[1] |= 0x0001;    
}             
if (band ==2) { coldata[2] &= 0x1ffe;
     coldata[0] &= 0x0924;
     coldata[0] |= 0x0408;     // FM MHz 小数点以下1桁
     coldata[1] |= 0x0001;    
}               
}

// NUMERIC SET 1桁の数字をセットするルーチン

void Set_1digit(unsigned int col,unsigned int num){
unsigned int wk1,wk2,wk3;
wk1 = 0;wk2=0;wk3=0;
switch (num) {           // 0-9す数字に合わせてセグメントデータを設定
  case 0: wk3 =0x07;wk2=0x05;wk1=2;break;
  case 1: wk3 =0x01;wk2=0x01;wk1=0;break;
  case 2: wk3 =0x03;wk2=0x06;wk1=2;break;
  case 3: wk3 =0x03;wk2=0x03;wk1=2;break;
  case 4: wk3 =0x05;wk2=0x03;wk1=0;break;
  case 5: wk3 =0x06;wk2=0x03;wk1=2;break;
  case 6: wk3 =0x06;wk2=0x07;wk1=2;break;
  case 7: wk3 =0x03;wk2=0x01;wk1=0;break;
  case 8: wk3 =0x07;wk2=0x07;wk1=2;break;
  case 9: wk3 =0x07;wk2=0x03;wk1=2;break;
  deafult: break;
}
coldata[0]=coldata[0] | (wk1 << (col*3+1));
coldata[1]=coldata[1] | (wk2 << (col*3+1));
coldata[2]=coldata[2] | (wk3 << (col*3+1));
}

// SEGMENT CONTROL ここでLCDを制御

void Set_Lcd(unsigned int seg) {

int i;
unsigned int wk;

wk = coldata[seg];
PORTB = wk ^ 0xffff;      // オンするセグメントを0Vにする
PORTA = 0xffff;
switch (seg) {        // Col選択 選択したColだけ1をドライブ(3V)
  case 0 :        // それ以外はフロート(1.5V)
     TRISA = 0xfffe;break;
  case 1 :
     TRISA = 0xfffd;break;
  case 2 :
     TRISA = 0xfeff;break;
  default :break;
}
Wait_time(100);        // 適当なウェイト 後でタイマー割り込みにする

PORTB = wk;         // オンするセグメントを3Vにする
PORTA = 0x0000;        // 選択したColを0Vに。それ以外は1.5Vのまま

Wait_time(100);        // 適当なウェイト 後でタイマー割り込みにする
}

// WAIT LOOP 適当なウェイトルーチン

void Wait_time(unsigned int t) {
int t0,t1;
for (t0=0;t0<t;t0++) {
  for (t1=0;t1<100;t1++) {
  }
}
}

今回はテストなので本当に表示するだけです。タイマー割り込み型にしないと他になにもできないですね。

実は下にあるAitendoのDSPラジオIC基板を別に買ってあるので、年明けにそれと組み合わせてデジタル表示のマルチバンドDSPラジオにしようと思っています。

Dscf1472

今年もあと2時間ちょっとなので、このへんで。

それではまたです。

トラックバック

この記事のトラックバックURL:
http://app.blog.ocn.ne.jp/t/trackback/240957/23952594

この記事へのトラックバック一覧です Aitendoのラジオ用LCD(その2)

コメント

コメントを投稿