Advertisement
Guest User

Untitled

a guest
Nov 20th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.92 KB | None | 0 0
  1. /**************************************/
  2. /* ARE 2008 */
  3. /* e-mail: biuro@are.net.pl */
  4. /* www : are.net.pl */
  5. /**************************************/
  6.  
  7. #define F_CPU 1000000UL // 1 MHz
  8. //#define F_CPU 14.7456E6
  9.  
  10.  
  11.  
  12. #include <avr/io.h>
  13. #include <util/delay.h>
  14. #include <inttypes.h>
  15.  
  16. uint16_t count[3];
  17. uint8_t state[2];
  18. uint8_t dot; // wasted 7 bits
  19.  
  20. void inic(void);
  21. uint8_t sseg(uint8_t);
  22. void disp_n(uint16_t);
  23. void disp(uint8_t, uint8_t);
  24. uint8_t button(volatile uint8_t *, uint8_t);
  25.  
  26. int main(void) {
  27.  
  28. inic();
  29.  
  30. uint8_t i,j,k;
  31. j=0;k=0;state[1]=0;state[1]=0;dot=0;
  32.  
  33. while (j<2) {
  34. disp_n(count[j]); // display curent number
  35.  
  36. for (i=0;i<8;i++) // try to read number
  37. if ( (button( &PINA, i)) && k<4 ) {
  38. count[j]= (count[j] * 10) + i;
  39. k++;
  40. }
  41. for (i=0;i<8;i++) // try to read operation
  42. if (button( &PIND, i)) {
  43. if (!j) count[2]=i;
  44. j++;k=0;
  45. }
  46. }
  47.  
  48. // exec. statement
  49. j=count[2];
  50. switch(j) {
  51. case 0: // +
  52. count[2]=count[0]+count[1];
  53. break;
  54. case 1: // -
  55. count[2]=count[0]-count[1];
  56. break;
  57. case 2: // *
  58. count[2]=count[0]*count[1];
  59. break;
  60. case 3: // /
  61. count[2]=(count[0]*10)/count[1];
  62. if (count[2] & 1)
  63. dot=1;
  64. else
  65. count[2]/=10;
  66. break;
  67. case 4: // exp( num1, num2)
  68. if (count[0]==0)
  69. count[2]=0;
  70. else if (count[1]==0)
  71. count[2]=1;
  72. else {
  73. count[2]=count[0];
  74. for (i=0;i<count[1]-1;i++) count[2]*=count[0];
  75. }
  76. break;
  77. }
  78.  
  79. //display result
  80. while(1) disp_n(count[2]);
  81.  
  82. return 0;
  83. }
  84. uint8_t button(volatile uint8_t *port, uint8_t pin) {
  85. uint8_t i = 1;
  86. if (*port == PINA) i=0;
  87. if (*port & (1 << pin )) {
  88. if (!(state[i] & (1 << pin))) {
  89. _delay_ms(10);
  90. if (*port & (1 << pin )) {
  91. state[i] |= (1 << pin);
  92. return 1;
  93. }
  94. }
  95. } else
  96. state[i] &= ~(1 << pin);
  97. return 0;
  98. }
  99. void inic(void) {
  100. /* port initialization*/
  101. DDRA = 0x00;
  102. DDRB = 0xff;
  103. DDRC = 0xff;
  104. DDRD = 0x00;
  105. PORTA = 0xff;
  106. PORTD = 0xff;
  107. PORTB = 0;
  108. PORTC = 0;
  109. }
  110. uint8_t sseg(uint8_t sseg_x) {
  111. /* converts uint8_t to 7seg code */
  112. switch(sseg_x) {
  113. case 0 : return 0x3F;
  114. case 1 : return 0x06;
  115. case 2 : return 0x5B;
  116. case 3 : return 0x4F;
  117. case 4 : return 0x66;
  118. case 5 : return 0x6D;
  119. case 6 : return 0x7D;
  120. case 7 : return 0x07;
  121. case 8 : return 0x7F;
  122. case 9 : return 0x6F;
  123. default: return 0xAA;
  124. }
  125. return 0xAA;
  126. }
  127. void disp_n(uint16_t num) {
  128. /* display uint8_t on 4 7seg displays */
  129. uint8_t i,led[4];
  130. if (num <= 9999) {
  131. led[3]=num/1000;
  132. led[2]=(num%1000)/100;
  133. led[1]=(num%100)/10;
  134. led[0]=num%10;
  135. } else for (i=0;i<4;i++)
  136. disp(i,10);
  137. for (i=0;i<4;i++)
  138. disp(i,led[i]);
  139. }
  140. void disp(uint8_t led, uint8_t num) {
  141. /* display single number on 7seg display */
  142. PORTB = 1 << led;
  143. PORTC = sseg(num);
  144. if (dot && led == 1) PORTC |= 0x80;
  145. _delay_ms(10);
  146. PORTC = 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement