2016-11-24 2 views
0

이 코드를 작성하는 데 문제가 있습니다. 나는 함수에서 돌아 오는 것에 익숙하지 않다.일부 함수에서 "모든 경로가 값을 반환하지 않습니다"라는 오류가 있습니다 - 해결 방법은 무엇입니까?

저는 브렌드 보드를 통해 dip, switch 및 led가 인터페이스 된 z8 Encore 마이크로 컨트롤러로 코드를 작성하려고합니다.

기본적으로 Z8 보드의 테스트 스위치를 누르면 각 기능에 액세스 한 다음 LED에 단일 카운트 출력을 증가 시키도록 코드를 작성하려고합니다.

어디서 잘못 될지 잘 모르겠습니다. 내 컴파일러는 button_pushed, pushed_button, released_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

컴파일러가 무엇이 잘못 되었습니까? 이 세 함수는 모두 값을 반환하도록 지정합니다. 예를 들어'button_pushed'에서'pushed_button == 0x00'의 첫 번째 반복이 false로 평가되면 프로그램은 아무 값도 반환하지 않고 함수의 끝에 도달 할 수 있습니다. – David

+0

데이비드에게 감사드립니다. 0x00 값은 프로그램이 실행되는 동안 볼 수 없다는 의미입니다. 푸시 버튼을 "0x01"로 마스크하고 반환 값이 "0x00"인 경우 "mydelay"함수를 호출 한 다음이 문을 반복하고 "released_button"함수를 호출합니다. – Nman

+1

'char main()'. 정말????? 또한'while' 문을 사용하면 루프 본문에'return' 문만 포함될 때 불필요한 난독 화가 발생합니다. 간단한''if''가 할 것입니다. – Peter

답변

0

내 문제가있는 곳을 알고 있습니다. 함수 호출에 대한 지식이 부족합니다.

init_ports 함수에서 모든 코드를 꺼내고이 코드를 void (void)에 넣고 컴파일 할 수있었습니다. & 프로그래밍 키트의 테스트 스위치가 led에서 출력되는 다른 프로그램을 실행할 때 나는 스위치를 누르고 증분 수 (내가 원하는 것)는 아니지만 조명이 켜지고 LED들 사이를 전환 할 것이다.

나는 init_ports() 함수에 포트의 초기화를 모두 되돌려 놨다. 이제는 led에 출력이 없다. 함수를 사용하는 방식에 문제가 있다는 것을 알게 해 주시겠습니까? 또는이 함수에서 콜백하려고합니다. 나는 잘 모르겠다.

관련 문제