Redfern_89

barno_ebanoe2.c

Dec 20th, 2017
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.25 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. // Макрос управления защелкой
  5. #define registerLatch(code) { PORTD &= ~(1 << 6); code; PORTD |= 1 << 6; }
  6.  
  7. //Сигналы управления сдвиговыми регистрами
  8. #define SCLK 7
  9. #define RCLK 5
  10. #define DATA 6
  11.  
  12. // Данные о сегментах индикаторов
  13. const uint8_t digits[11] = {//        A
  14.   0b11000000,         //          #########
  15.   0b11111001,         //         #         #
  16.   0b10100100,         //       F #         # B
  17.   0b10110000,         //         #    G    #
  18.   0b10011001,         //          #########
  19.   0b10010010,         //         #         #
  20.   0b10000010,         //       E #         # C
  21.   0b11111000,         //         #         #
  22.   0b10000000,         //          #########
  23.   0b10010000,         //              D       ##
  24.   0b11111111          //                      dp
  25. };
  26.  
  27. // Данные о группах светодиодов (16бит)
  28. const uint16_t groups[15] = {
  29.   0b0000010000000000, // DIGIT 1      (0)
  30.   0b0000001000000000, // DIGIT 2      (1)
  31.   0b0000000100000000, // DIGIT 3      (2)
  32. /* ------------------------------ */  
  33.   0b0000000010000000, // DIGIT 1      (3)
  34.   0b0000000001000000, // DIGIT 2      (4)
  35.   0b0000000000100000, // DIGIT 3      (5)
  36.   0b0000000000010000, // DIGIT 4      (6)
  37.   0b0000000000001000, // DIGIT 5      (7)
  38.   0b0000000000000100, // DIGIT 6      (8)
  39. /* ------------------------------ */
  40.   0b0010000000000000, // SCALE 1      (9)
  41.   0b0001000000000000, // SCALE 2      (10)
  42.   0b0000100000000000, // SCALE 3      (11)
  43.   0b0000000000000010, // SCALE 4      (12)
  44.   0b0000000000000001  // SCALE 5      (13)
  45. };
  46.  
  47. // Данные о светодиодах в шкале
  48. const uint8_t scale_leds[6] = {
  49.   0b00000000, // 0 LED's
  50.   0b00000000, // 0 LED's
  51. };
  52.  
  53. uint8_t NC = 0b11111111;
  54. // Временный массив для теста индикации
  55. uint8_t disp[14] = {NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC};
  56. unsigned char counter = 0;
  57.  
  58.  
  59. // Отправка данных по SPI
  60. void shiftOut2(uint8_t data) {
  61.   for (uint8_t i = 0; i < 8; i++) {
  62.     byte value = !!(data & (1 << (7 - i)));
  63.     if (value) PORTD |= 1 << 5; else PORTD &= ~(1 << 5);
  64.     PORTD |= 1 << 7;
  65.     PORTD &= ~(1 << 7);
  66.   }  
  67. }
  68.  
  69. // Запись в регистры
  70. void registerWrite(uint16_t groups, uint8_t segments) {
  71.   registerLatch({
  72.     shiftOut2(groups >> 8);
  73.     shiftOut2((groups) & 0xFF);
  74.     shiftOut2(segments);
  75.   });
  76. }
  77.  
  78. // Описание таймера
  79. ISR (TIMER0_OVF_vect) {
  80.   TCNT0 = 0x00;
  81.   counter = (counter + 1) % 14;
  82.   registerWrite(groups[counter], disp[counter]);
  83. }
  84.  
  85. void print3digitDisplay(int number) {
  86.   int r1 = round(number / 1000);
  87.   int r2 = round(number / 100) % 10;
  88.   int r3 = round(number % 100) / 10;
  89.   int r4 = round(number % 10);
  90.  
  91.   if (number == 0) {
  92.     disp[0] = (digits[0] & ~(1 << 7));
  93.     disp[1] = digits[0];
  94.     disp[2] = digits[0];
  95.   } else  if (number >= 1 && number <= 9) {
  96.     disp[0] = digits[number];
  97.     disp[1] = NC;
  98.     disp[2] = NC;
  99.   } else if (number >= 10 && number <= 99) {
  100.     disp[0] = digits[r3];
  101.     disp[1] = digits[r4];
  102.     disp[2] = NC;
  103.   } else if (number >= 100 && number <= 999) {
  104.     disp[0] = digits[r2];
  105.     disp[1] = digits[r3];
  106.     disp[2] = digits[r4];
  107.   }
  108. }
  109.  
  110. void print6digitDisplay(unsigned long int number) {
  111.   int r1 = round(number / 1000);
  112.   int r2 = round(number / 100) % 10;
  113.   int r3 = round(number % 100) / 10;
  114.   int r4 = round(number % 10);
  115.  
  116.   int r5 = round(number / 10000);
  117.   int r6 = round(number / 1000 % 10);
  118.   int r7 = round(number % 1000 / 100);
  119.   int r8 = round(number % 100 / 10);
  120.   int r9 = round(number % 10);
  121.  
  122.   int r10 = round(number / 100000);
  123.   int r11 = round(number / 10000 % 10);
  124.  
  125.   if (number <= 9) {
  126.     disp[3] = digits[number];
  127.     disp[4] = NC;
  128.     disp[5] = NC;
  129.     disp[6] = NC;
  130.     disp[7] = NC;
  131.     disp[8] = NC;
  132.   } else if (number >= 10 && number <= 99) {
  133.     disp[3] = digits[r3];
  134.     disp[4] = digits[r4];
  135.     disp[5] = NC;
  136.     disp[6] = NC;
  137.     disp[7] = NC;
  138.     disp[8] = NC;
  139.   } else if (number >= 100 && number <= 999) {
  140.     disp[3] = digits[r2];
  141.     disp[4] = digits[r3];
  142.     disp[5] = digits[r4];
  143.     disp[6] = NC;
  144.     disp[7] = NC;
  145.     disp[8] = NC;
  146.   } else if (number >= 10000 && number <= 99999) {
  147.     disp[3] = digits[r5];
  148.     disp[4] = (digits[r6] & ~(1 << 7));
  149.     disp[5] = digits[r7];
  150.     disp[6] = digits[r8];
  151.     disp[7] = digits[r9];
  152.     disp[8] = NC;
  153.   } else if (number >= 100000 && number <= 999999) {
  154.     disp[3] = digits[r10];
  155.     disp[4] = digits[r11];
  156.     disp[5] = (digits[r6] & ~(1 << 7));
  157.     disp[6] = digits[r7];
  158.     disp[7] = digits[r8];
  159.     disp[8] = digits[r9];
  160.   }
  161. }
  162.  
  163. void test_display() {
  164.   int i;
  165.  
  166.   for (i = 0; i < 14; i++) {
  167.     disp[i] = ~NC;
  168.   }
  169. }
  170.  
  171. // Основная программа
  172. int main () {
  173.   // SPI - выводы для регистров
  174.   DDRD = 0b11100000;
  175.  
  176.   // Инициализация таймера
  177.   TIMSK = (1 << TOIE0);
  178.   TCCR0 = (1 << CS00) | (1 << CS01) | (0 << CS02);
  179.   asm("SEI");
  180.  
  181.   test_display();
  182.  // print3digitDisplay(0);
  183.  // print6digitDisplay(32768);      
  184.  
  185.   // Вечный цикл
  186.   while (1) {
  187.  
  188.   }
  189.  
  190.   return 0;
  191. }
Advertisement
Add Comment
Please, Sign In to add comment