34
HP 20b RPN Calculator By Jayne (Jay) Shim & SonYon (Sonny) Song

HP 20b RPN Calculator - Columbia University

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: HP 20b RPN Calculator - Columbia University

HP 20b RPN Calculator

By Jayne (Jay) Shim & SonYon (Sonny) Song

Page 2: HP 20b RPN Calculator - Columbia University
Page 3: HP 20b RPN Calculator - Columbia University

?

Page 4: HP 20b RPN Calculator - Columbia University

THE PROCESSOR TDI

TDOTMSTCK

NRST

FIQ

IRQ0-IRQ1

PCK0-PCK2

PMC

Peripheral Bridge

Peripheral DataController

AIC

PLLSRAM

2 Kbytes( Back-up)4 Kbytes (Core)

ARM7TDMI Processor

ICEJTAGSCAN

JTAGSEL

PIOA (26 IOs)

Timer Counter

NPCS0NPCS1NPCS2NPCS3MISOMOSISPCK

Flash64/128 Kbytes

DRXDDTXD

TCLK0TCLK1TCLK2TIOA0TIOB0

TIOA1TIOB1

TIOA2TIOB2

Memory Controller

AbortStatus

AddressDecoder

MisalignmentDetection

PIO

PIO

APB

EmbeddedFlash

Controller

AD0AD1AD2AD3

ADTRG

11 Channels

PDC

PDC

SPI

PDC

ADC

ADVREF

TC0

TC1

TC2

TWDTWCK

TWI

XINXOUT

VDDIO1

PWMCPWM0PWM1PWM2PWM3

1.8 VVoltage

RegulatorGND

VDDOUT

VDDCORE

VDDIO1

VDDCORE

Fast FlashProgramming

Interface

ERASE

PGMD0-PGMD15PGMNCMDPGMEN0-PGMEN2

PGMRDYPGMNVALIDPGMNOEPGMCKPGMM0-PGMM3

VDDIO2

TST

DBGUPDC

PDC

PIO

PIT

WDT

System Controller

VDDIO1

SAM-BA

ROM (12 Kbytes)NRSTB

FWUP

PIOB (24 IOs)

LCD Controller

SEG00-SEG39COM0-COM9

PIOC (30 IOs)

32k RCOSC

SupplyControllerPOR

OSC

BOD

2 MHz RCOSC

VDDIO1

RTC

USART0

RXD0TXD0SCK0RTS0CTS0

PDC

PDC

USART1

RXD1TXD1SCK1RTS1CTS1DCD1DSR1DTR1

RI1

PDC

PDC

PIO

PDC

PDC

VDDLCD

CAPP1CAPM1

CAPP2CAPM2

CLKIN

PLLRC

VDD3V6

LCDVoltage

Regulator VDDIO2

ChargePump

VDDINLCD

Page 5: HP 20b RPN Calculator - Columbia University

Liquid Crystal Display (LCD)

Page 6: HP 20b RPN Calculator - Columbia University

The Keyboard

Keyboard Matrix

Keyboard connected to processor

Page 7: HP 20b RPN Calculator - Columbia University
Page 8: HP 20b RPN Calculator - Columbia University

12 x 3 = 36 12 ÷ 3 = 4 ERROR

Page 9: HP 20b RPN Calculator - Columbia University

1. ENTER “1”

3. INPUT

12 x 3 = 36

2. ENTER “2” 12

12

Page 10: HP 20b RPN Calculator - Columbia University

12 x 3 = 36

4. Enter “3”

3

12 3

Page 11: HP 20b RPN Calculator - Columbia University

12 x 3 = 36

5. MULT “×”

36

36

Page 12: HP 20b RPN Calculator - Columbia University

What about...

a complex expression?!

Page 13: HP 20b RPN Calculator - Columbia University

1. Enter “2”

2. INPUT

((2 + 3) × 5) × 6

2

2

Page 14: HP 20b RPN Calculator - Columbia University

3. Enter “3”

((2 + 3) × 5) × 6

2

3

3

Page 15: HP 20b RPN Calculator - Columbia University

4. ADD “+”

((2 + 3) × 5) × 6

5

5

Page 16: HP 20b RPN Calculator - Columbia University

((2 + 3) × 5) × 6

5. Enter “5”

5

5 5

Page 17: HP 20b RPN Calculator - Columbia University

6. MULT “×”

((2 + 3) × 5) × 6

25

25

Page 18: HP 20b RPN Calculator - Columbia University

((2 + 3) × 5) × 6

7. Enter “6”

25

6

6

Page 19: HP 20b RPN Calculator - Columbia University

8. MULT “×”

((2 + 3) × 5) × 6

150

150

Page 20: HP 20b RPN Calculator - Columbia University
Page 21: HP 20b RPN Calculator - Columbia University

Empty Stack

ERROR: EMPTY STACK

1. MULT “×”

Page 22: HP 20b RPN Calculator - Columbia University

OTHER USEFUL KEYS

Page 23: HP 20b RPN Calculator - Columbia University

Backspace ()

Press Backspace “”

7

0

Page 24: HP 20b RPN Calculator - Columbia University

Sign (+⁄−)

Press Sign “+⁄−”

7

-7

Page 25: HP 20b RPN Calculator - Columbia University

Getting Started: Hello World #include "AT91SAM7L128.h“ #include "lcd.h" int main() { int number = 999 ; int digit; int lcdIndex = 11; / lcd_init(); if (number > 999999999 || number < -999999999) {

lcd_put_char7('O', 0); lcd_put_char7('V', 1); lcd_put_char7('E', 2); lcd_put_char7('R', 3); lcd_put_char7('F', 4);

lcd_put_char7('L', 5); lcd_put_char7('O', 6);

lcd_put_char7('W', 7); }

Page 26: HP 20b RPN Calculator - Columbia University

Getting Started: Hello World else { if (number > 0) { while (number > 0) { digit = number % 10; number = number / 10; lcd_put_char7(digit+48, lcdIndex); lcdIndex--; } } else if (number == 0) { lcd_put_char7(48, lcdIndex); } else if (number <0) { while (number < 0) { digit = number % 10; digit = digit*-1; number = number / 10; lcd_put_char7(digit+48, lcdIndex); lcdIndex--; } if (number == 0) { lcd_put_char7(45, 0); } } } return 0; }

Page 27: HP 20b RPN Calculator - Columbia University

Listening to the Keyboard const char keyboard_layout [7][6] = {{'N', 'I', 'P', 'M', 'F', 'A'}, {'C', 'R', 'N', 'B', '%', 'L'}, {'T', '(', ')', 'G', '<', '_'}, {'U', '7', '8', '9', '/', '_'}, {'D', '4', '5', '6', '*', '_'}, {'S', '1', '2', '3', '-', '_'}, {'O', '0', '.', '=', '+', '_'}};

Page 28: HP 20b RPN Calculator - Columbia University

Listening to the Keyboard

char keyboard_key() { int column; int row; char button;   for (column = 0; column <= COLUMN; column++) { keyboard_column_low(column); for (row = 0; row <= ROW; row++) { if(!keyboard_row_read(row)) { keyboard_column_high(column); button = keyboard_layout[column][row]; return button; } } keyboard_column_high(column); } return 0; }

Page 29: HP 20b RPN Calculator - Columbia University

Listening to the Keyboard

int main() { for (;;) {

char key = keyboard_key(); if (key != 0) { for(j = 0; j < 14; j++) { lcd_put_char7(' ',j); } lcd_put_char7(key,11); } else { lcd_print7("no key pressed"); } } return 0; }

Page 30: HP 20b RPN Calculator - Columbia University

Entering and Displaying Numbers void keyboard_get_entry(struct entry *result) { int input = 0; int counter = 0; int sign = 1; for (;;) { int c = keyboard_key(); if (c <= '9' && c >= '0') { input = input * 10 + (c - '0'); counter++; } else if (c == '~') { sign *= -1; } else if (c == '\b') { input /= 10; if(input == 0) lcd_put_char7(' ', 11); } else if (c != -1){ result->operation = c; break; }

Page 31: HP 20b RPN Calculator - Columbia University

Entering and Displaying Numbers

while (c != -1) { c = keyboard_key(); } if (input != 0) lcd_print_int_neg(sign == -1, input); } if (counter == 0) { result->number = INT_MAX; } else { result->number = sign*input; } }

Page 32: HP 20b RPN Calculator - Columbia University

Entering and Displaying Numbers int main() { struct entry entry; *AT91C_WDTC_WDMR = AT91C_WDTC_WDDIS; lcd_init(); keyboard_init(); lcd_print7("PRESS"); while (1) { keyboard_get_entry(&entry); if (entry.operation != 0 && entry.number!=INT_MAX) { lcd_print_int(entry.number); lcd_put_char7(entry.operation, 0); entry.operation = 0; } } return 0; }

Page 33: HP 20b RPN Calculator - Columbia University

An RPN Calculator

void calculate(char operation, int index, int *stack) { if (index < 0) { lcd_print7("ERROR"); } else { int n1 = stack[index]; int n2 = stack[index+1]; switch (operation) { case '+': stack[index] = n1 + n2; break; case '-': stack[index] = n1 - n2; break; case '*': stack[index] = n1 * n2; break; case '/': stack[index] = n1 / n2; break; } stack[index+1] = 0; lcd_print_int (stack[index]); } }

Page 34: HP 20b RPN Calculator - Columbia University

An RPN Calculator int main(){ int stack [50]; int index = 0; while (1) { keyboard_get_entry(&entry); if (entry.operation != 0 && entry.number!=INT_MAX) { stack[index] = entry.number; lcd_print_int(entry.number); if (entry.operation == '\r') { index++; } else if (entry.operation == '+' || entry.operation == '-' ||

entry.operation == '*' || entry.operation == '/') { index--; calculate(entry.operation, index, stack); index++; } } else if (entry.operation == '+' || entry.operation == '-' ||

entry.operation == '*' || entry.operation == '/') { if (index >= 2) { index = index - 2; calculate(entry.operation, index, stack); index++; } else { lcd_print7("ERROR");

} }

} }