ATmega128, Interrupt, 제어, 응용 - 0216
ATmega128, Interrupt, 제어, 응용
[ 간략 설명 ]
◈ ATmega128, Interrupt, 제어, 응용
◈
ATmega128, Interrupt, 제어, 응용
내용 넣기~~~~
◆◆ ATmega128, Interrupt 제어 응용 : 시계시간 설정 ◆◆
/*
외부 인터럽트 제어 응용 - FND p.163 (시계 시간 설정 응용)
SW14는 입력될 자리를 나타내고,
SW8이 눌러지면 현재 선택된 자리의 값을 +1하도록 하라.
SW14가 눌러지면 입력될 위치를 : 1자리 - 10자리 - 100 자리 - 1000자리 이동
0216A_Interrupt_p163.c
*/
#include <mega128.h>
#include <delay.h>
char Seg_pat[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
char N1 = 0, N10 = 0, N100 = 0, N1000 = 0;
char Pos = 0;
// int Min, Hour;
void Seg4_out(void);
void main(void)
{
DDRB = 0xff; // 포트B 출력설정 FND
DDRF = 0b11110000; // PF4-PF7 출력설정 FND
//인터럽트 초기화
EICRB = 0b00001010; // 외부 인터럽트 4 : 하강 에지
EIMSK = 0b00110000; // 외부 인터럽트 0 인에이블
SREG = 0x80; // 전역 인터럽트 인에이블 비트 셋
while(1) Seg4_out(); // 대기 중...
}//end main
void Seg4_out(void){
PORTF = 0b11100000; // SEG 1 (PF4 = 0), 1자리 표시
PORTB = Seg_pat[N1];
delay_ms(5);
PORTF = 0b11010000;
PORTB = Seg_pat[N10];
delay_ms(5);
PORTF = 0b10110000;
PORTB = Seg_pat[N100];
delay_ms(5);
PORTF = 0b01110000;
PORTB = Seg_pat[N1000];
delay_ms(5);
}//endSeg4_out
interrupt [EXT_INT4] void External_int4(void){
N1 = N1%10;
N10 = N10%10;
N100 = N100%10;
N1000 = N1000 %10;
if( Pos == 0 ) N1 = (N1+1)%10;
else if( Pos == 1 ) N10 = ( N10 +1)%10;
else if( Pos == 2 ) N100 = ( N100 + 1)%10;
else N1000 = ( N1000 +1 )%10;
}//end4
interrupt [EXT_INT5] void External_int5(void){
Pos = ( Pos +1 ) %4; // 입력자리 이동
}//end5
◆◆ ATmega128, Interrupt 제어 응용 : 시계시간 설정2 ◆◆
/*
외부 인터럽트 제어 응용 - FND p.165 (시계 시간 설정 응용)
SW14는 입력될 자리를 나타내고,
SW8이 눌러지면 현재 선택된 자리의 값을 +1하도록 하라.
SW14가 눌러지면 입력될 위치를 : 1자리 - 10자리 - 100 자리 - 1000자리 이동
0216B_Interrupt_p165.c
*/
#include <mega128.h>
#include <delay.h>
int Seg[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f };
int N1, N10, N100, N1000;
int Pos = 0;
void Seg4_out(void);
void main(void)
{
DDRB = 0xff; // 1111 1111
DDRF = 0xf0; // 1111 0000
DDRC = 0xff;
PORTC = 0xfe; // 1111 1110
EICRB = 0b00001010;
EIMSK = 0b00110000;
SREG = 0x80; // 1000 0000
while(1) Seg4_out();
}// end main
void Seg4_out(void){
if( Pos == 0){
PORTF = 0xe0; // 1110 0000
PORTB = Seg[N1];
delay_ms(5);
PORTF = 0xd0; // 1101 0000
PORTB = Seg[0];
delay_ms(5);
PORTF = 0xb0; // 1011 0000
PORTB = Seg[0];
delay_ms(5);
PORTF = 0x70; // 0111 0000
PORTB = Seg[0];
delay_ms(5);
}//endif0
if( Pos == 1){
PORTF = 0xe0; // 1110 0000
PORTB = Seg[0];
delay_ms(5);
PORTF = 0xd0; // 1101 0000
PORTB = Seg[N10];
delay_ms(5);
PORTF = 0xb0; // 1011 0000
PORTB = Seg[0];
delay_ms(5);
PORTF = 0x70; // 0111 0000
PORTB = Seg[0];
delay_ms(5);
}//endif1
if( Pos == 2){
PORTF = 0xe0; // 1110 0000
PORTB = Seg[0];
delay_ms(5);
PORTF = 0xd0; // 1101 0000
PORTB = Seg[0];
delay_ms(5);
PORTF = 0xb0; // 1011 0000
PORTB = Seg[N100];
delay_ms(5);
PORTF = 0x70; // 0111 0000
PORTB = Seg[0];
delay_ms(5);
}//endif2
if( Pos == 3){
PORTF = 0xe0; // 1110 0000
PORTB = Seg[0];
delay_ms(5);
PORTF = 0xd0; // 1101 0000
PORTB = Seg[0];
delay_ms(5);
PORTF = 0xb0; // 1011 0000
PORTB = Seg[0];
delay_ms(5);
PORTF = 0x70; // 0111 0000
PORTB = Seg[N1000];
delay_ms(5);
}//endif3
}//endSeg4_out
interrupt [EXT_INT4] void External_int4(void){
N1 = N1 % 10;
N10 = N10 % 10;
N100 = N100 % 10;
N1000 = N1000 % 10;
if( Pos == 0 ) N1 = ( N1+1 ) %10;
else if( Pos == 1 ) N10 = ( N10+1 ) %10;
else if( Pos ==2 ) N100 = ( N100 + 1) %10;
else N1000 = ( N1000 +1) %10;
}//end4
interrupt [EXT_INT5] void External_int5(void){
Pos = ( Pos + 1) %4;
}//end5
◆◆ ATmega128, Interrupt 제어 응용 : 시계 제작 ◆◆
/*
외부 인터럽트 제어 응용 : 시계 제작 p.168
0216C_Interrupt_p168.c
*/
#include <mega128.h>
#include <delay.h>
char Seg_pat[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
char N1 = 0, N10 = 0, N100 = 0, N1000 = 0;
char Pos = 0;
char Hour = 0, Min = 0, Sec =0;
void Time_out(void);
void main(void)
{
char i;
DDRB = 0xff;
DDRF = 0b11110000;
EICRB = 0b00001010;
EIMSK = 0b00110000;
SREG = 0x80;
//시계함수
while(1){
for( i = 0; i < 59 ; i ++) Time_out();
Sec = Sec +1;
if( Sec == 60 ){
Sec = 0;
Min = Min +1;
if( Min == 60 ){
Min = 0;
Hour = (Hour +1) % 24;
}//endif
}//endif
}//endwhile
}//end main
//시간표시함수
void Time_out(void){
PORTF = 0b11100000;
PORTB = Seg_pat[Min %10];
delay_ms(5);
PORTF= 0b11010000;
PORTB = Seg_pat[Min /10];
delay_ms(5);
PORTF = 0b10110000;
PORTB = Seg_pat[Hour%10];
delay_ms(5);
PORTF = 0b01110000;
PORTB = Seg_pat[Hour/10];
delay_ms(5);
}//endTime_out
// 시간 셋팅
interrupt [EXT_INT4] void External_int4(void){
if( Pos == 0) N1 = ( N1 + 1) %10;
else if( Pos ==1 ) N10 = ( N10 +1) %6;
else if( Pos == 2){
if( N1000 == 2) N100 = ( N100 +1) %4;
else N100 = ( N100 +1 ) %10;
}//endelseif
else {
if( N100 <4 ) N1000 = ( N1000 +1 ) %3;
else if( N1000 !=1 ) N1000 = ( N1000 +1 ) %3;
}//endelse
Hour = N1000 * 10 + N100;
Min = N10 * 10 + N1;
}//end4
interrupt [EXT_INT5] void External_int5(void){
Pos = ( Pos +1) % 4;
}//end5
* 오픈캡처 V3.1.1 *캡처가 영 이상하네...10번 넘게 했는데, 똑같은 증상이다.
'Edu > 유비쿼터스설비제어과정' 카테고리의 다른 글
Dot Matrix, AVR, ATmega128 - 0223 (2) | 2011.02.23 |
---|---|
전자사이크로회로, 미분회로, 4017 - 0222 (0) | 2011.02.22 |
미_ 채널전환회로, 디지털회로, RS래치 펄스 발생회로, 카운터회로, 디코더회로, 비안정 발진회로 및 스피커 구동회로 - 0221 (0) | 2011.02.21 |
ATmega128 : Stepping Motor, 정회전, 역회전 - 0218 (0) | 2011.02.18 |
ATmega128, AVR, Stepping Motor, 모터, 정회전, 역회전 - 0217 (0) | 2011.02.18 |
ATmega128, AVR, Interrupt 제어 - 0215 (0) | 2011.02.16 |
- 0214 (0) | 2011.02.16 |
AVR, ATmega128, 인터럽트,FND - 0211 (0) | 2011.02.11 |
AVR, ATmega128, Interrupt, FND, CodeVision - 0210 (0) | 2011.02.10 |
ATmega128, Interrupt, 인터럽트, FND,제어 - 0209 (0) | 2011.02.09 |