Guest User

Untitled

a guest
Mar 22nd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.18 KB | None | 0 0
  1. /**********************************************************************************
  2. Kalkulator AVR v1.2
  3. Menggunakan Keypad 4x4
  4. Tombol operasi:
  5. Tombol A -> +
  6. Tombol B -> -
  7. Tombol C -> X
  8. Tombol D -> /
  9. Tombol # -> Enter
  10. Tombol * -> To be decided
  11.  
  12. Diagram:
  13. Pin 0-3 Keypad -> Pin 11 - 8 Arduino (Urutan harus sama)
  14. Pin 4-7 Keypad -> Pin 7 - 4 Arduino (Urutan harus sama)
  15.  
  16. Langkah operasi:
  17. 1. Masukkan salah satu simbol operator (A / B / C / D pada Keypad)
  18. 2. Tekan tombol Enter (#) untuk menyimpan operand ke dalam memory OP
  19. 3. Masukkan angka satu per satu
  20. 4. Tekan tombol Enter (#) untuk menyimpan nilai ke dalam variabel A
  21. 5. Masukkan angka satu per satu kembali
  22. 6. Tekan tombol Enter (#) untuk menyimpan nilai ke dalam variabel B
  23. 7. Jika hasil dari perhitungan lebih dari 9999, program akan kembali ke awal.
  24. Jika tidak, hasil akan ditampilkan di Serial monitor / 7-segment
  25.  
  26. Known bugs :
  27. 1. Jika tombol tertekan terus, bilangan akan terinput lebih dari 1x.
  28. 2. Pada saat mengeluarkan variabel result (hasil kalkulasi) ke display, harus dipancing
  29. terlebih dahulu menggunakan perintah lain atau melakukan perintah display bilangan
  30. lebih dari 1x.
  31.  
  32. **********************************************************************************/
  33. // Library
  34. #include <avr/io.h>
  35. #include <util/delay.h>
  36. #include <string.h>
  37. #define maxLED 4
  38.  
  39.  
  40. // Deklarasi fungsi dan prosedur
  41. unsigned int scan_keypad(void); // Fungsi untuk scanning keypad
  42. void conv_keypad_int(int masukan); // Procedure untuk mengubah nilai input keypad menjadi nilai kolom dan baris dari keypad
  43. unsigned int clean_keypad(); // Fungsi untuk menyaring nilai floating (tidak jelas) dan mengeluarkan nilai yang jelas
  44. void geser_led(char masukan[]); // Prosedur untuk menggeser array LED ke kiri sebesar 1x
  45. void input_bilangan(); // Prosedur untuk mengambil bilangan dari scanner ke program
  46. unsigned int input_variabel(); // Fungsi untuk mengambil nilai keypad ke memory (variabel)
  47. char input_operator(); // Fungsi untuk mengambil nilai keypad berupa operator ke memory (variabel)
  48. void input_kalkulator(); // Fungsi untuk mengambil input bilangan dan operator
  49. unsigned int kalkulasi(); // Fungsi untuk melakukan kalkulasi
  50. void display_number(int, int, int, int);
  51. void cathode_high();
  52.  
  53. // Fungsi kalkulator
  54. void input_bilangan(int* masukan); // Fungsi untuk mengambil nilai dari keypad
  55. unsigned int conv_string_to_int (char masukan[]); // Mengubah nilai string menjadi nilai integer
  56.  
  57. // Global Variable
  58. char keypad_map_char[4][4] = {{'1','2','3','+'},
  59. {'4','5','6','-'},
  60. {'7','8','9','X'},
  61. {'C','0','=','/'}};
  62. unsigned int keypad_map_int[16] = {1,2,3,'+',4,5,6,'-',7,8,9,'/','C',0,'=','/'};
  63. unsigned int kolom, baris; // Bilangan kolom dan baris untuk memetakan karakter keypad
  64. unsigned x, y; // Variabel untuk menyimpan bilangan operand
  65. unsigned int result; // Variabel untuk menyimpan bilanan hasil kalkulasi
  66. char op; // Variabel untuk menyimpan operator
  67.  
  68. int push[] = {A2, A1, A0}; // push[0]=menu, push[1]=select, push[2]=plus, push[3]=minus
  69. int ledPin = A4; // LED Pin detik
  70. int halfSecond = 0; // Nilai tiap 500ms
  71. int loopAlarm;
  72.  
  73. // Boolean untuk aktifasi setiap event
  74. bool isProgramRun = false;
  75. bool select = false;
  76. bool startCalculator = true;
  77. bool startJam = true;
  78. bool flag = true;
  79. bool doneCalculator = false;
  80.  
  81. // Variabel pengaturan mode dan timer
  82. unsigned char mode = 1;
  83. unsigned long int timer;
  84. unsigned long int lasttimer=0;
  85.  
  86. // Konstanta waktu
  87. signed int jam_satuan, jam_puluhan, menit_satuan, menit_puluhan, detik_puluhan, detik_satuan;
  88. signed int timer_menitPuluhan, timer_menitSatuan, timer_detikPuluhan, timer_detikSatuan;
  89.  
  90. long number = 0; //declear the variables
  91. int first_digit = 0;
  92. int second_digit = 0;
  93. int third_digit = 0;
  94. int fourth_digit = 0;
  95. int timer_event = 0;
  96. int CA_1 = 3;
  97. int CA_2 = 2;
  98. int CA_3 = 12;
  99. int CA_4 = 13;
  100.  
  101.  
  102. int clk = A3;
  103. int latch = A4;
  104. int data = A5;
  105. int count = 0;
  106. int digits[4];
  107. int CAS[4] = {3, 2, 12, 13};
  108. byte numbers[10] {B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110};
  109. //byte combinations for each number 0-9
  110.  
  111.  
  112. // Setup pin input/output
  113. void setup()
  114. {
  115. Serial.begin(9600);
  116. // Pengesetan pin output untuk 7-segmen
  117. pinMode(CA_1, OUTPUT);
  118. pinMode(CA_2, OUTPUT);
  119. pinMode(CA_3, OUTPUT);
  120. pinMode(CA_4, OUTPUT);
  121. pinMode(clk, OUTPUT);
  122. pinMode(latch, OUTPUT);
  123. pinMode(data, OUTPUT);
  124.  
  125. for (int i=0;i<4;i++)
  126. {
  127. pinMode (push[i], INPUT); // Pengesetan input push button
  128.  
  129. }
  130. pinMode (ledPin,OUTPUT); // Pengesetan LED
  131.  
  132. // Stop interrupts
  133. cli();
  134.  
  135. // Initialize Timer/Counter Register
  136. TCCR1A = 0; // set entire TCCR1A register to 0
  137. TCCR1B = 0; // same for TCCR1B
  138. TCNT1 = 0; //initialize counter value to 0
  139.  
  140. // Turn on CTC mode
  141. TCCR1B |= (1 << WGM12);
  142.  
  143. // Set CS12 and CS10 bits for 1024 prescaler
  144. TCCR1B |= (1 << CS12) | (1 << CS10);
  145.  
  146. // a value of 15624 in a second. By having OCR1A = 15624 / 2 then the interrupt function
  147. OCR1A = 15624 / 2;
  148.  
  149. // Enable timer compare interrupt
  150. TIMSK1 |= (1 << OCIE1A);
  151.  
  152. // Allow interrupts
  153. sei();
  154.  
  155. // SESUAIKAN DENGAN PIN INPUT PADA ARDUINO
  156. DDRB = 0xF0; // PB0 - PB3 sebagai input
  157. PORTB = 0x0F; // Meng-enable internal pullup resistor pada PB0 - PB3
  158. DDRD = 0xFF; // PORTD sebagai output
  159. PORTD = 0xFF; // Inisialisasi PORT D = HIGH
  160. MCUCR = (0 << PUD); // Enable Global Pull-up
  161. }
  162.  
  163. // Prosedur Led On untuk jam digital
  164. void ledOn()
  165. {
  166. digitalWrite(ledPin,HIGH);
  167. }
  168.  
  169. // Prosedur Led oFF`` untuk jam digital
  170. void ledOff()
  171. {
  172. digitalWrite(ledPin,LOW);
  173. }
  174.  
  175. // jam dengan interrupt
  176. ISR(TIMER1_COMPA_vect)
  177. {
  178. halfSecond++;
  179.  
  180. if (halfSecond==1) // Untuk kedipan lampu indikator detik
  181. {
  182. // Untuk mode jam digital led berkedip setiap detik
  183. if (mode==1 && isProgramRun)
  184. {
  185. ledOff();
  186. }
  187. }else if (halfSecond!=1)
  188. {
  189. halfSecond=0;
  190. detik_satuan++;
  191. if (mode==1 && isProgramRun)
  192. {
  193. ledOn();
  194. }
  195. else if (mode==3 && isProgramRun)
  196. {
  197. timer_detikSatuan--;
  198. }
  199. }
  200.  
  201. if (mode==1 || mode==2)
  202. {
  203. if (detik_satuan > 9)
  204. {
  205. detik_satuan = 0;
  206. detik_puluhan++;
  207.  
  208. // nilai detik sudah mencapai 60
  209. if(detik_puluhan > 5 )
  210. {
  211. detik_puluhan = 0;
  212. menit_satuan++;
  213.  
  214. if(menit_satuan > 9)
  215. {
  216. menit_satuan=0;
  217. menit_puluhan++;
  218.  
  219. // nilai menit sudah mencapai 60
  220. if (menit_puluhan > 5)
  221. {
  222. menit_puluhan=0;
  223. jam_satuan++;
  224.  
  225. if(jam_satuan > 9)
  226. {
  227. jam_satuan=0;
  228. jam_puluhan++;
  229.  
  230. // nilai jam mecapai 24
  231. if(jam_puluhan == 2 && jam_satuan== 4)
  232. {
  233. jam_puluhan=0;
  234. jam_satuan=0;
  235. }
  236. }
  237. }
  238. }
  239. }
  240. }
  241. }
  242. }
  243.  
  244. // Inisiasi nilai kontanta sama dengan nol
  245. void init_angka()
  246. {
  247. //inisialisasi nilai detik, menit, jam
  248. detik_satuan=0; detik_puluhan=0;
  249. menit_satuan=0; menit_puluhan=0;
  250. jam_satuan=0; jam_puluhan=0;
  251. }
  252.  
  253. //pengaturan menggunakan push button
  254. void setting_angka ()
  255. {
  256. unsigned char x = 5;
  257. signed char digit1, digit2, digit3, digit4;
  258. unsigned char maksimumDigit1, maksimumDigit2;
  259.  
  260. isProgramRun = false;
  261.  
  262. switch (mode)
  263. {
  264. case 1 : { // Jam Digital
  265. digit1 = jam_puluhan;
  266. digit2 = jam_satuan;
  267. digit3 = menit_puluhan;
  268. digit4 = menit_satuan;
  269. maksimumDigit1 = 2;
  270. maksimumDigit2 = 9;
  271. }
  272. break;
  273. }
  274.  
  275. // Pembacaan tombol mode
  276. if(digitalRead(push[1])==0)
  277. {
  278. delay(200);
  279. x=4;
  280. }
  281.  
  282. // setting menit satuan atau detik satuan
  283. while(x==4)
  284. {
  285. if(digitalRead(push[1])==0) // Tombol select untuk geser digit
  286. {
  287. delay(200);
  288. x=3;
  289. }
  290.  
  291. if (digitalRead(push[2])==0) // Tombol plus
  292. {
  293. delay(200);
  294. digit4++;
  295.  
  296. if(digit4>9)
  297. digit4 = 0;
  298. }
  299.  
  300. if(digitalRead(push[3])==0) // Tombol minus
  301. {
  302. delay(200);
  303. digit4--;
  304.  
  305. if(digit4<0)
  306. digit4=9;
  307. }
  308.  
  309. // Menampilkan digit ke empat
  310. cathode_high(); //black screen
  311. digitalWrite(latch, LOW); //put the shift register to read
  312. shiftOut(data, clk, LSBFIRST, numbers[digit4]); //send the data
  313. digitalWrite(CAS[3], LOW); //turn on the relevent digit
  314. digitalWrite(latch, HIGH); //put the shift register to write mode
  315.  
  316. }
  317.  
  318. // setting menit puluhan
  319. while(x==3)
  320. {
  321. if(digitalRead(push[1])==0) // Tombol select untuk geser digit
  322. {
  323. delay(200);
  324. x=2;
  325. }
  326.  
  327. if (digitalRead(push[2])==0) // Tombol plus
  328. {
  329. delay(200);
  330. digit3++;
  331.  
  332. if(digit3>5)
  333. digit3=0;
  334. }
  335.  
  336. if(digitalRead(push[3])==0) // Tombol minus
  337. {
  338. delay(200);
  339. digit3--;
  340.  
  341. if(digit3<0)
  342. digit3=5;
  343.  
  344. }
  345.  
  346. // Menampilkan digit ketiga
  347. cathode_high(); //black screen
  348. digitalWrite(latch, LOW); //put the shift register to read
  349. shiftOut(data, clk, LSBFIRST, numbers[digit3]); //send the data
  350. digitalWrite(CAS[2], LOW); //turn on the relevent digit
  351. digitalWrite(latch, HIGH); //put the shift register to write mode
  352. }
  353.  
  354. // setting jam satuan
  355. while(x==2)
  356. {
  357. if(digitalRead(push[1])== 0) // Tombol select untuk geser digit
  358. {
  359. delay(200);
  360. x=1;
  361. }
  362.  
  363. if (digitalRead(push[2])==0) // Tombol plus
  364. {
  365. delay(200);
  366. digit2++;
  367.  
  368. if(digit2 > maksimumDigit2)
  369. {
  370. digit2 = 0;
  371. }
  372. }
  373.  
  374. if(digitalRead(push[3])==0) // Tombol minus
  375. {
  376. delay(200);
  377. digit2--;
  378.  
  379. if(digit2 < 0)
  380. {
  381. digit2 = maksimumDigit2;
  382. }
  383. }
  384.  
  385. // Menampilkan digit kedua
  386. cathode_high(); //black screen
  387. digitalWrite(latch, LOW); //put the shift register to read
  388. shiftOut(data, clk, LSBFIRST, numbers[digit2]); //send the data
  389. digitalWrite(CAS[1], LOW); //turn on the relevent digit
  390. digitalWrite(latch, HIGH); //put the shift register to write mode
  391. }
  392.  
  393. // setting jam puluhan
  394. while(x==1)
  395. {
  396. if(digitalRead(push[1])==0) // Tombol select untuk geser digit
  397. {
  398. delay(200);
  399. x=5;
  400. //detik_satuan=0;
  401. //detik_puluhan=0;
  402. }
  403.  
  404. if (digitalRead(push[2])==0) // Tombol plus
  405. {
  406. delay(200);
  407. digit1++;
  408.  
  409. if(digit1 > maksimumDigit1)
  410. {
  411. digit1 = 0;
  412. }
  413. }
  414.  
  415. if(digitalRead(push[3])==0) // Tombol minus
  416. {
  417. delay(200);
  418. digit1--;
  419.  
  420. if(digit1 < 0)
  421. digit1 = maksimumDigit1;
  422. }
  423.  
  424. // Menampilkan digit kesatu
  425. cathode_high(); //black screen
  426. digitalWrite(latch, LOW); //put the shift register to read
  427. shiftOut(data, clk, LSBFIRST, numbers[digit1]); //send the data
  428. digitalWrite(CAS[0], LOW); //turn on the relevent digit
  429. digitalWrite(latch, HIGH); //put the shift register to write mode
  430. }
  431.  
  432. // Mengisi nilai konstanta waktu dengan hasil setting oleh user
  433. if (mode==1)
  434. {
  435. jam_puluhan = digit1;
  436. jam_satuan = digit2;
  437. menit_puluhan = digit3;
  438. menit_satuan = digit4;
  439. detik_puluhan = 0;
  440. detik_satuan = 0;
  441. halfSecond = 0;
  442. }
  443. else if (mode==2)
  444. {
  445. timer_menitPuluhan = digit1;
  446. timer_menitSatuan = digit2;
  447. timer_detikPuluhan = digit3;
  448. timer_detikSatuan = digit4;
  449. halfSecond = 0;
  450. }
  451.  
  452. halfSecond = 0;
  453. }
  454.  
  455. /* Function and Procedure Implementation */
  456. unsigned int scan_keypad(void) {
  457. /* Memeriksa nilai keypad yang ditekan dengan metode scanning,
  458. yaitu dengan melakukan scanning dari tiap kolom dan mencari
  459. nilai low dari masing-masing baris. Nilai low dari lokasi baris
  460. dan kolom tersebut merupakan nilai yang keluarkan dalam fungsi. */
  461.  
  462. // Deklarasi variabel lokal
  463. unsigned int i, j, cek, result;
  464.  
  465. // Inisialisasi variabel
  466. result = 0; // Inisialisasi nilai hasil
  467. i = 0; // Inisialisasi nilai kolom
  468.  
  469. // Scanning Keypad
  470. while (i < 4) { // Ada 4 kolom yang harus di scan
  471. j = 0; // Inisialisasi nilai baris
  472. if (i == 0) {
  473. PORTD = 0xEF; // SESUAIKAN DENGAN PORT OUTPUT YANG DIGUNAKAN
  474. }
  475. else if (i == 1) {
  476. PORTD = 0xDF; // SESUAIKAN DENGAN PORT OUTPUT YANG DIGUNAKAN
  477. }
  478. else if (i == 2) {
  479. PORTD = 0xBF; // SESUAIKAN DENGAN PORT OUTPUT YANG DIGUNAKAN
  480. }
  481. else if (i == 3) {
  482. PORTD = 0x7F; // SESUAIKAN DENGAN PORT OUTPUT YANG DIGUNAKAN
  483. }
  484. while (j < 4) { // Ada 4 baris yang harus di scan
  485. // SEKALI LAGI SESUAIKAN PIN INPUT YANG DIGUNAKAN
  486. if (bit_is_clear(PINB,j)) { // Saat PINB(j) bernilai 0 (PINB initial high karena internall pull-up)
  487. result += (j + (1 + (4 * i))); // Nilai standar keypad dari 0 - 16
  488. i = 4; // Langsung keluar loop
  489. }
  490. j++; // Lanjut ke baris lain jika tidak ditemukan
  491. }
  492. i++;
  493. }
  494.  
  495. // Cek nilai
  496. if (result > 0) { // Apabila result lebih dari nol,
  497. return result;
  498. }
  499. else { // Jika tidak
  500. return 0; // Kembalikan nilai 0
  501. }
  502. }
  503.  
  504. void conv_keypad_int(int masukan) {
  505. /* Mengubah nilai keypad menjadi nilai baris dan kolom untuk dipetakan kepada array keypad_map */
  506. switch (masukan) {
  507. case (1) :
  508. baris = 0;
  509. kolom = 0;
  510. break;
  511. case (2) :
  512. baris = 0;
  513. kolom = 1;
  514. break;
  515. case (3) :
  516. baris = 0;
  517. kolom = 2;
  518. break;
  519. case (4) :
  520. baris = 0;
  521. kolom = 3;
  522. break;
  523. case (5) :
  524. baris = 1;
  525. kolom = 0;
  526. break;
  527. case (6) :
  528. baris = 1;
  529. kolom = 1;
  530. break;
  531. case (7) :
  532. baris = 1;
  533. kolom = 2;
  534. break;
  535. case (8) :
  536. baris = 1;
  537. kolom = 3;
  538. break;
  539. case (9) :
  540. baris = 2;
  541. kolom = 0;
  542. break;
  543. case (10) :
  544. baris = 2;
  545. kolom = 1;
  546. break;
  547. case (11) :
  548. baris = 2;
  549. kolom = 2;
  550. break;
  551. case (12) :
  552. baris = 2;
  553. kolom = 3;
  554. break;
  555. case (13) :
  556. baris = 3;
  557. kolom = 0;
  558. break;
  559. case (14) :
  560. baris = 3;
  561. kolom = 1;
  562. break;
  563. case (15) :
  564. baris = 3;
  565. kolom = 2;
  566. break;
  567. case (16) :
  568. baris = 3;
  569. kolom = 3;
  570. break;
  571. }
  572. }
  573.  
  574. unsigned int clean_keypad() {
  575. /* Menyaring nilai keypad dengan metode polling.
  576. Nilai keluar dari keypad setelah nilai keypad bernilai sama dengan
  577. nilai temp dengan nilai kesamaan lebih dari 90% dengan resolusi 1/100 */
  578.  
  579. // Deklarasi variabel lokal
  580. unsigned int n; // Nilai kesamaan
  581. unsigned int temp; // Variabel sementara nilai scan keypad yang akan dicocokan
  582.  
  583. // Inisialisasi variabel awal
  584. n = 0;
  585. temp = scan_keypad();
  586.  
  587. // Polling nilai scan keypad
  588. while (n < 100) {
  589. if (temp == scan_keypad()) { // Jika sama, nilai kesamaan bertambah satu
  590. n++;
  591. }
  592. else return 0; // Jika tidak sama, keluar dari fungsi dengan mengembalikan nilai 0
  593. }
  594.  
  595. if (n > 90) {
  596. return temp; // Jika nilai kesamaan >90%, keluarkan nilai scan keypad yang benar
  597. }
  598. else return 0;
  599. }
  600.  
  601. void input_bilangan(int* masukan) {
  602. /* Mengambil input dari scanner agar tidak floating */
  603. unsigned int status; // Boolean apakah sudah membaca nilai dari keypad dengan baik atau belum
  604. status = 0;
  605. while (status == 0) {
  606. status = clean_keypad();
  607. int x_sat = x % 10;
  608. int x_pul = (x / 10) % 10;
  609. {
  610. display_number(10, 10, x_pul, x_sat);
  611. }
  612. }
  613. *masukan = status;
  614. return;
  615. }
  616.  
  617. void geser_led (char masukan[]) {
  618. // Menggeser array karakter dari output[1] (urutan ke-2) ke kiri sebesar 1x
  619. unsigned int i = 0;
  620. // Algoritma menggeser
  621. masukan[0] = masukan[1];
  622. return;
  623. }
  624.  
  625. unsigned int conv_string_to_int (char masukan[]) {
  626. /* Mengubah array of char LED menjadi bilangan integer */
  627.  
  628. // Deklarasi variabel
  629. unsigned int i;
  630. unsigned int result;
  631. char temp[2]; // Tempat sementara untuk array of char LED
  632.  
  633. strcpy(temp,masukan);
  634.  
  635. // Menggeser bilangan menuju paling kiri bila bilangan kurang dari 4 digit
  636. while (temp[0] == 'X') {
  637. temp[0] = temp[1];
  638. temp[1] = 'X';
  639. }
  640.  
  641. // Mengganti karakter 'X' menjadi '\0' (karakter null) agar bisa dibaca oleh
  642. // fungsi atoi
  643. for (i = 0;i < 2;i++) {
  644. if ((temp[i] != '1') && (temp[i] != '2') && (temp[i] != '3') && (temp[i] != '4') && (temp[i] != '5') && (temp[i] != '6') && (temp[i] != '7') && (temp[i] != '8') && (temp[i] != '9') && (temp[i] != '0')) {
  645. temp[i] = '\0';
  646. }
  647. }
  648.  
  649. // Meengembalikan hasil
  650. result = atoi(temp);
  651. return result;
  652. }
  653.  
  654. unsigned int input_variabel() {
  655. /* Mengambil input dari keypad hingga diberi tanda untuk memasukkan
  656. bilangan ke memory */
  657. char bilangan[2];
  658. unsigned int keypad;
  659.  
  660. // Jika tombol bukan *, lakukan input kembali
  661. strcpy(bilangan,"XX");
  662. // Output LED terkini
  663. Serial.println(bilangan); // RUBAH BAGIAN INI UNTUK OUTPUT
  664.  
  665.  
  666. input_bilangan(&keypad); // Input keypad
  667. while ((keypad != 15)) {
  668. conv_keypad_int(keypad); // mengubah nilai keypad menjadi nilai baris dan kolom
  669. geser_led(bilangan); // Menggeser output ke kiri sebesar 1x agar dapat dimasukkan input bilangan kembali
  670. bilangan[1] = keypad_map_char[baris][kolom]; // Memasukkan karakter angka ke array paling kiri
  671. Serial.println(bilangan); // RUBAH BAGIAN INI UNTUK OUTPUT
  672. _delay_ms(100);
  673. input_bilangan(&keypad);
  674. _delay_ms(100);
  675.  
  676. }
  677.  
  678. // Mengembalikan hasil input bilangan
  679. return conv_string_to_int(bilangan);
  680. }
  681.  
  682. char input_operator() {
  683. /* Melakukan input karakter operator dengan langkah yang sama dengan input variabel */
  684. char character = '?';
  685. char temp;
  686. unsigned int keypad;
  687.  
  688. Serial.println(character); // RUBAH BAGIAN INI UNTUK OUTPUT
  689. input_bilangan(&keypad); // Input operator pertama kali
  690.  
  691. while ((keypad != 15))
  692. {
  693. conv_keypad_int(keypad); // Mendapatkan nilai baris dan kolom
  694. character = keypad_map_char[baris][kolom]; // Memetakan menjadi karakter
  695. temp = keypad_map_char[baris][kolom]; // Disimpan ke variabel sementara
  696. Serial.println(character); // RUBAH BAGIAN INI UNTUK OUTPUT
  697. _delay_ms(100);
  698. input_bilangan(&keypad);
  699. _delay_ms(100);
  700. }
  701.  
  702. // Jika telah ditekan '#' / Enter, kembalikan operator yang telah disimpan sebelumnya
  703. if (keypad == 15) {
  704. return temp;
  705. }
  706. }
  707.  
  708. void input_kalkulator() {
  709. /* Prosedur untuk menginput bilangan dan operator pada kalkulator */
  710. Serial.print("OP"); // SESUAIKAN DENGAN OUTPUT 7-SEGMENT
  711. op = input_operator();
  712. _delay_ms(100);
  713.  
  714. Serial.print("A="); // SESUAIKAN DENGAN OUTPUT 7-SEGMENT
  715. x = input_variabel();
  716. y = x;
  717.  
  718. Serial.print("B="); // SESUAIKAN DENGAN OUTPUT 7-SEGMENT
  719. x = input_variabel();
  720. delay(100);
  721. }
  722.  
  723. unsigned int kalkulasi() {
  724. // Operasi kalkulasi bilangan operand dengan pilihan operator
  725. if (op == '+') {
  726. return x+y;
  727. }
  728. else if (op == '-') {
  729. return x-y;
  730. }
  731. else if (op == 'X') {
  732. return x*y;
  733. }
  734. else if (op == '/') {
  735. return x/y;
  736. }
  737. else return 0;
  738. }
  739.  
  740. // Menampilakn angka pada 7-segment
  741. void display_number(int a, int b, int c, int d) { //scanning
  742.  
  743. cathode_high(); //black screen
  744. digitalWrite(latch, LOW); //put the shift register to read
  745. shiftOut(data, clk, LSBFIRST, numbers[a]); //send the data
  746. digitalWrite(CAS[0], LOW); //turn on the relevent digit
  747. digitalWrite(latch, HIGH); //put the shift register to write mode
  748. delay(5);
  749.  
  750. cathode_high(); //black screen
  751. digitalWrite(latch, LOW); //put the shift register to read
  752. shiftOut(data, clk, LSBFIRST, numbers[b]); //send the data
  753. digitalWrite(CAS[1], LOW); //turn on the relevent digit
  754. digitalWrite(latch, HIGH); //put the shift register to write mode
  755. delay(5);
  756.  
  757. cathode_high(); //black screen
  758. digitalWrite(latch, LOW); //put the shift register to read
  759. shiftOut(data, clk, LSBFIRST, numbers[c]); //send the data
  760. digitalWrite(CAS[2], LOW); //turn on the relevent digit
  761. digitalWrite(latch, HIGH); //put the shift register to write mode
  762. delay(5);
  763.  
  764. cathode_high(); //black screen
  765. digitalWrite(latch, LOW); //put the shift register to read
  766. shiftOut(data, clk, LSBFIRST, numbers[d]); //send the data
  767. digitalWrite(CAS[3], LOW); //turn on the relevent digit
  768. digitalWrite(latch, HIGH); //put the shift register to write mode
  769. delay(5);
  770. }
  771.  
  772. void cathode_high() { //turn off all 4 digits
  773. digitalWrite(CA_1, HIGH);
  774. digitalWrite(CA_2, HIGH);
  775. digitalWrite(CA_3, HIGH);
  776. digitalWrite(CA_4, HIGH);
  777. }
  778.  
  779. // Program cek mode (1. Jam Digital, 2. Calculator)
  780. void cekMode()
  781. {
  782. startJam = true;
  783. startCalculator = true;
  784. isProgramRun = false;
  785. ledOff();
  786.  
  787. // Looping hingga dipilih mode dengan menekan tombol select
  788. while (!select)
  789. {
  790. display_number(10, 10, 10, mode);
  791. if (digitalRead(push[0])==0)
  792. {
  793. delay(150);
  794. mode++;
  795. if (mode>3)
  796. {
  797. mode=1;
  798. }
  799. }
  800. // Jika ditekan select maka akan keluar loop
  801. if (digitalRead(push[1])==0)
  802. {
  803. select = true;
  804. }
  805. }
  806. }
  807.  
  808. // Program Running dari setiap mode yang dipilih
  809. void runningProgram()
  810. {
  811. switch (mode)
  812. {
  813. case 1 : { // Set Jam
  814. init_angka();
  815. setting_angka();
  816. isProgramRun = true;
  817.  
  818. }
  819. break;
  820. case 2 : {
  821. // Jam Digital
  822.  
  823. isProgramRun = true;
  824. while (startJam)
  825. {
  826. if (jam_puluhan==2 && jam_satuan>3)
  827. {
  828. init_angka();
  829. }
  830. display_number(jam_puluhan, jam_satuan, menit_puluhan, menit_satuan);
  831. if (digitalRead(push[1]) == 0)
  832. {
  833.  
  834. isProgramRun = true;
  835. }
  836. if (digitalRead(push[0]) == 0)
  837. {
  838. startJam = false;
  839. }
  840. }
  841. }
  842. break;
  843. case 3 : {// Calculator
  844. isProgramRun = true;
  845. while (startCalculator)
  846. {// jalankan input kalkulator
  847. input_kalkulator();
  848. // Lakukan kalkulasi kalkulator dan simpan hasilnya pada input
  849. result = kalkulasi();
  850. // Display pada Serial monitor / 7-segment (SESUAIKAN BAGIAN INI)
  851.  
  852. Serial.print(x);
  853. Serial.print(op);
  854. Serial.print(y);
  855. Serial.print("=");
  856. Serial.println(result);
  857.  
  858. int r_sat = result % 10;
  859. int r_pul = (result / 10) % 10;
  860. int r_rat = (result / 100) % 10;
  861. int r_rib = (result / 1000) % 10;
  862.  
  863. while(digitalRead(push[0]) != 0)
  864. {
  865. display_number(r_rib, r_rat, r_pul, r_sat);
  866. }
  867. if (digitalRead(push[1]) == 0)
  868. {
  869.  
  870. isProgramRun = true;
  871. }
  872. if (digitalRead(push[0]) == 0)
  873. {
  874. startJam = false;
  875. }
  876. }
  877. }
  878. break;
  879. }
  880.  
  881. select = false;
  882. }
  883.  
  884. // Program Utama
  885. void loop()
  886. {
  887. cekMode();
  888. runningProgram();
  889. }
Add Comment
Please, Sign In to add comment