계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계...
-
Upload
ella-cassell -
Category
Documents
-
view
328 -
download
3
Transcript of 계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계...
계산기 설계FND, Keypad 사용
20072413 박민호
계산기 설계
Keypad, FND(7-Segment) 사용C 기반 설계0~F 입력 -> 최대 두 자릿수의 10 진수 출력음수표현 : LED 에 1 출력곱셈 : 0~9 입력 -> 0~81 출력나눗셈 :
몫나머지
Speci-fication
계산기 설계
Keypad scheme
#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
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
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
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
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
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
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
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
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
계산기 설계
Source code - demonstra-tion
Q&A
Thank you
계산기 설계