// 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;
}