Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "계산기 설계 FND, Keypad 사용. 계산기 설계 Keypad, FND(7-Segment) 사용 C 기반 설계 0~F 입력 -> 최대 두 자릿수의 10 진수 출력 음수표현 : LED 에 1 출력 곱셈 : 0~9 입력 -> 0~81 출력 나눗셈 : 몫 나머 지 Specific."— Presentation transcript:

1 계산기 설계 FND, Keypad 사용

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

3 계산기 설계 Keypad scheme

4 #include #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 - predefine

5 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

6 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); } 계산기 설계 Source code - functions

7 void ExtFndSet(uint8_t data){ switch(data) { case 0: FND_DATA = ~0x3F; //~(0b ) -> 0b break; case 1: FND_DATA = ~0x06; break;... case 9: FND_DATA = ~0x6F; break; default: //Dot FND_DATA = ~0x80; } 계산기 설계 Source code - fnd value

8 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 - keypad 1

9 Write_KeyPadData(0x0D);//2 번 줄 스캔... Write_KeyPadData(0x0B);//3 번 줄 스캔... Write_KeyPadData(0x07);//4 번 줄 스캔... // 아무것도 안누르고 있을 때 이전 입력을 출력 if((Read_KeyPadData() & 0x0F) == 0x0F){ digits_FND(*presult); } } //while 문 끝 계산기 설계 Source code - keypad 2

10 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

11 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

12 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

13 계산기 설계 Source code - demonstration

14 Q&AQ&A Thank you 계산기 설계


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

Similar presentations


Ads by Google