BASIC4MCU | 질문게시판 | atmega128로 분초 전자시계를 어떻게 만들어야하나요?
페이지 정보
작성자 rpdla 작성일2023-05-05 17:46 조회8,206회 댓글5건첨부파일
본문
아래부분이 초 부분이고 위의 부분이 분 부분이에요. 위의 회로의 아래 버튼을 한번 누르면 초부분이 깜박이고 두번누르면 정지가 됩니다. 그리고 위의버튼을 한번 누르면 시간변경이 되고 두번을 누르면 깜빡이면서 시간수정이 되는 코드를 만들고 싶은데요. 기초 코드는 이거에요
#include
unsigned char KEY1_NOWs, KEY1_OLDs, KEY2_NOWs, KEY2_OLDs , ;
signed char NUM1, NOM2 , MUNs ,NUM0, NUMBER = 0;
unsigned int mSEC = 0;
unsigned char SECs, SEC0,SEC1,MINs,MIN1,MIN0 ;
unsigned char HORs, HOR1, HOR0,HOR2, DAYs,DAY1,DAY0;
unsigned char MODE = 0;
unsigned int KEY1_NUMs = 0, KEY2_NUMs = 0 , ;
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
TCNT2=0x06;
KEY1_OLDs = KEY1_NOWs ; KEY1_NOWs = PINA.0 ;// KEYs_NOWs = PINA ;
KEY2_OLDs = KEY2_NOWs ; KEY2_NOWs = PINA.1 ;
// if((KEY1_OLDs == 0 ) && (KEY1_NOWs == 1)) {NUMBER += 1 ; }
// if((KEY2_OLDs == 0 ) && (KEY2_NOWs == 1)) {NUMBER -= 1 ; }
mSEC +=1;
if(mSEC < 500) {PORTB.2 = 1;}
else if(mSEC < 999) {PORTB.2 = 0;}
else {mSEC = 0; SECs +=1 ;}
PORTB.0 = 1 ; PORTD = MIN1*16 + MIN0 ;
PORTB.1 = 1 ; PORTE = SEC1*16 + SEC0 ;
if(SECs > 59) {SECs = 0 ; MINs += 1;}
if(MINs > 59) {MINs = 0 ; HORs += 1;}
if(HORs > 23) {HORs = 0 ; DAYs += 1;}
SEC1 = SECs / 10;
SEC0 = SECs % 10;
MIN1 = MINs / 10;
MIN0 = MINs % 10;
HOR1 = HORs /10;
HOR0 = HORs %10;
PORTB.0 =1 ; PORTD = MIN1*16 + MIN0 ; // PORTD = NUM1 << 4) + NUM0 ;
// PORTD = KEY_NOWs;
// PORTB.1 = 1 ; PORTE = SEC1*16 + SEC0 ;
if (mSEC < 500) {PORTB.1 = 1 ; PORTE = SEC1*16 + SEC0 ; }
else {PORTB.1 = 0 ; PORTE = SEC1*16 + SEC0 ; }
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<)>
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<)>
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<)>
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<)>
// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<)>
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<)>
// Port D initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRD=(1<)>
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTD=(0<)>
// Port E initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRE=(1<)>
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTE=(0<)>
// Port F initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRF=(0<)>
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTF=(0<)>
// Port G initialization
// Function: Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRG=(0<)>
// State: Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTG=(0<)>
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
ASSR=0<;<>
TCCR0=(0<)>
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// OC1C output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=(0<)>
TCCR1B=(0<)>
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 250.000 kHz
// Mode: Normal top=0xFF
// OC2 output: Disconnected
// Timer Period: 1 ms
TCCR2=(0<)>
TCNT2=0x06;
OCR2=0x00;
// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer3 Stopped
// Mode: Normal top=0xFFFF
// OC3A output: Disconnected
// OC3B output: Disconnected
// OC3C output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=(0<)>
TCCR3B=(0<)>
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<)>
ETIMSK=(0<)>
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=(0<)>
EICRB=(0<)>
EIMSK=(0<)>
// USART0 initialization
// USART0 disabled
UCSR0B=(0<)>
// USART1 initialization
// USART1 disabled
UCSR1B=(0<)>
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<)>
SFIOR=(0<);<>
// ADC initialization
// ADC disabled
ADCSRA=(0<)>
// SPI initialization
// SPI disabled
SPCR=(0<)>
// TWI initialization
// TWI disabled
TWCR=(0<)>
// Globally enable interrupts
#asm("sei")
while (1)
{
}
}
뭘 어떻게 해야할지 전혀 감을 못잡고 있어요 . 그래서 c언어 책을 보았지만 이해가 잘안돼서 어떻게 해야 할지 잘모르겠어요. 도와주세요. 제발
댓글 5
조회수 8,206master님의 댓글
master 작성일
위의버튼을 한번 누르면 시간변경이 되고 두번을 누르면 깜빡이면서 시간수정이 되는 코드를 만들고 싶은데요
//
한번 누르면 시간변경 모드로 진입
이 후 누를 때마다 1분씩 증가
그렇다면 시간변경 모드를 종료하고 시계모드로 되돌아가는 방법은?
rpdla님의 댓글
rpdla 작성일스위치를 눌러서 멈추게한 다음에 리셋하고 시간수정으로 할려고요
master님의 댓글
master 작성일
아래 버튼을 한번 누르면 초부분이 깜박이고 두번누르면 정지가 됩니다
//
위에서 정지라는 말은 시계가 정지인가요? 아니면 깜박이는 것이 정지하고 계속 표시하는 것인가요?
그리고 왜 초를 깜박이죠?
rpdla님의 댓글
rpdla 작성일둘다 정지시키는 거에요. 그리고 초 부분만 깜빡이게 하는것은 전자시계에서 버튼을 누르면 전체가 깜빡이 잔아요. 그것을 스위치 두개를 이용해서 할려고요
master님의 댓글
master 작성일
알고리즘이 불명확하면 코드를 작성하지 못합니다.
버튼1 : 모드변경기능 (시간모드 <--> 수정모드)
버튼2 : 1분씩 증가 (수정모드에서만 동작)
수정모드에서는 전체적으로 초단위로 깜박임
제가 생각한 구성은 위와 같습니다.
위처럼 작성해보세요