2016-11-24 7 views
0

このコードを書く際に問題があります。私は機能から戻ることにあまり慣れていない。これらの関数の中には、「すべてのパスが値を返すわけではありません」というエラーがあります。

私はz8 Encoreマイクロコントローラを使用してコード化しようとしています。これは、ディップ、スイッチ、およびブレッドボードを介してLEDに接続しています。

基本的に私はZ8ボード上のテストスイッチを押すと、各機能にアクセスし、LEDに1つのカウント出力をインクリメントするようにコードを書こうとしています。

どこが間違っているのか分かりません。私のコンパイラは、button_pushedpushed_buttonreleased_buttonに「すべてのパスが値を返すわけではない」と伝えています。誰かが私を助けることができれば、それは非常に高く評価されるだろう!

#include <ez8.h> 
#include <STDIO.H> 

unsigned char pushed_button(); 
unsigned char released_button(); 
unsigned char dip; 

void init_ports(); 
void button_pushed(); 
void mydelay(unsigned int msec); 

void main() 
{ 
    char count=0; 

    init_ports(); 

    while(1) 
    { 
     dip=PDIN; 

     button_pushed(); 
     PEOUT=count; 
     count++;; 

     return (0); 
    } 
} 


void button_pushed() 
{ 
    unsigned char pushed_button; 

    pushed_button=PCIN; 
    pushed_button=pushed_button & 0x01; 

    while(pushed_button==0x00) 
    { 
     return (0); 
    } 
} 

unsigned char pushed_button() 
{ 
    unsigned char pushed_button; 

    pushed_button=PCIN; 
    pushed_button=pushed_button & 0x01; 

    while(pushed_button==0x01) 
    { 
     button_pushed(); 
    } 
    if(pushed_button==0x00) 
    { 
     mydelay(2); 

    } 
    if(pushed_button==0x00) 
    { 
    return (0); 
    } 
} 

unsigned char released_button() 
{ 
    unsigned char pushed_button; 

    pushed_button=PCIN; 
    pushed_button=pushed_button & 0x01; 

    while (pushed_button==0x00) 
    { 
     button_pushed(); 
    } 
    if(pushed_button==0x01) 
    { 
     mydelay(2); 
    } 
    while(pushed_button==0x01) 
    { 
     return (0); 
    } 
} 

void mydelay (unsigned int msec) 
{ 
    long int delay; 

    while(1) 
    { 
     for(delay=266666;delay>0;delay--); 
    } 

} 

void init_ports(void) 
{ 
    PEADDR=0x02; 
    PECTL=0x00; 
    PEADDR=0x01; 
    PECTL=0x00; 
    PEADDR=0x03; 
    PECTL=0x00; 
    PEADDR=0x00; 

    PDADDR=0x02; 
    PDCTL=0x00; 
    PDADDR=0x01; 
    PDCTL=0xFF; 
    PDADDR=0x00; 

    PCADDR=0x02; 
    PCCTL=0x00; 
    PCADDR=0x01; 
    PCCTL=0x01; 
    PCADDR=0x00; 
} 
+1

あなたのコンパイラは何が間違っているかを正確に伝えています。これら3つの関数はすべて、値を返すように指定します。たとえば、 'button_pushed'の中で' pushed_button == 0x00'の最初の反復がfalseに評価された場合、プログラムは何の値も返さずに関数の最後にヒットする可能性があります。 – David

+0

Davidに感謝します。 0x00の値は、プログラムの実行中に表示されないことを意味します。私は "0x01"でプッシュボタンをマスクし、戻り値が "0x00"であれば、 "mydelay"関数を呼び出してこのステートメントを繰り返してから、 "released_button"関数を呼び出してください。 – Nman

+1

'char main()'。本当に?????また、 'while'ステートメントを使用すると、ループ本体に' return'ステートメントだけが含まれているときに、難読化が不要になります。単純な '' if''が行います。 – Peter

答えて

0

私はどこに問題があるのか​​知っています。 呼び出し関数の知識が不足しています。

init_ports関数からすべてのコードを取り出し、このコードをvoid main(void)に入れてコンパイルできました&私のプログラミングキットのテストスイッチがledで出力していた別のプログラムを実行すると増分カウントではなくスイッチを押しましたが、それは照明が点灯してLEDを切り替えるためです。

ポートの初期化をすべてinit_ports()関数に戻しましたが、今はledに出力がありません。私が関数を使っているやり方に何か問題があると私を導いてくれますか?または、これらの関数からコールバックしようとしています。よく分かりません。

関連する問題