void main(void) { long op1, op2; //32-bit operands char* ptr; //pointer to keypad buffer char* blanks; char kbuf[12]; //keypad buffer char c, a; int i; ptr = kbuf; blanks = " "; PLL_init(); //set system clock freq to 24MHz lcd_init(); //enable lcd keypad_enable(); //enable keypad set_lcd_addr(0x00); //display on 1st line i = 0; while(1) { c = getkey(); //read keypad a = hex2asc(c); //convert to ascii kbuf[i] = a; // and store in kbuf if(c<10) { //if 0 - 9 data8(a); // display on lcd wait_keyup(); // wait to release key i++; //increment index } else { switch(c) { case 0xE: //if enter (*) key op1 = number(ptr); //convert to binary set_lcd_addr(0x40); //display on 2nd line write_long_lcd(op1); set_lcd_addr(0x00); //clear 1st line type_lcd(blanks); wait_keyup(); //wait to release key i = 0; //reset kbuf index set_lcd_addr(0x00); //display on 2nd line break; case 0xA: //if key A op2 = number(ptr); //convert to binary op1 = op1 + op2; //compete sum set_lcd_addr(0x40); //display on 2nd line write_long_lcd(op1); set_lcd_addr(0x00); //clear 1st line type_lcd(blanks); wait_keyup(); //wait to release key i = 0; //reset kbuf index set_lcd_addr(0x00); //display on 1st line break; case 0xF: //if clear (#) key clear_lcd(); //clear lcd display wait_keyup(); //wait to release key i = 0; //reset kbuf index break; default: break; } } } }
int new_sequence(void) { unsigned long num = 0, newnum = 0; char c; for(i = 0; i < 10; i++) { while(qempty()); c = getq(); newnum = (c - '0') * pow(10, 9 - i); if (num + newnum < num) { // Check for rollover status = 'e'; set_lcd_addr(0); type_lcd("Sequence goes"); set_lcd_addr(0x40); type_lcd("above 2^32!"); return -1; } num += newnum; // we passed test } while (num != 1){ set_lcd_addr(0); if (display_mode) write_long_lcd(num); if (num % 2 == 0) num /= 2; else{ newnum = (num * 3) + 1; if (newnum < num){ // Check for rollover. status = 'e'; set_lcd_addr(0); type_lcd("Sequence goes"); set_lcd_addr(0x40); type_lcd("above 2^32!"); return -1; } num = newnum; // we passed test } if (slow_mode) ms_delay(750);// to make sure we see what numbers we're getting } if (display_mode) write_long_lcd(num); status = 'i'; return num; }