Guest User

Untitled

a guest
Mar 21st, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.96 KB | None | 0 0
  1. //jam_digital.c
  2. //program jam digital menggunakan ATMega328 board arduino uno
  3. //23 Februari 2018
  4. //Muhammad Fithratur Rahman 13215005
  5. //Sayyid Irsyadul Ibad 13215068
  6.  
  7. #include <avr/io.h>
  8. #include <util/delay.h>
  9. #include <avr/interrupt.h>
  10.  
  11. int N; // variabel pengatur clock
  12. int A,B,C,D;
  13. int portd_1_int, portd_2_int, portd_3_int, portd_4_int;
  14. int portb_1, portb_2, portb_3, portb_4, portd_1, portd_2, portd_3, portd_4;
  15. int jam_puluhan;
  16. int jam_satuan;
  17. int menit_puluhan;
  18. int menit_satuan;
  19. int detik_puluhan;
  20. int detik_satuan;
  21.  
  22. ///////////////////////////////////////////////////////////////////////
  23. ///////////////////// START MAIN PROGRAM //////////////////////////////
  24. ///////////////////////////////////////////////////////////////////////
  25.  
  26. int main () {
  27.  
  28. int mode_main = 0;
  29.  
  30. // setting mode timer dan nilai awalnya
  31. TCCR1B |= (1<<CS02|(1<<CS00)); //inisialisasi timer 0
  32. TIMSK1 |=(1<<TOIE0);
  33. TCNT1 = 0x48E5; //initial of timer 0
  34. // setting mode interupsi
  35. EIMSK = 0x00;
  36. EIFR = 0x01;
  37. EICRA = 0x02;
  38. // setting port yang akan digunakan sebagai i/o
  39. DDRB = 0xFF;
  40. DDRD = 0xFF;
  41. DDRC = 0b000011;
  42. PORTC = 0xFF ;
  43. // enable global interrupt
  44. sei ();
  45. N = 0;
  46.  
  47. portd_1 = 0b00000001;
  48. portd_2 = 0b00000001;
  49. portd_3 = 0b00000001;
  50. portd_4 = 0b00000001;
  51. portb_1 = 0b00100011;
  52. portb_2 = 0b00010011;
  53. portb_3 = 0b00001011;
  54. portb_4 = 0b00000111;
  55.  
  56. while (1) {
  57. _delay_ms (1);
  58. PORTD = portd_1;
  59. PORTB = portb_1;
  60. _delay_ms (1);
  61. PORTD = portd_2;
  62. PORTB = portb_2;
  63. _delay_ms (1);
  64. PORTD = portd_3;
  65. PORTB = portb_3;
  66. _delay_ms (1);
  67. PORTD = portd_4;
  68. PORTB = portb_4;
  69.  
  70. mode_main = keypad(mode_main);
  71.  
  72. if (mode_main == 1) {
  73. setting (mode_main);
  74. }
  75.  
  76. if (mode_main == 2) {
  77. setting (mode_main);
  78. }
  79.  
  80.  
  81. } //nutup while (1)
  82.  
  83. return 0;
  84. }
  85.  
  86. ///////////////////////////////////////////////////////////////////////
  87. ///////////////////// END MAIN PROGRAM ////////////////////////////////
  88. ///////////////////////////////////////////////////////////////////////
  89.  
  90.  
  91. // program ISR untuk perhitungan jam
  92. // setiap satu detik masuk ISR dan digit menit bertambah satu
  93.  
  94. ISR(TIMER1_OVF_vect) {
  95. N++;
  96. if (N==20) {
  97. portd_1_int = converter(portd_1);
  98. portd_2_int = converter(portd_2);
  99. portd_3_int = converter(portd_3);
  100. portd_4_int = converter(portd_4);
  101. menit_satuan = portd_1_int + 1;
  102. menit_puluhan = portd_2_int;
  103. jam_satuan = portd_3_int;
  104. jam_puluhan = portd_4_int;
  105.  
  106. //--------------------------------------------------
  107. if (detik_satuan == 10) {
  108. if (detik_puluhan == 5) {
  109. detik_puluhan = 0;
  110. menit_satuan += 1;
  111. }
  112. else {
  113. detik_puluhan += 1;
  114. }
  115. detik_satuan = 0;
  116. }
  117.  
  118. if (menit_satuan == 10) {
  119. if (menit_puluhan == 5) {
  120. menit_puluhan = 0;
  121. jam_satuan += 1;
  122. }
  123. else {
  124. menit_puluhan += 1;
  125. }
  126. menit_satuan = 0;
  127. }
  128.  
  129. if (jam_satuan == 10) {
  130. jam_puluhan += 1;
  131. jam_satuan = 0;
  132. }
  133.  
  134. if ((jam_satuan == 4) && (jam_puluhan == 2)) {
  135. jam_puluhan = 0;
  136. jam_satuan = 0;
  137. }
  138. //--------------------------------------------------------
  139. portd_1 = DtoNB (menit_satuan);
  140. portd_2 = DtoNB (menit_puluhan);
  141. portd_3 = DtoNB (jam_satuan);
  142. portd_4 = DtoNB (jam_puluhan);
  143. N = 0;
  144. }
  145. TCNT1 = 0x48E5;
  146. }
  147.  
  148. // END PROGRAM ISR
  149. ///////////////////
  150.  
  151. // fungsi converter hexadecimal to decimal
  152. int converter (int toconvert) {
  153.  
  154. int converted;
  155. if (toconvert == 0b10011011) {
  156. converted = 1;
  157. }
  158. else if (toconvert == 0b00100010) {
  159. converted = 2;
  160. }
  161. else if (toconvert == 0b00000001) {
  162. converted = 0;
  163. }
  164. else if (toconvert == 0b00001010) {
  165. converted = 3;
  166. }
  167. else if (toconvert == 0b10011000) {
  168. converted = 4;
  169. }
  170. else if (toconvert == 0b01001000) {
  171. converted = 5;
  172. }
  173. else if (toconvert == 0b01000000) {
  174. converted = 6;
  175. }
  176. else if (toconvert == 0b00011011) {
  177. converted = 7;
  178. }
  179. else if (toconvert == 0b00000000) {
  180. converted = 8;
  181. }
  182. else if (toconvert == 0b00001000) {
  183. converted = 9;
  184. }
  185. else {
  186. converted = 10;
  187. }
  188. return (converted);
  189. }
  190.  
  191. // fungsi converter decimal to hexadecimal
  192. int DtoNB(int angka)
  193. {
  194. int x;
  195. if (angka==1)
  196. x= 0b10011011;
  197. else if (angka==2)
  198. x=0b00100010;
  199. else if (angka==3)
  200. x=0b00001010;
  201. else if (angka==4)
  202. x=0b10011000;
  203. else if (angka==5)
  204. x=0b01001000;
  205. else if (angka==6)
  206. x=0b01000000;
  207. else if (angka==7)
  208. x=0b00011011;
  209. else if (angka==8)
  210. x=0b00000000;
  211. else if (angka==9)
  212. x=0b00001000;
  213. else if (angka ==0)
  214. x=0b00000001;
  215. else
  216. x=0b00000001;
  217. return x;
  218. }
  219.  
  220. // fungsi pembaca nilai keypad
  221. // keypad yang mungkin terbaca * atau #
  222. // * menambah mode 1
  223. // # menambah mode 2
  224. int keypad (int mode_keypad) {
  225. int mode;
  226. mode = mode_keypad;
  227.  
  228. // membaca input *
  229. PORTC &=~ (1<<PC1);
  230. if (not(PINC &= (1<<2)));
  231. if(not(PINC &= (1<<2))){
  232. _delay_ms (500);
  233. mode += 1;
  234. if (mode>1) {
  235. mode = 0;
  236. }
  237. }
  238. PORTC |= (1<<PC1);
  239.  
  240. // membaca input #
  241. PORTC &=~ (1<<PC1);
  242. if (not(PINC &= (1<<4)));
  243. if (not(PINC &= (1<<4))) {
  244. _delay_ms (500);
  245. mode += 2;
  246. if (mode>2) {
  247. mode = 0;
  248. }
  249. }
  250. PORTC |= (1<<PC1);
  251.  
  252. return(mode);
  253. }
  254.  
  255. void setting (int mode_setting) {
  256. // Pada Prosedur ini mode masuk dengan bernilai 1 atau 2
  257. // Pada keluar prosedur mode akan bernilai 0
  258. // Ada dua while untuk masing-masing mode
  259. int input_operasi(int op_before);
  260.  
  261. while (mode_setting == 1) {
  262.  
  263. _delay_ms (10);
  264. PORTD = portd_1;
  265. PORTB = portb_1;
  266. _delay_ms (10);
  267. PORTD = portd_2;
  268. PORTB = portb_2;
  269. _delay_ms (10);
  270. PORTD = portd_3;
  271. PORTB = portb_3;
  272. _delay_ms (10);
  273. PORTD = portd_4;
  274. PORTB = portb_4;
  275.  
  276. PORTB &= 0b11111110;
  277. if (not(PINC &= (1<<5)));
  278. else if(not(PINC &= (1<<5))){
  279. portd_4_int = converter(portd_4);
  280. D = portd_4_int + 1;
  281. if (D >2) {
  282. D=0;
  283. }
  284. portd_4 = DtoNB (D);
  285. _delay_ms (200);
  286. }
  287. PORTB |= 0b00000001;
  288.  
  289. PORTB &= 0b11111101;
  290. if (not(PINC &= (1<<5)));
  291. else if(not(PINC &= (1<<5))){
  292. portd_3_int = converter(portd_3);
  293. C = portd_3_int + 1;
  294. if (D==2) {
  295. if (C>3) {
  296. C=0;
  297. }
  298. }
  299. portd_3 = DtoNB (C);
  300. _delay_ms (200);
  301. }
  302. PORTB |= 0b00000010;
  303.  
  304. PORTC &= 0b11111110;
  305. if (not(PINC &= (1<<5)));
  306. else if(not(PINC &= (1<<5))){
  307. portd_2_int = converter(portd_2);
  308. B = portd_2_int + 1;
  309. if (B>5) {
  310. B =0;
  311. }
  312. portd_2 = DtoNB (B);
  313. _delay_ms (200);
  314. }
  315. PORTC |= 0b00000001;
  316.  
  317. PORTC &= 0b11111101;
  318. if (not(PINC &= (1<<5)));
  319. else if(not(PINC &= (1<<5))){
  320. portd_1_int = converter(portd_1);
  321. A = portd_1_int + 1;
  322. portd_1 = DtoNB (A);
  323. _delay_ms (200);
  324. }
  325. PORTC |= 0b00000010;
  326.  
  327. mode_setting = keypad (mode_setting);
  328. } // END WHILE (MODE SETTING == 1)
  329.  
  330. //pengenalan variabel untuk kalkulator
  331. int num_1, num_2, result;
  332. int num_1_1 =0;
  333. int num_1_2 =0;
  334. int num_2_1 =0;
  335. int num_2_2 =0;
  336. int take_time = 0;
  337. int operasi;
  338.  
  339. while (mode_setting == 2) {
  340.  
  341.  
  342. PORTD = 0b10000001;
  343. PORTB = portb_1;
  344. _delay_ms (200);
  345. PORTD = 0b10000001;
  346. PORTB = portb_2;
  347. _delay_ms (200);
  348. PORTD = 0b10000001;
  349. PORTB = portb_3;
  350. _delay_ms (200);
  351. PORTD = 0b10000001;
  352. PORTB = portb_4;
  353. _delay_ms (200);
  354.  
  355. while (take_time == 0) {
  356. int buff;
  357. // pengambilan nilai variabel pertama
  358. // pengisian digit pertama
  359. buff = 0;
  360. while (buff==0){
  361. num_1_1 = input_num (num_1_1);
  362. PORTC &= 0b11111101;
  363. if (not(PINC &= (1<<5)));
  364. else if(not(PINC &= (1<<5))){
  365. buff = 1;
  366. _delay_ms (200);
  367. }
  368. PORTC |= 0b00000010;
  369.  
  370. PORTD = DtoNB (num_1_1);
  371. PORTB = 0b00000111;
  372. _delay_ms (5);
  373. }
  374.  
  375.  
  376. //pengisian digit kedua
  377. buff = 0;
  378. while (buff==0){
  379. num_1_2 = input_num (num_1_2);
  380. PORTC &= 0b11111101;
  381. if (not(PINC &= (1<<5)));
  382. else if(not(PINC &= (1<<5))){
  383. buff = 1;
  384. _delay_ms (200);
  385. }
  386. PORTC |= 0b00000010;
  387. PORTD = DtoNB (num_1_2);
  388. PORTB = 0b00001011;
  389. _delay_ms (5);
  390. PORTD = DtoNB (num_1_1);
  391. PORTB = 0b00000111;
  392. _delay_ms (5);
  393. }
  394.  
  395. num_1 = num_1_1*10 + num_1_2;
  396. // pengambilan operasi hitung
  397. operasi = C;
  398. buff = 0;
  399. while (buff==0){
  400. operasi = input_operasi(operasi);
  401. PORTC &= 0b11111101;
  402. if (not(PINC &= (1<<5)));
  403. else if(not(PINC &= (1<<5))){
  404. buff = 1;
  405. _delay_ms (200);
  406. }
  407. PORTC |= 0b00000010;
  408.  
  409. //hingga pengambilan operasi selesai dilakukan, menampilkan semua angka
  410.  
  411. PORTD = DtoNB (num_1_1);
  412. PORTB = 0b00000111;
  413. _delay_ms (10);
  414.  
  415. PORTD = DtoNB (num_1_2);
  416. PORTB = 0b00001011;
  417. _delay_ms (10);
  418.  
  419. PORTD = DtoNB (num_2_1);
  420. PORTB = 0b00010011;
  421. _delay_ms (10);
  422.  
  423. PORTD = DtoNB (num_2_2);
  424. PORTB = 0b00100011;
  425. _delay_ms (10);
  426. }
  427.  
  428. // pengambilan nilai variabel kedua
  429. //pengisian digit pertama
  430. buff = 0;
  431. while (buff==0){
  432. num_2_1 = input_num (num_2_1);
  433. PORTC &= 0b11111101;
  434. if (not(PINC &= (1<<5)));
  435. else if(not(PINC &= (1<<5))){
  436. buff = 1;
  437. _delay_ms (200);
  438. }
  439. PORTC |= 0b00000010;
  440. PORTD = DtoNB (num_2_1);
  441. PORTB = 0b00010011;
  442. _delay_ms (5);
  443. }
  444.  
  445. //pengisian digit kedua
  446. buff = 0;
  447. while (buff==0){
  448. num_2_2 = input_num (num_2_2);
  449. PORTC &= 0b11111101;
  450. if (not(PINC &= (1<<5)));
  451. else if(not(PINC &= (1<<5))){
  452. buff = 1;
  453. _delay_ms (200);
  454. }
  455. PORTD = DtoNB (num_2_1);
  456. PORTB = 0b00010011;
  457. _delay_ms (5);
  458. PORTC |= 0b00000010;
  459. PORTD = DtoNB (num_2_2);
  460. PORTB = 0b00100011;
  461. _delay_ms (5);
  462. }
  463.  
  464. num_2 = num_2_1*10 + num_2_2;
  465.  
  466.  
  467. //operasi hitung
  468. if (operasi == 1) {
  469. result = num_1 + num_2; }
  470. else if (operasi == 2) {
  471. if (num_1 >= num_2) {
  472. result = num_1 - num_2;}
  473. else if (num_2 > num_1) {
  474. result = num_2 - num_1;
  475. }
  476. }
  477. else if (operasi == 3) {
  478. result = num_1 * num_2; }
  479.  
  480. //display hasil
  481. int wait = 0;
  482. while (1) {
  483. display_num (result);
  484. if ((operasi == 2) && (num_2 > num_1)) {
  485. PORTD |= 0b00000100;
  486. }
  487. _delay_ms (10);
  488. PORTC &= 0b11111101;
  489. if (not(PINC &= (1<<5)));
  490. else if(not(PINC &= (1<<5))){
  491. break;
  492. }
  493. PORTC |= 0b00000010;
  494. }
  495.  
  496. PORTC |= 0b00000010;
  497. take_time += 1;
  498. }
  499.  
  500. PORTC &= 0b11111101;
  501. if (not(PINC &= (1<<5)));
  502. else if(not(PINC &= (1<<5))){
  503. take_time -= 1;
  504. }
  505. PORTC |= 0b00000010;
  506.  
  507. // pengecekan apakah ada perubahan mode
  508. mode_setting = keypad (mode_setting);
  509.  
  510. }
  511.  
  512. }
  513.  
  514.  
  515. void display_num (int number) {
  516.  
  517. // deklarasi variabel prosedur display
  518. int digit_1,digit_2,digit_3,digit_4;
  519.  
  520. // pengambilan nilai per digit
  521. digit_1 = number/1000;
  522. digit_2 = number/100 - (number/1000)*10;
  523. digit_3 = number/10 - (number/100)*10;
  524. digit_4 = number - (number/10)*10;
  525.  
  526. // menampilkan pada seven segment
  527. _delay_ms (10);
  528. PORTD = DtoNB (digit_4);
  529. PORTB = portb_1;
  530. _delay_ms (10);
  531. PORTD = DtoNB (digit_3);
  532. PORTB = portb_2;
  533. _delay_ms (10);
  534. PORTD = DtoNB (digit_2);
  535. PORTB = portb_3;
  536. _delay_ms (10);
  537. PORTD = DtoNB (digit_1);
  538. PORTB = portb_4;
  539.  
  540. }
  541.  
  542. int input_num (int num_before) {
  543. int num;
  544. int buff=0;
  545.  
  546.  
  547. PORTB &= 0b11111110;
  548. if(not(PINC &= (1<<2)));
  549. else if(not(PINC &= (1<<2))){
  550. num = 1;
  551. }
  552. else if(not(PINC &= (1<<3))){
  553. num = 2;
  554. }
  555. else if(not(PINC &= (1<<4))){
  556. num = 3;
  557. }
  558. PORTB |= 0b00000001;
  559.  
  560. PORTB &= 0b11111101;
  561. if(not(PINC &= (1<<2)));
  562. else if(not(PINC &= (1<<2))){
  563. num = 4;
  564. }
  565. else if(not(PINC &= (1<<3))){
  566. num = 5;
  567. }
  568. else if(not(PINC &= (1<<4))){
  569. num = 6;
  570. }
  571. PORTB |= 0b00000010;
  572.  
  573. PORTC &= 0b11111110;
  574. if(not(PINC &= (1<<2)));
  575. else if(not(PINC &= (1<<2))){
  576. num = 7;
  577. }
  578. else if(not(PINC &= (1<<3))){
  579. num = 8;
  580. }
  581. else if(not(PINC &= (1<<4))){
  582. num = 9;
  583. }
  584. PORTC |= 0b00000001;
  585.  
  586. PORTC &= 0b11111101;
  587. if(not(PINC &= (1<<3)));
  588. else if(not(PINC &= (1<<3))){
  589. num = 0;
  590. }
  591. PORTC |= 0b00000010;
  592.  
  593. return (num);
  594. }
  595.  
  596. int input_operasi (int op_before) {
  597. int op; //variabel penyimpan operasi
  598. // bisa A, B, atau C
  599. op = op_before;
  600.  
  601. PORTB &= 0b11111110;
  602. if (not(PINC &= (1<<5)));
  603. else if(not(PINC &= (1<<5))){
  604. op = 1;
  605. _delay_ms (200);
  606. }
  607. PORTB |= 0b00000001;
  608.  
  609. PORTB &= 0b11111101;
  610. if (not(PINC &= (1<<5)));
  611. else if(not(PINC &= (1<<5))){
  612. op = 2;
  613. _delay_ms (200);
  614. }
  615. PORTB |= 0b00000010;
  616.  
  617. PORTC &= 0b11111110;
  618. if (not(PINC &= (1<<5)));
  619. else if(not(PINC &= (1<<5))){
  620. op = 3;
  621. _delay_ms (200);
  622. }
  623. PORTC |= 0b00000001;
  624.  
  625. return (op);
  626. }
  627.  
  628. void buff_d () {
  629. int buff = 0;
  630. while (buff == 0) {
  631. PORTC &= 0b11111101;
  632. if (not(PINC &= (1<<5)));
  633. else if(not(PINC &= (1<<5))){
  634. buff = 1;
  635. _delay_ms (400);
  636. }
  637. PORTC |= 0b00000010;
  638. }
  639. }
Add Comment
Please, Sign In to add comment