계산기 설계 fnd, keypad 사용. 계산기 설계 keypad, fnd(7-segment) 사용 c 기반 설계...

14
계계계 계계 FND, Keypad 계계 20072413 계계계

Upload: ella-cassell

Post on 01-Apr-2015

331 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

계산기 설계FND, Keypad 사용

20072413 박민호

Page 2: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

계산기 설계

Keypad, FND(7-Segment) 사용C 기반 설계0~F 입력 -> 최대 두 자릿수의 10 진수 출력음수표현 : LED 에 1 출력곱셈 : 0~9 입력 -> 0~81 출력나눗셈 :

몫나머지

Speci-fication

Page 3: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

계산기 설계

Keypad scheme

Page 4: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

#include <avr/io.h>

#define LED_CS (*(volatile unsigned char *)0x4800)

#define KEY_DATA (*(volatile unsigned char *)0x5400)

#define KEY_SCAN (*(volatile unsigned char *)0x5800)

#define DIG_SELECT (*(volatile unsigned char *)0x7000)

#define FND_DATA (*(volatile unsigned char *)0x6C00)

#define DIP_SW_CS (*(volatile unsigned char *)0x8000)

void Platform_Init(void);

void Write_KeyPadData(uint8_t data);

uint8_t Read_KeyPadData(void);

void KeyPadScan(uint8_t *pdata, uint8_t *presult);

void ExtFndSet(uint8_t data);

void delay_us(unsigned char time_us);

void delay_ms(unsigned int time_ms);

void digits_FND(uint8_t data);

void calc(uint8_t a, uint8_t b, uint8_t *presult);

계산기 설계

Source code - pre-define

Page 5: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

int main(void){

Platform_Init();

uint8_t a, b, result; // 입력 및 계산 결과 버퍼uint8_t *pa, *pb, *presult; // 입력 및 계산 결과 버퍼 포인터

pa = &a;

pb = &b;

presult = &result;

while(1){

KeyPadScan(pa, presult); //Call by Reference

KeyPadScan(pb, presult); //Call by Reference

calc(a, b, presult); // 계산 결과만 Call by Reference

}

}

계산기 설계

Source code - main

Page 6: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

void Platform_Init(void){

MCUCR = 0x80;

}

// 값을 읽을 행을 선택 . 스캔할 Row

void Write_KeyPadData(uint8_t data){

KEY_DATA = data;

}

// 값을 읽음uint8_t Read_KeyPadData(void){

return KEY_SCAN;

}

void delay_us(unsigned char time_us){

register unsigned char i;

for(i = 0; i < time_us; i++){

asm volatile("PUSH R0");

asm volatile("POP R0");

}

}

void delay_ms(unsigned int time_ms){

register unsigned int i;

for(i = 0; i < time_ms; i++){

delay_us(250);

delay_us(250);

delay_us(250);

delay_us(250);

}

}

계산기 설계

Source code - func-tions

Page 7: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

void ExtFndSet(uint8_t data){

switch(data) {

case 0:

FND_DATA = ~0x3F; //~(0b0011 1111) -> 0b1100 0000

break;

case 1:

FND_DATA = ~0x06;

break;

...

case 9:

FND_DATA = ~0x6F;

break;

default: //Dot

FND_DATA = ~0x80;

}

}

계산기 설계

Source code - fnd value

Page 8: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

void KeyPadScan(uint8_t *pdata, uint8_t *presult){

uint8_t data;

while(1){

Write_KeyPadData(0x0E); //1 번 Row 스캔data = Read_KeyPadData(); // 각 Column 가져오기if(!(data&0x01)){

*presult = *pdata = 0x03;

while((Read_KeyPadData() & 0x0F) != 0x0F){

digits_FND(*pdata);

}

break;

}

...

계산기 설계

Source code - key-pad 1

Page 9: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

Write_KeyPadData(0x0D); //2 번 줄 스캔...

Write_KeyPadData(0x0B); //3 번 줄 스캔...

Write_KeyPadData(0x07); //4 번 줄 스캔...

// 아무것도 안누르고 있을 때 이전 입력을 출력if((Read_KeyPadData() & 0x0F) == 0x0F){

digits_FND(*presult);

}

} //while 문 끝

계산기 설계

Source code - key-pad 2

Page 10: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

void digits_FND(uint8_t data){

if((data & 0x7F) >= 0 && (data & 0x7F) < 10){

// 절대값이 한 자리수일 때 .

DIG_SELECT = 0x80;

ExtFndSet(data & 0x7F);

delay_ms(15); //1 의 자리수 출력 및 딜레이 }

else if((data & 0x7F) > 9 && (data & 0x7F) < 100){

// 절대값이 두 자리수일 때 .

DIG_SELECT = 0x80;

ExtFndSet((data & 0x7F) % 10);

delay_ms(5); //1 의 자리수 출력 및 딜레이

DIG_SELECT = 0x40;

ExtFndSet((data & 0x7F) / 10);

delay_ms(5); //10 의 자리수 출력 및 딜레이 }

else{

// 세 자리 이상이거나 에러면 .. 출력DIG_SELECT = 0xC0;

ExtFndSet(data);

}

// 부호 표시 if((data & 0x80) == 0x80)

// 음수일 때 LED 에 1 출력LED_CS = 0x01;

else

// 양수일 때 LED 에 0 출력LED_CS = 0x00;

}

계산기 설계

Source code - fnd output

Page 11: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

void calc(uint8_t a, uint8_t b, uint8_t *presult){

uint8_t operator = ~DIP_SW_CS; // 연산자 저장

switch(operator){

case 0: // + : plus

*presult = a + b;

break;

case 1: // - : minus

if(a >= b) // 결과 값이 양수일 때 계산*presult = (a - b);

else // 결과 값이 음수일 때 계산*presult = (b - a) | 0x80;

break;

...

계산기 설계

Source code - calculation 1

Page 12: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

case 2: // * : multiply

*presult = (a * b);

if(*presult > 0x7F) *presult = 0x7F; //0x7F(127) 를 넘으면 에러break;

case 3: // / : divide

if(b == 0) //divider is 0 - error. the error output is the dots

*presult = 0x7F;

else

*presult = ((a / b) + (((a % b)<<3) + ((a % b)<<1)));

break;

default: //operator exception

*presult = 0x7F;

break;

}

}

계산기 설계

Source code - calculation 2

Page 13: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

계산기 설계

Source code - demonstra-tion

Page 14: 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1

Q&A

Thank you

계산기 설계