-3

HC6812 マイクロコントローラーをプログラミングしていますが、C で次の 2 つの関数を使用する必要があります。

  • ポート B の LED をオフにします

  • PTH (ポート H) のスイッチ入力ビット 0 ~ 4 を読み取る

  • ポート A の 7 セグメント ディスプレイにスイッチ値を表示します。

  • スイッチで設定された 0 ~ 31 秒間、ポート B のすべての LED を点灯させます。

  • 最後に、ポート B のすべての LED をオフにします。

私の 2 つの機能は、Hexled(16 進スイッチの入力と 7 セグメントの表示を読み取る) とwait(遅延を作成する) です。

コードをコンパイルすると、次の 4 つのエラーが表示されます。

Hexled関数定義で 'pointer expected' が 2 回発生します

'関数の引数宣言が競合していますHexled'

'の再宣言エラーHexled'

C/C++ の関数では、関数プロトタイプ、関数定義、およびメイン ループでその関数を呼び出す必要があることを理解しています。私は自分が何を間違えたのか理解できず、そこから学びたいと思っています。多数の C プログラミング Web ページを調査してみました。

#include <stdio.h>

void wait(int);
void hexled (unsigned char,unsigned char);

unsigned char switchdata;
unsigned char a;
unsigned char b;
unsigned char mask;
unsigned char index;
unsigned char index1;

/******************* Declare the port addresses **********************/
unsigned char *PORTA = (unsigned char *)0x0000;
unsigned char *DDRA  = (unsigned char *)0x0002;  
unsigned char *PORTB = (unsigned char *)0x0001;
unsigned char *DDRB  = (unsigned char *)0x0003;
unsigned char *PTH   = (unsigned char *)0x0260;
unsigned char *DDRH  = (unsigned char *)0x0262;
unsigned char *PERH  = (unsigned char *)0x0264;

unsigned char LED_data[16] =     {0x3F,
                                  0x6,
                                  0x5B,
                                  0x4F,
                                  0x66,
                                  0x6D,
                                  0x7D,
                                  0x7,
                                  0x7F,
                                  0x6F,
                                  0x77,
                                  0x7C,
                                  0x39,
                                  0x5E,
                                  0x79,
                                  0x71}; // LED output




int main(void)
{
  /******************* Set up I/O ports********************************/    

*DDRH = 0x00;                   /* make Port H an input port */
*PERH = 0xFF;                   /* enable Port H */
*DDRA = 0xFF;                   /* make Port A an output port */
*DDRB = 0xFF;                   /* make Port B an output port */

  /******************* Main loop ***************************************/   


   *PORTB = 0xFF;

    mask = 0b00001111;

    switchdata = *PTH & mask;
    switchdata = *PORTA;

    index = (switchdata & 0b00010000);
    index1 = (switchdata | mask);

    hexled(index,index1);

    *PORTB = 0X00;

    wait(31);

    *PORTB = 0xFF;

    asm ("swi");

    return 0;
}



 // ***************************HEX FUNCTION**********************************
  void hexled(a,b) //* HEXLED function definition
  {                       
if (a)
     {
       *PORTA = switchdata [b] & 0b00010000;
     }
else
     {
       *PORTA = switchdata [b] | mask;
     }
  }


// ***************************DELAY FUNCTION************************************
 void wait(int seconds)  //*WAIT function defintion
   {
       int x,y,z;

       for (x=0; x<seconds; x++)
         {
           for (y=0; y<=100; y++)
             {
               for (z=0; z<=2000; z++);
             } 
         }  
   }
4

2 に答える 2

1

コードのバグ/問題:

  • /* enable Port H */コメントくださいenable pull-up Port H
  • switchdata = *PORTA;出力として設定されているポートを読み取るのは意味がありません。また、HC12 では動作しません。一部のポートには、ピンの状態を読み取ることができる入力レジスタがありますが、PORTA はそれらの 1 つではありません。
  • main() または as でローカルに宣言されているはずのグローバル変数を多数使用していますstatic
  • LED_dataconstフラッシュに割り当てられるように宣言する必要があります。
  • これは、このような独立した実装では意味がありません。プログラムがクラッシュする原因になります。
  • ソフトウェア割り込みは何のためにあり、どこで処理されますか? 処理しないままにしておくと、プログラムがクラッシュします。
  • C での関数定義の構文はvoid hexled (unsigned char a, unsigned char b).
  • どちらab配列ではなく、それらのいずれかを配列として使用しても意味がありません。含まれているすべてのコード[ ]は意味がありません。あなたは何を達成しようとしていますか、ビットマスキングですか?
  • スイッチを読み取っているようですが、信号のデバウンスを実装していないため、スイッチに関連するプログラムの動作はランダムになります。
  • 待機関数は潜在的に何もせず、最適化されます。少なくとも、すべてのループ反復子変数を として宣言する必要がありますvolatile。ただし、オンチップ タイマーを使用することをお勧めします。ECT または RTI タイマーをチェックしてください。
于 2015-11-13T09:32:56.120 に答える
1

の関数定義にhexledパラメータ タイプがありません - 変更してください:

void hexled(a,b) //* HEXLED function definition

に:

void hexled(unsigned char a, unsigned char b) //* HEXLED function definition

switchdataまた、内部で使用しようとしている方法にも奇妙なことがありますhexled()。これはグローバルunsigned charですが、たとえば、配列またはポインターのように使用しようとしています

   *PORTA = switchdata [b] & 0b00010000;

ここで実際に何をしようとしているのか、何ab意味するのかを説明できるかもしれません。(上級者向けのヒント: より意味のあるパラメーター名を使用することをお勧めします。)

于 2015-11-13T09:11:39.423 に答える