BASIC4MCU | 질문게시판 | 버튼으로 외부인터럽트 동작구현 도움이 필요해요
페이지 정보
작성자 비비빅 작성일2022-11-23 21:35 조회1,397회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=21749
본문
인터럽트로1 7-segment에 원하는 숫자를 표현하고
인터럽트2를 동작 시키면 설정한 숫자가 1씩 감소합니다.
인터럽트2를 다시 누르면 숫자가 일시정지하였다가 또 다시 누르면 멈춘 숫자에서 1씩 감소하는 작업을 자유자재로 하고 싶은데
질문사항으로 한개의 인터럽트 안에서 구현 가능한 부분일까요?
밑에는 감소까지 구현한 코드입니다. 일시멈춤이 안됩니다.. 어떻게 하면 좋을까요?
#include <mega128.h>#include <delay.h>unsigned char led = 0xFF; // LED 값 지정typedef unsigned char u_char;flash char seg[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};// 배열값을 3개로 줄여서 표시하면 ㄱㅊ지 않을까 메모리 덜 잡아 먹게u_char N10=0, N1=0;u_char b = 0, c = 0;u_char i = 0;u_char num = 0;void Seg5_out(void);void Seg_num(void);void main(void){// LED 초기값 설정 및 인터럽트 설정DDRC = 0xFF; // 포트 c 출력 설정DDRE = 0b00000010; // 포트 E 입력 설정PORTC = led; // 포트 c에 초기값 출력EIMSK = 0b01110000; // 외부 인터럽트4,5,6 인에이블EICRB = 0b00101010; // 외부 인터럽트 4,5 : 하강에지SREG = 0x80; // 전역 인터럽트 인에이블 비// 세그먼트 초기값 설정 및 인터럽트 설정DDRB = 0xF0; // 포트 BDDRD = 0xF0; // 포트 DDDRG = 0x0F; // 포트 G 하위 4비트 출력 설정// 포트를 과연 상위 4개씩 두개 써서 abcdefgdp를 표현 해야 될까?while(1){Seg5_out(); // 무한 루프Seg_num();}}void Seg_num(void){num = N10 * 10;}void Seg5_out(void){PORTG = 0x08; // 세그먼트 PG3 표시PORTD = ( ( seg[N1] & 0x0F ) << 4 );PORTB = ( seg[N1] & 0xF0 );delay_ms(10);PORTG = 0x04; // 세그먼트 PG2 표시PORTD = ( ( seg[N10] & 0x0F ) << 4 );PORTB = ( seg[N10] & 0xF0 );delay_ms(10);}interrupt [EXT_INT4] void external_int4(void) // 외부인터럽트 4 사용{if( led == 0xFF ) // LED가 모두 꺼져 있다면{led = 0x3f; // LED를 두칸만 켜기}else if( led == 0x3f) // LED가 두칸만 켜져 있다면{led = 0x0f; // LED를 네칸만 켜기}else if( led == 0x0f) // LED가 네칸만 켜져 있다면{led = 0x03; // LED를 여섯칸만 켜기}else // 위의 경우가 모두 아닐경우{led = 0xFF; // LED를 모두 끄기}PORTC = led; // 출력포트에 LED값 입력delay_ms(5);}interrupt [EXT_INT5] void external_int5(void) // 외부인터럽트 5사용{N10 = (N10 + 1) % 10;}interrupt [EXT_INT6] void external_int6(void) // 외부인터럽트 6사용{for( b = num; b>0; b--){num = b;N10 = num/10;N1 = num%10;for( c = 0; c<49; c++){PORTG = 0x08;PORTD = ( (seg[N1] & 0x0F) << 4 );PORTB = ( seg[N1] & 0x70);delay_ms(10);PORTG = 0x04;PORTD = ( (seg[N10] & 0x0F) << 4 );PORTB = ( seg[N10] & 0x70);delay_ms(10);}N1=0;}}
댓글 0
조회수 1,397등록된 댓글이 없습니다.