Advertisement
Guest User

Untitled

a guest
Jan 20th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4.  
  5.  
  6. #define clockPin PD2 // Тактовый вход
  7. #define latchPin PD3 // Защелка
  8. #define dataPin PD4 // Данные
  9.  
  10. enum segments { DP, G, F, E, D, C, B, A };
  11.  
  12. #define zero (1<<G)|(1<<DP)
  13. #define one (1<<A)|(1<<D)|(1<<E)|(1<<F)|(1<<G)|(1<<DP)
  14. #define two (1<<C)|(1<<F)|(1<<DP)
  15. #define three (1<<E)|(1<<F)|(1<<DP)
  16. #define four (1<<A)|(1<<D)|(1<<E)|(1<<DP)
  17. #define five (1<<B)|(1<<E)|(1<<DP)
  18. #define six (1<<B)|(1<<DP)
  19. #define seven (1<<D)|(1<<E)|(1<<F)|(1<<G)|(1<<DP)
  20. #define eight (1<<DP)
  21. #define nine (1<<E)|(1<<DP)
  22.  
  23. uint8_t numbers[] = { zero, one, two, three, four, five, six, seven, eight, nine };
  24. uint8_t digits[] = { 0b10000000, 0b01000000, 0b00100000, 0b00010000 };
  25.  
  26. uint8_t csec = 0;
  27. uint8_t sec = 0;
  28. uint8_t min = 0;
  29. uint8_t lastdigit = 0;
  30.  
  31. void begin_shift();
  32. void end_shift();
  33. void shift(uint8_t data);
  34. void drawtime();
  35. void drawdigit(uint8_t digit, uint8_t num);
  36. void drawdigit(uint8_t digit, uint8_t num,bool dot);
  37.  
  38.  
  39. int main(void)
  40. {
  41. // Конфигурируем пины в состояние Output
  42. DDRD = (1<<clockPin) | (1<<latchPin) | (1<<dataPin);
  43.  
  44.  
  45. TIMSK1 = (1<<OCIE1A);
  46. TCCR1B = (1<<CS10)|(1<<CS12)|(1<<WGM12);
  47. OCR1A = F_CPU/1024/200;
  48.  
  49. sei();
  50.  
  51. while (1)
  52. {
  53. if (sec == 59 && min == 59 && csec == 99)
  54. {
  55. sec = 0, min = 0;
  56. }
  57. if (csec == 99)
  58. {
  59. csec = 0;
  60. if (sec == 59)
  61. {
  62. sec = 0;
  63. ++min;
  64. }
  65. else
  66. {
  67. ++sec;
  68. }
  69. }
  70. ++csec;
  71. _delay_ms(10);
  72. }
  73. }
  74.  
  75. ISR(TIMER1_COMPA_vect)
  76. {
  77. drawtime();
  78. }
  79.  
  80. void drawtime()
  81. {
  82. if (lastdigit == 0)
  83. {
  84. drawdigit(1, sec / 10, false);
  85. }
  86. else if (lastdigit == 1)
  87. {
  88. drawdigit(2, min % 10, true);
  89. }
  90. else if (lastdigit == 2)
  91. {
  92. drawdigit(3, min / 10, false);
  93. }
  94. else
  95. {
  96. drawdigit(0, sec % 10, false);
  97. }
  98. }
  99.  
  100. void drawdigit(uint8_t digit, uint8_t num, bool dot)
  101. {
  102. if (num>sizeof(numbers)-1 || digit>sizeof(digits)-1) return;
  103.  
  104. shift(dot ? numbers[num]&~(1<<DP) : numbers[num]);
  105. shift(digits[digit]);
  106.  
  107. lastdigit = digit;
  108. }
  109.  
  110. void shift(uint8_t data)
  111. {
  112. PORTD &= ~(1<<latchPin);
  113. for (int i = 0; i < 8; i++){
  114. PORTD &= ~((1<<clockPin)|(1<<dataPin));
  115. PORTD |= ((data&1)<<dataPin);
  116. PORTD |= (1<<clockPin);
  117. data >>= 1;
  118. }
  119. PORTD |= (1<<latchPin);
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement