답변 : 답변 : 안녕하세요 썜avr128
페이지 정보
작성자 master 작성일19-11-27 17:12 조회3,301회 댓글0건본문
#include
#include
#include
unsigned char SEG[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83};
unsigned char C[3]={0b00000001,0b00000010,0b00000100};
unsigned char R[5]={0b00000000,0b00000001,0b00000010,0b00000100,0b00001000};
unsigned char A[]={0xff,0xff,0xff,0xff,0b11111110,0b11111101,0b11111011,0b11110111};
unsigned int RESULT[4]={0,0,0,0};
unsigned int G[7]={ };
unsigned char n;
char num;
int Gap[7]={ };
int isr;
int a,p,y,t;
int u=0;
int start;
int sec1,sec10,min1,min10;
int s=0;
int loop;
ISR(INT4_vect){ //덧셈
start=0;
isr=0;
for(int g=0; g;>
isr+=G[g];
}
Unit(0);
}
//
ISR(INT5_vect){ //곱셈
start=0;
int sum=0;
int isr=1;
for(int g=0; g;>
isr*=G[g]; }
sum=isr%10000;
A[3]=SEG[sum/1000]; //1000의 자리
A[2]=SEG[(sum%1000)/100]; //100의자리
A[1]=SEG[((sum%1000)%100)/10]; //10의자리
A[0]=SEG[((sum%1000)%100)%10]; //1의자리
}
//
ISR(INT6_vect){ //최소
start=0;
isr=G[0];
for(int g=0; g;>
if(G[g])isr=g[g];<>
}
Unit(0);
}
//
ISR(INT7_vect){
start=0;
isr=0;
for(int g=0; g;>
if(G[g]>isr)isr=G[g];
}
Unit(0); }
ISR(INT_vect){
start=1;
}
//
void TimerDisplay(){ //Timer/Counter Display
A[0]=SEG[sec1];
A[1]=SEG[sec10];
A[2]=SEG[min1];
A[3]=SEG[min10];
}
//
ISR(TIMER0_OVF_vect){
if(loop<100)
loop++;
else{
loop=0;
sec1++;
if(sec1>=10){ //second
sec10++;
sec1=sec1%10;
}
if(sec10>=6){
min1++;
sec10=sec10%6;
sec1=sec1%10;
}
if(min1>=10){
min10++;
min1=min1%10;
sec10=sec10%6;
sec1=sec1%10;
}
}
TCNT0=112;
}
//
char Keypad(){
char n=0xff;
PORTC=0b00000001;
_delay_ms(1);
if((PINC&0xf0)==0b000100000){
n=SEG[1];
}
else if((PINC&0xf0)==0b00100000){
n=SEG[4];
}
else if((PINC&0xf0)==0b01000000){
n=SEG[7];
}
else if((PINC&0xf0)==0b10000000){
for(int i=0; i<4; i++)
A[i]=0xff; //잘못 입력했을 때를 대비하여*누르면 세그먼트값 모두 지우기
}
PORTC=0b00000010;
_delay_ms(1);
if((PINC&0xf0)==0b00010000){
n=SEG[2];
}
else if((PINC&0xf0)==0b00100000){
n=SEG[5];
}
else if((PINC&0xf0)==0b01000000){
n=SEG[8];
}
else if((PINC&0xf0)==0b1000000){
n=SEG[0];
}
PORTC=0b00000100;
_delay_ms(1);
if((PINC&0xf0)==0b00010000){
n=SEG[3];
}
else if((PINC&0xf0)==0b00100000){
n=SEG[6];
}
else if((PINC&0xf0)==0b01000000){
n=SEG[9];
}
else if((PINC&0xf0)==0b10000000){
G[u++]=StoreNumber();
for(int i=0; i<4; i++)
A[i]=0xff; //#이 눌러짐을 확인하기 위해 눌러지면 세그먼트 불 모두 소등
}
return n;
}
//
int main(){
DDRA=0xff;
DDRB=0xff;
DDRC=0x0f;
DDRE=0x00; // PORTE의 4~7입력
PORTE=0xf0; // PORTE의 4~7풀업
DDRF=0x00; // PORTF0입력
PORTF=0x01; // PORTF 0 풀업
EIMSK=0b11110001; // INT4~7,0 인터럽트 인에이블
EICRB=0b10101010; // INT4~7 하강에지
EICRA=0b10101010; // INT0 하강에지
SREG=0x80; // 전역 인터럽트 인에이블
TCCR0=0b00000111;
TCNT0=112;
TIMSK=0b00000001;
while(1){
NumberInput();
if(start==1)
TimerDisplay(); // start값이 1일 때(INT0이 걸렸을 때)display호출
}
}
//
void NumberInput(){
char temp;
num=Keypad(); // Keypad함수의 반환값인 SEG배열을 num에 대입
if(num!=0xff){
A[3]=A[2];
_delay_ms(10);
A[2]=A[1];
_delay_ms(10);
A[1]=A[0];
_delay_ms(10);
A[0]=num;
_delay_ms(10);
} //세그먼트위에서 값을 왼쪽으로 시프트 시켜줌
a=0;
temp=0xfe;
for(int i=0; i<100; i++){
PORTB=temp;
PORTA=A[a++]; // 세그먼트에 입력한 숫자 차례로 출력
_delay_ms(1);
temp=(temp<<1)|1; //세그먼트를 오른쪽에서 왼쪽으로 차례로 하나씩 점등
if(a>3)a=0;
if(temp==0xef)
temp=0xfe; //세그먼트를 PORTB 0~3만 이용했으므로 4로 넘어가면 다시 오른쪽 제어
_delay_ms(1);
}
}
//
int StoreNumber(void){
int v[4];
for(int h=0; h<4; h++){
RESULT[h]=A[h]; //RESULT배열에 세그먼트에 나타난 숫자를 차례로 대입이 때 대입되는 값은 정수가 아닌 A배열의 값.
for(int n=0; n<10; n++){
if(RESULT[h]==SEG[n])v[h]=n; //A배열의 값이 대입되어 있기 떄문에 이를 정수로 바꿔주는 작업
else if(RESULT[h]==0Xff)v[h]=0; //만약 아무 입력이 없다면 0 이라는 숫자로 취급
}
y=(v[3]*1000)+(v[2]*100)+(v[1]*10)+(v[0]); //자릿수에 맞게 세그먼트 각자의 숫자를 하나의 숫자로 계산
}
return y;
}
//
void ReadNum(){
for(int g=0; g;>
Gap[g]=G[g]; // 입력받은 4개의 값을 Gap 배열에 차례로 대입
}
}
//
void Unit(int sum){
sum=isr%10000;
A[3]=SEG[sum/1000];
A[2]=SEG[(sum%1000)/100];
A[1]=SEG[((sum%1000)%100)/10];
A[0]=SEG[((sum%1000)%100)%10];
}
//
147*2580 전혀 먹통이고 369#누르면 사진과같이 숫자 3333 만 세그먼트에 뜹니다..
스위치도 먹통입니다.

조금만 복잡해도 생각한대로 동작하지 않습니다.
차근 차근 하나씩 버그를 찾아서 수정하세요
복잡한 코드는 남이 도와주지 못합니다.
스스로 해결해야하죠
댓글 : 0
조회수 : 3,301
등록된 댓글이 없습니다.