BASIC4MCU | 질문게시판 | atmega128에 키패드랑 fnd를 사용하여 숫자가 나열되었을때
페이지 정보
작성자 팡핑퐁 작성일2020-11-18 20:17 조회4,212회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=14045
본문
# define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
char fnd_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char fnd_cnt=0,fnd_buf[4]={0};
ISR(TIMER0_COMP_vect){
PORTB=0xFF;
switch(fnd_cnt){
case 0: PORTA=fnd_table[fnd_buf[0]]; PORTB=~1; break;
case 1: PORTA=fnd_table[fnd_buf[1]]; PORTB=~2; break;
case 2: PORTA=fnd_table[fnd_buf[2]]|0x80; PORTB=~4; break;
case 3: PORTA=fnd_table[fnd_buf[3]]; PORTB=~8; break;
}
if(++fnd_cnt>3)fnd_cnt=0;
}
//
char KeyScan(void){
char KeyBuf=0xFF;
DDRC=0; PORTC=0xFF;
DDRC=0x08; PORTC&=~0x08; _delay_us(1000);
if(!(PINC&1))KeyBuf='1';
if(!(PINC&2))KeyBuf='2';
if(!(PINC&4))KeyBuf='3';
DDRC=0; PORTC=0xFF;
//
DDRC=0x10; PORTC&=~0x10; _delay_us(1000);
if(!(PINC&1))KeyBuf='4';
if(!(PINC&2))KeyBuf='5';
if(!(PINC&4))KeyBuf='6';
DDRC=0; PORTC=0xFF;
//
DDRC=0x20; PORTC&=~0x20; _delay_us(1000);
if(!(PINC&1))KeyBuf='7';
if(!(PINC&2))KeyBuf='8';
if(!(PINC&4))KeyBuf='9';
DDRC=0; PORTC=0xFF;
//
DDRC=0x40; PORTC&=~0x40; _delay_us(1000);
if(!(PINC&1))KeyBuf='*';
if(!(PINC&2))KeyBuf='0';
if(!(PINC&4))KeyBuf='#';
DDRC=0; PORTC=0xFF;
return KeyBuf;
}
int main(void){
char key,old;
int i;
DDRA=0xFF; DDRB=0x0F;
TCCR0=0x0C; OCR0=249; TIMSK=2;
SREG=0x80;
old=KeyScan();
while(1){
key=KeyScan();
if(old!=key){
if((key>='0')&&(key<='9')){
for(i=2;i>=0;i--)fnd_buf[i+1]=fnd_buf[i];
fnd_buf[0]=key&0x0F;
}
old=key;
}
}
}
이렇게 하면 숫자가 계산기처럼 나타낼수 있습니다. 이때 #키를 이용하여 숫자들을 저장하고 인터럽트를 사용해 제일 큰 숫자랑 제일 작은숫자가 나타나게 할려면 어떻게 하면 돼나요?
댓글 1
조회수 4,212master님의 댓글
master 작성일
4개의 숫자를 저장하고, 대소를 비교하고, 큰 숫자와 작은 숫자를 표시하면 되나요?
저장이야 배열을 하나 더 만들어서 넣으면 그만이고
대소비교도 4개 밖에 없으니 아무렇게나 비교해도 어려운 것이 아닐텐데요
배열의 원소개수가 많을 때는 최대값과 최소값을 찾는 함수를 만들어서 사용합니다.(웹검색으로 "c언어 최대값" 또는 "c언어 최소값"을 검색하면 됩니다.)