게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
버튼을 눌렀다가 때면 시간이 멈추는 스탑워치 설계중인데 질문드립니다 ㅠㅠ
게시물ID : programmer_22292짧은주소 복사하기
작성자 : 밥보
추천 : 0
조회수 : 881회
댓글수 : 6개
등록시간 : 2018/04/13 21:19:02
옵션
  • 본인삭제금지
// ex3-16.c

#include <mega128.h> 

#include <delay.h>

 

typedef unsigned char u_char;

 

flash u_char seg_pat[10]= {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

u_char  hour = 12, min = 0, sec = 0;

u_char  N1000 = 0, N100 = 0, N10 = 0, N1 = 0;  

u_char  pos = 0;        // 0 : 1자리, 1 : 10자리 , 2 : 100자리 , 3 : 1000자리 

 int CntFlg=0, KeyFlg=0;

void time_Disp(void);   // 시간 표시

void sw_key1(void);     // SW1 입력 처리 함수

void sw_key2(void);     // SW2 입력 처리 함수

void sw_key3(void);     // SW3 입력 처리 함수

void sw_key4(void);     // SW4 입력 처리 함수

 

void main(void)   // 스위치입력확인 초랑 분 더하기.
{

    u_char old_sw, sw, n, ;        
    int CntFlg=0, KeyFlg=0;

                    

    DDRB = 0xF0;                // 포트 B 상위 4비트 출력 설정

    DDRD = 0xF0;                // 포트 D 상위 4비트 출력 설정

    DDRG = 0x0F;                // 포트 G 하위 4비트 출력 설정

    DDRE = 0x0;                 // 포트 E 입력설정

     

    PORTB = 0x0;                // E, F, G, DP off

    PORTD = 0x0;                // A, B, C, D off

                 

    old_sw = PINE & 0b11110000;         // SW1 상태값 추출

    while(1){

        for(n = 0;n < 10;n++){          // 약 1초 경과 루틴        

            time_Disp();                 // 현재 시간 표시

           

            sw = PINE & 0b11110000;     // SW1 상태값 추출

            if(sw == old_sw) continue;  // 스위치 상태 변화 없으면 선두로

                             

            if(old_sw == 0b11110000 && 

               sw == 0b11100000) sw_key1();     // SW1 입력 처리

           else if(old_sw == 0b11110000 && 

               sw == 0b11010000) sw_key2();     // SW2 입력 처리
            if(old_sw == 0b11110000 &&     // sw3 입력 처 
                sw == 0b10110000)sw_key3();          
          
           
            
        }
                     
                //sw4 누르면 시계정지
         if(sw != 0b01110000)
        sec++;  
             }
        if(sec == 60){          // 초값 =60이면 분값 증가

            sec = 0;

            min++;

            

            if(min == 60) {     // 분값 =60이면 시간 증가

                min = 0;

               
            }

        }

    }


 

// 현재 시간 출력

void time_Disp()  //min이랑sec에서 분과 초값을 추출하기, min,sec값으로 세그먼트화면에 표시한다.

{                   

    int  i;

    

    N1000 = min  / 10;              // 시간 10자리 추출

    N100 = min % 10;               // 시간 1자리 추출

    

    N10 = sec / 10;                 // 분 10자리 추출

    N1 = sec % 10;                  // 분 1자리 추출    

    

    for(i = 0;i < 5;i++){   

        PORTG = 0b00001000;         // 7-Seg DIG4 ON(PG3=1), 분 1자리 표시

        PORTD = ((seg_pat[N1] & 0x0F) << 4) | (PORTD & 0x0F);

        PORTB = (seg_pat[N1] & 0x70 ) | (PORTB & 0x0F);

        delay_ms(5);

             

        PORTG = 0b00000100;         // 7-Seg DIG3 ON(PG2=1), 분 10자리 표시

        PORTD = ((seg_pat[N10] & 0x0F) << 4) | (PORTD & 0x0F);

        PORTB = (seg_pat[N10] & 0x70 ) | (PORTB & 0x0F);            

        delay_ms(5);                          

    

        PORTG = 0b00000010;         // 7-Seg DIG2 ON(PG1=1), 시간 1자리 표시

        PORTD = ((seg_pat[N100] & 0x0F) << 4) | (PORTD & 0x0F);

        PORTB = (seg_pat[N100] & 0x70 ) | (PORTB & 0x0F);      

        delay_ms(5);

             

        PORTG = 0b00000001;         // 7-Seg DIG1 ON(PG0=1), 시간 10자리 표시

        PORTD = ((seg_pat[N1000] & 0x0F) << 4) | (PORTD & 0x0F);

        PORTB = (seg_pat[N1000] & 0x70 ) | (PORTB & 0x0F);            

        delay_ms(5);

    } 

}

 

// sw1 입력처리

void sw_key1(void)

{

    N1 = sec % 10;              // 현재 초 1자리 추출

    N10 = sec  / 10;             // 현재 초  10자리 추출

    N100 = min  % 10;           // 현재 분 1자리 추출

    N1000 = min / 10;          // 현재 분 10자리 추출

   

    if(pos == 0) N1 = (N1 + 1) % 10;        // 초 1단위 +1     

    else if(pos == 1) N10 = (N10 + 1) % 6;  // 초 10단위 +1

    else if(pos == 2)  N100 = (N100 + 1) % 10;            // 분 1단위 +1    
    
    else if(pos == 3) N1000 = (N1000 + 1) % 6;  // 초 10단위 +1

   

     

    min  = N1000 * 10 + N100;               // 시간 계산

    sec = N10 * 10 + N1;                    // 분 계산

}    

 

// sw2 입력처리

void sw_key2(void)

{   

    pos = (pos + 1) % 4;                    // 입력 자리 이동


void sw_key3(void)
{   
   sec = 0;
   min = 0;
}
    
void sw_key4(void)
{   if(KeyFlg==0)
KeyFlg=1;
else KeyFlg =0;
}
위의소스는
atmega128구동하기위해서 짠건데 스위치 4를 눌렀을때 시간흐르던게 멈추는데 누르는거 유지안하고 한번만 눌러도 시간이 멈췄따가 다시누르면 시간이 흐르는 코드를 못짜겠어서 여쭤보려고 합니다...도와주세요 ㅠㅠ   
본삭금 걸었습니다. 감사합니다... 아래는 제가 짜본건데 Error: C:\cvavreval\BIN\samplewatch.c(96): declaration syntax error 라고떠서 안되네요... 이소스만되면 가능한데; 도대체 왜 에러가뜨는지 모르겠습니다.. 알려주시면 감사하겠습니다 읽어주셔서 감사합니다.
// ex3-16.c

#include <mega128.h> 

#include <delay.h>

 

typedef unsigned char u_char;

 

flash u_char seg_pat[10]= {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

u_char  hour = 12, min = 0, sec = 0;

u_char  N1000 = 0, N100 = 0, N10 = 0, N1 = 0;  

u_char  pos = 0;        // 0 : 1자리, 1 : 10자리 , 2 : 100자리 , 3 : 1000자리 

 int CntFlg=0, KeyFlg=0;

void time_Disp(void);   // 시간 표시

void sw_key1(void);     // SW1 입력 처리 함수

void sw_key2(void);     // SW2 입력 처리 함수

void sw_key3(void);     // SW3 입력 처리 함수

void sw_key4(void);     // SW4 입력 처리 함수

 

void main(void)   // 스위치입력확인 초랑 분 더하기.
{

    u_char old_sw, sw, n, ;        
    int CntFlg=0, KeyFlg=0;

                    

    DDRB = 0xF0;                // 포트 B 상위 4비트 출력 설정

    DDRD = 0xF0;                // 포트 D 상위 4비트 출력 설정

    DDRG = 0x0F;                // 포트 G 하위 4비트 출력 설정

    DDRE = 0x0;                 // 포트 E 입력설정

     

    PORTB = 0x0;                // E, F, G, DP off

    PORTD = 0x0;                // A, B, C, D off

                 

    old_sw = PINE & 0b11110000;         // SW1 상태값 추출

    while(1){

        for(n = 0;n < 10;n++){          // 약 1초 경과 루틴        

            time_Disp();                 // 현재 시간 표시

           

            sw = PINE & 0b11110000;     // SW1 상태값 추출

            if(sw == old_sw) continue;  // 스위치 상태 변화 없으면 선두로

                             

            if(old_sw == 0b11110000 && 

               sw == 0b11100000) sw_key1();     // SW1 입력 처리

           else if(old_sw == 0b11110000 && 

               sw == 0b11010000) sw_key2();     // SW2 입력 처리
            if(old_sw == 0b11110000 &&     // sw3 입력 처 
                sw == 0b10110000)sw_key3();          
          
           
            
        }
                     
         if( sw == 0b01110000 )sw_key4();       //sw4 누르면 시계정지
    if(KeyFlg == CntFlg )
                       sec++;    }
        
          
        
             }
        if(sec == 60){          // 초값 =60이면 분값 증가

            sec = 0;

            min++;

            

            if(min == 60) {     // 분값 =60이면 시간 증가

                min = 0;

               
            }

        }

    }


 

// 현재 시간 출력

void time_Disp()  //min이랑sec에서 분과 초값을 추출하기, min,sec값으로 세그먼트화면에 표시한다.

{                   

    int  i;

    

    N1000 = min  / 10;              // 시간 10자리 추출

    N100 = min % 10;               // 시간 1자리 추출

    

    N10 = sec / 10;                 // 분 10자리 추출

    N1 = sec % 10;                  // 분 1자리 추출    

    

    for(i = 0;i < 5;i++){   

        PORTG = 0b00001000;         // 7-Seg DIG4 ON(PG3=1), 분 1자리 표시

        PORTD = ((seg_pat[N1] & 0x0F) << 4) | (PORTD & 0x0F);

        PORTB = (seg_pat[N1] & 0x70 ) | (PORTB & 0x0F);

        delay_ms(5);

             

        PORTG = 0b00000100;         // 7-Seg DIG3 ON(PG2=1), 분 10자리 표시

        PORTD = ((seg_pat[N10] & 0x0F) << 4) | (PORTD & 0x0F);

        PORTB = (seg_pat[N10] & 0x70 ) | (PORTB & 0x0F);            

        delay_ms(5);                          

    

        PORTG = 0b00000010;         // 7-Seg DIG2 ON(PG1=1), 시간 1자리 표시

        PORTD = ((seg_pat[N100] & 0x0F) << 4) | (PORTD & 0x0F);

        PORTB = (seg_pat[N100] & 0x70 ) | (PORTB & 0x0F);      

        delay_ms(5);

             

        PORTG = 0b00000001;         // 7-Seg DIG1 ON(PG0=1), 시간 10자리 표시

        PORTD = ((seg_pat[N1000] & 0x0F) << 4) | (PORTD & 0x0F);

        PORTB = (seg_pat[N1000] & 0x70 ) | (PORTB & 0x0F);            

        delay_ms(5);

    } 

}

 

// sw1 입력처리

void sw_key1(void)

{

    N1 = sec % 10;              // 현재 초 1자리 추출

    N10 = sec  / 10;             // 현재 초  10자리 추출

    N100 = min  % 10;           // 현재 분 1자리 추출

    N1000 = min / 10;          // 현재 분 10자리 추출

   

    if(pos == 0) N1 = (N1 + 1) % 10;        // 초 1단위 +1     

    else if(pos == 1) N10 = (N10 + 1) % 6;  // 초 10단위 +1

    else if(pos == 2)  N100 = (N100 + 1) % 10;            // 분 1단위 +1    
    
    else if(pos == 3) N1000 = (N1000 + 1) % 6;  // 초 10단위 +1

   

     

    min  = N1000 * 10 + N100;               // 시간 계산

    sec = N10 * 10 + N1;                    // 분 계산

}    

 

// sw2 입력처리

void sw_key2(void)

{   

    pos = (pos + 1) % 4;                    // 입력 자리 이동


void sw_key3(void)
{   
   sec = 0;
   min = 0;
}
    
void sw_key4(void)
{   if(KeyFlg==0)
KeyFlg=1;
else KeyFlg =0;
}
    


전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호