メインプログラム:USB_DAC.c

プロセッサーエキスパート(PE)で設定した結果、下図の様なソースファイルが生成されます。ポートの初期設定以外は全て完了していますのでMAIN関数の含まれているUSB_DAC.cのみを記述します。TextLCD.cはLCDキャラクタディスプレー用ライブラリです。詳しい内容は”LCD VUディスプレーの製作”でご紹介していますので割愛します。

【宣言部】
#includeでTextLCD.hを宣言します。これでTextLCD.c内の関数が使用できるようになります。#defineでLowを0とHiを1など、宣言しておくとプログラムが読みやすくなるので回路図のポートに接続されている信号名と対応するポート名を宣言します。

//*********************************************************
//
// Filename : USB_DAC.c
// Version : 01.00
// Compiler : CodeWarrior HCS08 C Compiler
// Date/Time : 2010/08/15, 0:00
//
// USB DAC制御プログラム
//
// Copyright : n.Tanaka
//
//
//*********************************************************

/***** Including *****/
#include "TextLCD.h"

/* Types definition */
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
typedef unsigned long dlong[2];

/***** 宣言部 *****/
#define Low 0
#define Hi 1
#define Out 1
#define In 0
#define GATE PTAD_PTAD0   // DA CONT GATE OUT(1:DIS, 0:ENA)
#define RE_A PTBD_PTBD0   // RE A IN
#define RE_B PTBD_PTBD1   // RE_B IN
#define VR_CS PTCD_PTCD0  // EVR SPI CS OUT(1:DIS, 0,ENA)
#define MUTE PTCD_PTCD1  // MUTE OUT (1:ENA, 0:MUTE)
#define PWR_CONT PTCD_PTCD2 // POWER CONT OUT (1:ON, 0:OFF)
#define PWR_LED_G PTED_PTED2 // POWER LED G OUT(1:ON, 0:OFF)
#define PWR_LED_R PTED_PTED3 // POWER LED R OUT(1:ON, 0:OFF)
#define IR_RX PTGD_PTGD0   // IR_RX IN
#define HID0 PTAD_PTAD1   // HID0 OUT(1:MUTE, 0:NORMAL)
#define HID1 PTCD_PTCD4   // HID1(1:VOLUME+, 0:NORMAL)
#define HID2 PTGD_PTGD3   // HID2 OUT(1:VOLUME-, 0:NORMAL)
#define FUNC0 PTED_PTED4  // FUNC0 OUT(1:NEXT TRACK, 0:NORMAL)
#define FUNC1 PTED_PTED5  // FUNC1 OUT(1:PREVIOUS TRACK, 0:NORMAL)
#define FUNC2 PTGD_PTGD2  // FUNC2 OUT(1:STOP, 0:NORMAL)
#define FUNC3 PTCD_PTCD3  // FUNC3 OUT (1:PLAY/PAUSE, 0:NOMAL)
#define SWA PTED_PTED0   // SWA OUT
#define SWB PTED_PTED1   // SWB OUT
#define SW1 PTFD_PTFD0   // SW1 IN
#define SW2 PTFD_PTFD1   // SW2 IN
#define SW3 PTFD_PTFD4   // SW3 IN
#define SW4 PTFD_PTFD5   // SW4 IN
#define PWR_SW PTGD_PTGD1   // PWR_SW IN
#define SP_MUTE PTCD_PTCD5  // SP_MUTE IN

byte PWR_FLG;   // 電源SWフラグ
byte PWR_CHG;  // 電源変化フラグ
byte flg;       // 変化フラグ
byte L_DATA,R_DATA;  // VR設定データレジスタ
word result;         // 送信結果レジスタ
byte MUTE_FLG;      // ミュートフラグ
byte VR_L_DATA;     // 電子ボリュームに送る設定値(L)
byte VR_R_DATA;     // 電子ボリュームに送る設定値(R)
char string[5];       // キャラクタ表示文字列レジスタ
byte VOLUME_DATA;  //

#define Rch 0x03   // 右チャンネルのADCチャンネル指定(ADC3)
#define Lch 0x02   // 左チャンネルのADCチャンネル指定(ADC2)
long DATA;      // 一時格納用レジスタ(16bit)
char xch;        // AD変換チャンネル指定レジスタ
long Rch_DATA;   // Rch AD変換結果レジスタ
long Lch_DATA;   // Lch AD変換結果レジスタ
long AD_DATA[4];  // 平均化用レジスタ
int i;
char BAR_COUNT;    // ||BARの数(0〜11)
char BAR_TYPE;     // 一番右のBARのタイプ([| ]は0,[||]は1)
char SPACE_COUNT;  // マーカーまでの空白の数
char MARK_TYPE;    // マーカーのキャラクタタイプ([ ' ]0x02,[|']0x03,[|'|]0x04)
char RED_ZONE_TYPE; // レッドゾーン部のBARタイプ([| ]は0x00,[||]は0x01)

【対数変換テーブル関数】
AD変換したオーディオレベルをdB表示に変換するテーブルです。詳細はLCD VUディスプレーでご紹介しています。LCD VUディスプレーとの違いは全波整流回路が反転していないので入力信号と整流した直流電圧は比例関係となります。信号が大きくなると直流電圧も高くなります。表示は-20dBから+6dBまで2dBステップです。

/***********************
* 対数変換表示テーブル *
************************/ // AD変換結果を対数変換し、表示パラメータを設定するテーブル
void BAR_TABLE(long DATA){
if (DATA <= 15)            // -20db
{
BAR_COUNT = 0;           // [| |]の数は0
BAR_TYPE = 0x20;          // [ ]一番右のBARのタイプをスペースにする
SPACE_COUNT = 4;         // スペースの数は4
MARK_TYPE = 0x02;         // [ ' ]
RED_ZONE_TYPE = 0x20;     // [ ]スペース
return;
}
if (DATA <= 18)           // -20db
{
BAR_COUNT = 0;
BAR_TYPE = 0;          // [| ]
SPACE_COUNT = 4;
MARK_TYPE = 0x02;
RED_ZONE_TYPE = 0x20;
return;
}

【BAR表示関数】
バーグラフでディスプレーに表示するための関数です。詳しくはLCD VUディスプレーでご紹介しています。

/**************
* BAR表示関数 *
***************/
void LCD_Display(void)
{
  for(i=0;i<BAR_COUNT;i++)     // [| |]を表示
  {
    LCD_putc(0x01);
  }
  LCD_putc(BAR_TYPE);       // [| |]/[| ]を表示
  for(i=0;i<SPACE_COUNT;i++)
  {
    LCD_putc(0x20);
  }
  LCD_putc(MARK_TYPE);     // 0dBマークの部分を表示[ ' ]/[|' ]/[|'|]
  LCD_putc(RED_ZONE_TYPE);  // +3,+6dB部分を表示[| |]/[| ]
  for(i=0;i<2;i++)           // 右端の2文字に" "スペースを表示
  {
    LCD_putc(0x20);
  }
}

【AD変換関数】
全波整流したオーディオ信号をAD変化する関数です。詳細はLCD VUディスプレーでご紹介しています。

//*********************************************************
//* AD変換関数
//*********************************************************
void AD_START(char xch) // AD変換チャンネル xch にRchかLchを入れて呼び出す
{
  for(i=0;i<4;i++) // 変換結果はRch(Lch)_DATAに格納される
  {
    setReg8(ADC1SC1, xch); // 指定チャンネルのAD変換を開始
    while (!ADC1SC1_COCO){} // AD変換終了待ち
    DATA = (ADC1RH*256)+ADC1RL;
    AD_DATA[i] = DATA;
  }
  for(i=0;i<2;i++)
  {
    DATA = (AD_DATA[i]+AD_DATA[i+1])/2; // 平均化
  }
/**** 結果格納 *****/
  if(xch == Rch) // 指定チャンネルにAD変換結果を格納
  {
    Rch_DATA = DATA;
  }
  if(xch == Lch)
  {
    Lch_DATA = DATA; // 指定チャンネルにAD変換結果を格納
  }
  return;
}

【数値―キャラクタコード変換関数】
測定値を±2桁の数値で液晶で表示するアスキーコードに変換する関数です。引数1は測定データ、引数2は配列名stringです。
変換した文字列は配列名stringに格納されます。表示は+00dBという形で表示されます。最初に符号を付けます。
次に2桁の数値をそれぞれの桁の数値にカウントして格納します。0はアスキーコードで0x30ですから数値と加算すればキャラクタコードに変換されます。
配列の最後には0を入れて文字列が終了した事を表します。

//*********************************************************
//* 数値キャラクタ変換関数
//*********************************************************
void bin_string(unsigned int value,char *str)
{
  char aux;
  unsigned int unit = 10;
  str[0] = str[1] = str[2] = str[3] = 0;
  if(value<=127) str[0] = '+';   // 符号を+に設定
  if(value>127)
  {
    value = 256 - value;    // 負の数に変換
    str[0] = '-';          // 符号を-に設定
  }
  aux = 1;             // 2文字目に移動
  while(value)          // 各桁の数をカウントして格納
  {
    if(value>=unit)
    {
      value -= unit;
      str[aux]++;
    }
    else
    {
      aux++;
      unit /= 10;   // 桁下がり
    }
  }
  str[1] += 0x30;    // 1文字目の数値をアスキーコードに変換
  str[2] += 0x30;    // 2文字目の数値をアスキーコードに変換
  str[3] = 0x64;     // dを表示
  str[4] = 0x42;    // Bを表示
  str[5] = 0x00;    // 文字列終了!0を送る
}

【スイッチチェック関数】
スイッチはポートを節約するためにスキャンして読込ます。最初はSWA,SWBとも入力になっています。SW1〜SW4は入力でプルアップされています。従って最初はスイッチが押されても全てHiとなります。まず、SWA列を読み込みます。SWAを出力ポートにしてLowにします。回路図のSW1からSW4が押されるとLowになります。SW5〜SW7は押されてもSWBが入力なのでHiのままです。SWAが読込めたらポートを入力に戻し、SWB列で同様の動作を行い、SW状況を読み込みます。スイッチが多い時などポート節約の為に行う方法です。100個のSWも10×10でポート20個で読込む事が出来ます。
ドットマトリクスLEDや7セグメントLEDを表示する時と同じやり方です。

//*********************************************************
//* スイッチチェック関数
//*********************************************************
void SW_READ(void)
{
/***** SW A *****/
  PTEDD_PTEDD0 = Out; // SWA OUT
  SWA = Low;
  Cpu_Delay100US(1);

/***** PLAY/PAUSE *****/
  if (!SW1) FUNC3 = Hi;
  else FUNC3 = Low;

/***** NEXT TRACK *****/
  if (!SW2) FUNC0 = Hi;
  else FUNC0 = Low;

/***** VOLUME+ *****/
  if (!SW3) HID1 = Hi;
  else HID1 = Low;

/***** MUTE *****/
  if (!SW4) HID0 = Hi;
  else HID0 = Low;
  PTEDD_PTEDD0 = In; // SWA IN

/***** SW B *****/
  PTEDD_PTEDD1 = Out; // SWB OUT
  SWB = Low;
  Cpu_Delay100US(1);

/***** STOP *****/
  if (!SW1) FUNC2 = Hi;
  else FUNC2 = Low;

/***** PREVIOUS TRACK *****/
  if (!SW2) FUNC1 = Hi;
  else FUNC1 = Low;

/***** VOLUME- *****/
  if (!SW3) HID2 = Hi;
  else HID2 = Low;
  PTEDD_PTEDD1 = In; // SWB IN
}

電源スイッチチェック関数】
電源スイッチは他のスイッチとは別に読込ます。電源OFF時の待機電力削減の為、将来SLEEP MODEにする為です。電子ボリュームは電源起動時、初期設定が必要なので初回のみ設定するように電源スイッチ変化フラグ PWR_CHGを立てています。

//*********************************************************
//* 電源スイッチチェック関数
//*********************************************************
void PWR_SW_READ(void)
{
  if (PWR_SW == 0)
  {
    Cpu_Delay100US(10);
    if (PWR_SW == 0) PWR_FLG = !PWR_FLG;
    PWR_CHG = 1;
    while (!PWR_SW) {}
  }
}

【VR設定値送信関数】
電子ボリュームにSPIでシリアル転送する関数です。ヘッドフォンが接続されたらスピーカ出力をミュートするため電子ボリュームの設定値を0にします。DA_SPI_SendChar関数で8ビットシリアル転送してくれるので、Rch・Lchの順番で連続して送信します。CSは2バイト送信中Lowを保持します。ディレイを100uS入れないと電子ボリュームが受信できない事がありますので注意が必要です。

/*******************
* VR設定値送信関数 *
*******************/
void SEND_DATA(void)
{
  if (MUTE_FLG)
  {
    VR_L_DATA = 0;       // ミュートなら電子ボリュームに0を送る
    VR_R_DATA = 0;
  }
  else
  {
    VR_L_DATA = L_DATA;  // VR設定データを電子ボリューム設定データに
    VR_R_DATA = R_DATA;
  }
  TPM3C1SC_CH1IE = 0;   // 割り込み禁止
  VR_CS = 0;          // チップセレクト→LOW
  Cpu_Delay100US(1);
  result = DA_SPI_SendChar(VR_R_DATA);   // Rch VRデータ送信
  Cpu_Delay100US(1);
  result = DA_SPI_SendChar(VR_L_DATA);   // Lch VRデータ送信
  Cpu_Delay100US(1);
  while(!SPI1S_SPTEF){}              // 送信完了待ち
  VR_CS = 1;                     // チップセレクト→HI
  flg = 0;                       // 変化フラグクリア
  VOLUME_DATA = (L_DATA / 2)-96;
  bin_string(VOLUME_DATA,string);      // X測定値をキャラクタに変換
  LCD_PrintDisplay(0xCB,string);        // VOLUME値を表示
  TPM3C1SC_CH1IE = 1;             // 割り込み許可
}

【赤外線リモコン受信用関数】
詳しい解説は赤外線リモコン受信機 IR_RXを参照してください。(2010/11/23)

/*******************
* リーダー受信関数  *
*******************/
void RX_LEADER(void)
{
  endf = 1; // 待機解除要求フラグ 1=待機、0=待機解除
  ERR = 0; // リーダーコード判定レジスタクリア
  while(endf) // ON終了まで待機
  {
    if(PTGD_PTGD0)endf = 0; // ON終了なら待機解除 ON→OFF
    if(TPM1SC_TOF) // タイムオーバーなら
    { //
      ERR = 1; // エラーフラグをセット
      endf = 0; // 待機解除
      TPM1CNT = 0; // モジュロカタイマーをクリア
      TPM1SC_TOF = 0; // clear TOF
    }
  }
  if(TPM1CNT < 31128)ERR = 1; // リーダーコード判定(8mS以下は不良)
  endf = 1;
  while(endf) // OFF終了待ち
  {
    if(!PTGD_PTGD0)endf = 0; // OFF終了なら待機解除 OFF→ON
    if(TPM1SC_TOF) // タイムオーバーなら
    {
      ERR = 1; // エラーフラグをセット
      endf = 0; // 待機解除
    }
  }
  TPM1CNT = 0; // モジュロタイマーをクリア
  TPM1SC_TOF = 0; // clear TOF
}

/*****************
* コード受信関数  *
*****************/
void RX_CODE(void)
{
  byte i;
  TEMP =0; // データ保留レジスタをクリア
  for(i=0;i<8;i++) // 8ビットなので8回繰り返し
  {
    endf = 1;
    while(endf) // ON終了待ち
    {
      if(PTGD_PTGD0)endf = 0; // ON終了なら待機解除 ON→OFF
      if(TPM1SC_TOF) // タイムオーバーなら
      {
        ERR = 1; // エラーフラグをセット
        endf = 0; // 待機解除
        TPM1CNT = 0; // カウンタリセット
        TPM1SC_TOF = 0; // clear TOF
      }
    }
    endf = 1;
    while(endf) // OFF終了待ち
    {
      if(!PTGD_PTGD0)endf = 0; // OFF終了なら待機解除 OFF→ON
      if(TPM1SC_TOF) // タイムオーバーなら
      {
        ERR = 1; // エラーフラグをセット
        endf = 0; // 待機解除
        TPM1CNT = 0; // カウンタリセット
        TPM1SC_TOF = 0; // clear TOF
      }
    }
    if(TPM1CNT < 6459) // 周期判定 64uS×26=1.66mS("0"は1.125mS,"1"は2.25mS)
    {
      TPM1CNT = 0; // モジュロタイマーリセット
      TEMP = TEMP & ~BitMask[i]; // TEMPレジスタのiビット目をクリア
    }
    else
    {
      TPM1CNT = 0; // モジュロタイマーリセット
      TEMP = TEMP | BitMask[i]; // TEMPレジスタのiビット目をセット
    }
  }
}

【ロータリーエンコーダ割込み関数】
この関数はロータリーエンコーダーのB相が接続されているキャプチャ入力が変化したことによる割り込みで、ベクターテーブルにより指定されています。
割り込み処理終了後、割り込み前の位置に戻ります。ロータリーエンコーダの回転方向によりR/Lchのデータに2を加減算します。電子ボリュームは0.5dBステップですから1dBステップで制御する事になります。

/*******************************
* ロータリーエンコーダ割込関数 *
*******************************/
ISR(RE_Interrupt)
{
  TPM3C1SC_CH1F = 0;      // 割り込みフラグクリア
  if (RE_B == RE_A)        // 回転方向判断 A=B 時計方向
  {
    if(R_DATA < 192)      // 最大値制限
    R_DATA = R_DATA + 2;  // Rch VR値をインクリメント
    if(L_DATA < 192)      // 最大値制限
    L_DATA = L_DATA + 2;  // Lch VR値をインクリメント
  }
  else                // A=!B 反時計方向
  {
    if(R_DATA > 0)        // 最小値制限
    R_DATA = R_DATA - 2;  // Rch VR値をデクリメント
    if(L_DATA > 0)        // 最小値制限
    L_DATA = L_DATA - 2;  // Lch VR値をデクリメント
  }
  flg = 1;              // 変化フラグをセット
}

【初期設定】
入出力ポート初期設定
各ポートの入出力方向設定とプルアップON/OFFを設定します。

//*********************************************************
//* 初期設定
//*********************************************************

/***** PORT A 設定 *****/
  PTADD_PTADD0 = Out; // GATE
  PTADD_PTADD1 = Out; // HID0

/***** PORT B 設定 *****/
  PTBDD_PTBDD0 = In; // RE_A
  PTBDD_PTBDD1 = In; // RE_B
  PTBDD_PTBDD2 = In; // R_CH_AD_IN
  PTBDD_PTBDD3 = In; // L_CH_AD_IN
  PTBPE = 0b00000011; // pull-up[0:1]

/***** PORT C 設定 *****/
  PTCDD_PTCDD0 = Out; // VR_CS
  PTCDD_PTCDD1 = Out; // MUTE
  PTCDD_PTCDD2 = Out; // PWR_CONT
  PTCDD_PTCDD3 = Out; // FUNC3
  PTCDD_PTCDD4 = Out; // HID1
  PTCDD_PTCDD5 = In; // SP_MUTE
  PTCPE = 0b00100000; // pull-up[5]

/***** PORT E 設定 *****/
  PTEDD_PTEDD0 = In; // SWA
  PTEDD_PTEDD1 = In; // SWB
  PTEDD_PTEDD2 = Out; // PWR_LED_G
  PTEDD_PTEDD3 = Out; // PWR_LED_R
  PTEDD_PTEDD4 = Out; // FUNC0
  PTEDD_PTEDD5 = Out; // FUNC1
  PTEPE = 0b00000000; // pull-up

/***** PORT F 設定 *****/
  PTFDD_PTFDD0 = In; // SW1
  PTFDD_PTFDD1 = In; // SW2
  PTFDD_PTFDD4 = In; // SW3
  PTFDD_PTFDD5 = In; // SW4
  PTFPE = 0b00110011; // pull-up[0:1,4:5]

/***** PORT G 設定 *****/
  PTGDD_PTGDD0 = In; // IR_RX
  PTGDD_PTGDD1 = In; // PWR_SW
  PTGDD_PTGDD2 = Out; // FUNC2
  PTGDD_PTGDD3 = Out; // HID2
  PTGPE = 0b00000010; // pull-up[1]

トリム設定
お馴染みの内部クロックトリム設定です。ICGの場合FTRIMレジスタはありません。
LCD初期化
キャラクタディスプレーを初期化してオープニングメッセージを表示します。
初期設定
電源OFF時はポートの接続先が0vになっている所がありますのでポート出力をLowにします。

/***** TRIM設定 *****/
  ICGTRM = 0x73;

/***** LCD初期化 *****/
  LCD_Init();
  LCD_CG_init();
  Cpu_Delay100US(1);
  LCD_PrintDisplay(Line_0," USB-DAC SYSTEM "); // オープニングメッセージ1行目を書込む
  Cpu_Delay100US(1);

  LCD_PrintDisplay(Line_1,"Ver1 デンシコウサクノモリ"); // オープニングメッセージ2行目を書込む
  Cpu_Delay100US(20000); // 2秒待ち
  LCD_WriteData(LCD_CMD_CLAR,LCD_CMD_RS); // 表示クリア
  Cpu_Delay100US(50);

/***** 初期設定 *****/
  PWR_CHG = 1;
  PWR_FLG = 0;
  L_DATA = 138; // Lch初期設定値
  R_DATA = 138; // Rch初期設定値
  flg = 1; // 変化フラグをセット
  GATE = Hi; // GATE 初期設定値
  VR_CS = Low; // VR CS 初期設定値
  PWR_CONT = Low; //
  FUNC0 = Low; //
  FUNC1 = Low; //
  FUNC2 = Low; //
  FUNC3 = Low; //
  HID0 = Low; //
  HID1 = Low; //
  HID2 = Low; //
  SWA = Hi;
  SWB = Hi;
  MUTE = 0;
  TPM3C1SC_CH1IE = 1; // 割り込み許可

【メインループ】
電源スイッチがON/OFF変化した時だけ別の処理をします。ONの時は初期設定。OFFの時はミュートやポート処理です。スイッチを読み込み、ヘッドホンが接続された時にはスピーカ出力をミュートする為のフラグを立てます。割込みがあった場合フラグが立ちますので電子ボリュームに新しいデータを送信します。毎回AD変換してオーディオレベルを表示する事を繰り返します。先頭部分に赤外線リモコンによる操作を追加しました。(2010/11/23)

//*********************************************************
//* メインループ
//*********************************************************
  for(;;)
  {
/***** IR REMOTE *****/
  if (IR_FLG)
  {
    IR_FLG = 0;
    switch(SW_DATA)  // ポート出力
    {
      case 0 :
        FUNC0 = Hi;
        break;
      case 1 :
        PWR_FLG = !PWR_FLG;
        PWR_CHG = 1;
        break;
      case 2 :
        FUNC3 = Hi;
        break;
      case 3 :
        HID2 = Hi;
        break;
      case 4 :
        HID1 = Hi;
        break;
      case 5 :
        FUNC2 = Hi;
        break;
      case 6 :
        HID0 = Hi;
        break;
      case 7 :
        FUNC1 = Hi;break;
      default:
        break;
    }
    Cpu_Delay100US(1000);
  }

/***** POWER SW *****/
  PWR_SW_READ();          // POWERスイッチチェック
  if (PWR_FLG & PWR_CHG)
  {
    VR_CS = Hi;           // VR CS -> Hi
    PWR_CONT = 1;         // MAIN POWER ON
    PWR_LED_G = 1;        // POWER LED G ON
    PWR_LED_R = 0;        // POWER LED R OFF
    GATE = Low;          // GATE ON
    SPI1C2_BIDIROE = 1;     // SPI DATA DIR -> Output
    MUTE = 1;
    PWR_CHG = 0;
    flg = 1;
    LCD_WriteData(LCD_CMD_DISP_NCUR,LCD_CMD_RS);  // 表示開始
    Cpu_Delay100US(1);
    LCD_WriteData(LCD_CMD_CLAR, LCD_CMD_RS);     // 表示クリア
    Cpu_Delay100US(50);
    LCD_PrintDisplay(0x8B," Vol ");               //
    Cpu_Delay100US(5000);
    TPM3C1SC_CH1F = 0;                     // 割り込みフラグクリア
    TPM3C1SC_CH1IE = 1;                     // 割り込み許可
  }
  if (!PWR_FLG & PWR_CHG)
  {
    TPM3C1SC_CH1IE = 0;                    // 割り込み禁止
    LCD_WriteData(LCD_CMD_DISP_OFF, LCD_CMD_RS); // ディスプレイ表示OFF
    Cpu_Delay100US(1);
    MUTE = 0;
    GATE = Hi; // GATE OFF
    SPI1C2_BIDIROE = 0;         // SPI DATA DIR -> Input (EVR IC POWER OFFの為)
    VR_CS = Low;              // VR CS -> Low (EVR IC POWER OFFの為)
    PWR_CONT = 0;            // MAIN POWER OFF
    PWR_LED_G = 0;            // POWER LED G OFF
    PWR_LED_R = 1;            // POWER LED R ON
    PWR_CHG = 0;
  }
/***** POWER ON *****/
  if (PWR_FLG)
  {
    SW_READ();              // SW読込

/***** SP_MUTE *****/
    if (!SP_MUTE & !MUTE_FLG)   // HEAD PHONO MUTE
    {
      Cpu_Delay100US(100);
      if (!SP_MUTE & !MUTE_FLG)
      {
        MUTE_FLG = 1;
        flg = 1;
      }
    }
    if (SP_MUTE & MUTE_FLG)
    {
      Cpu_Delay100US(100);
      if (SP_MUTE & MUTE_FLG)
      {
        MUTE_FLG = 0;
        flg = 1;
      }
    }

/***** RE & EVR *****/
    if (flg)
    {
      SEND_DATA();      // VR設定値送信関数へ
      Cpu_Delay100US(100);
    }
/***** LCD VU 表示 *****/
    AD_START(Lch);      // Lch AD変換
    AD_START(Rch);      // Rch AD変換

/***** Lch BAR表示 *****/
    BAR_TABLE(Lch_DATA);
    LCD_WriteData(Line_0,LCD_CMD_RS);   // 1行目の先頭に移動
    Cpu_Delay100US(10);             // 1mS Wait! 液晶の応答速度に合わせる。
    LCD_putc(0x06);                // "L"を表示
    Cpu_Delay100US(10);             // 1mS Wait! 液晶の応答速度に合わせる。
    LCD_Display();                 // BARを表示

/***** Rch BAR表示 *****/
    BAR_TABLE(Rch_DATA);
    LCD_WriteData(Line_1,LCD_CMD_RS);  // 2行目の先頭に移動
    Cpu_Delay100US(10);            // 1mS Wait! 液晶の応答速度に合わせる。
    LCD_putc(0x05);               // "R"を表示
    Cpu_Delay100US(10);            // 1mS Wait! 液晶の応答速度に合わせる。
    LCD_Display();  // BARを表示
    Cpu_Delay100US(1000); // 100mS Wait! 液晶の応答速度に合わせる。
  }
}
/*** Don't write any code pass this line, or it will be deleted during code generation. ***/
/*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
for(;;){}
/*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/

/* END USB_DAC */
/*
** ###################################################################
**
** This file was created by Processor Expert 3.07 [04.34]
** for the Freescale HCS08 series of microcontrollers.
**
** ###################################################################
*/

TOP BACK NEXT