BASIC4MCU | 질문게시판 | 안녕하세요 썜avr128
페이지 정보
작성자 핑구맹구 작성일2019-11-27 14:20 조회4,821회 댓글1건본문
안녕하세요 샘님.
저번에 7 세그먼트 작동문의답변해주셔서 감사합니다.
이번엔 스위치 4개를 이용해 키패드를 누르면 세그먼트에 44이란 숫자가 나오게하고 # 을 눌러 저장하고 또다시 키패드를 눌러 22 란 숫자를 #에 저장한후 스위치 1번을 누르면 44에서 22를 더하는 결과값을 세그먼트에 나타내고 싶은데용.. 이와같이 첫번째 스위치를 누르면 + 더하기 연산이 되게하고 2번째 스위치를 누르면 곱하기 3번째 스위치 누르면 최솟값 4번째 스위치 누르면 최대값이 설정되게 코딩해보았는데요
숫자는 그냥 예시입니다. 스위치 1~4번까지 더하기 , 곱하기 , 최솟값 , 최대값 이 나오게 하고싶습니다
키패드는 3x4를 사용하고있구요 #을 누르면 숫자가 저장되게하고 * 을누르면 리셋되게 하고싶습니다.
코딩첨부합니다.
인터럽트 스위치는 PE4~7번까지 사용하고있습니다.
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>unsigned char SEG[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83}
unsigend char C[3] = {0b00000001, 0b00000010,0b00000100};
unsigned char R[5] = {0b00000000,0b00000001,0b00000010,0b00000100,0b00001000};
nnsigned char A[] = {0xff,0xff,0xff,0xff,0b11111110,0b11111101,0n11111011,0b11110111};
unsigned int RESULT[4]={0,0,0,0};
unsinged 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<u; g++)
isr+=G[g];
}
Unit(0);
}
ISR(INT5_vect) { //곱셈
start=0;
int sum=0;
int isr=1;
for(int g=09; g<u; 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<u; g++) {
if(G[g]<isr) isr=G[g];
}
Unit(0);
}
ISR(INT7_vect) {
start=0;
isr=0;
for(int g=0; g<u; g++){
if(G[g]>isr) sir=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; //잘못 입력했을 때를 대비하여 *누르면 세그먼트값 모두 지우기
}PORC=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_ns(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풀업DDRD=0x00; // PORTD 0입력
PORTD=0x01; // PORTD의 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<ul 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];
}