Advertisement
Guest User

Untitled

a guest
Oct 21st, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.35 KB | None | 0 0
  1. byte command1 = B01000000; //Команда записи данных в регистр дисплея
  2. byte command2 = B11000000; //Команда "начальный адрес дисплея"
  3. byte symbol_1 = 0x22;//Символ_1
  4. byte symbol_2 = 0x55;//Символ_2
  5. byte symbol_3 = 0x4D;//Символ_3
  6. byte symbol_4 = 0x33;//Символ_4
  7. byte symbol_5 = 0x51;//Символ_5
  8. byte symbol_6 = 0x8E;//Символ_6
  9. byte command3 = B10001111; //Яркость и ON/OFF дисплея
  10. byte command4 = B01000010;//Команда чтения клавиатуры.
  11. unsigned int bit_n;
  12. unsigned int WAIT_HL = 0;
  13. unsigned int pack = 0x01;
  14. unsigned int send_byte;
  15. unsigned int SCL_TM1637 = B00001000; //Задаем 3 пин, как выход SCL
  16. unsigned int SDA_TM1637 = B00000100; //Задаем 2 пин, как шину SDA
  17. volatile boolean SCL_STAT = true;//Переменная, в которой хранится текущее состояние выхода SCL
  18. volatile boolean ACK_tm1637 = false; //Переменная в которой возвращается проверка сигнала ACK (подтверждение приема байта)
  19.  
  20. void setup() {
  21. TIMSK2 &= ~(1<<TOIE2);// Запрещаем прерывания, сбросив бит TOIE2 в регистре TIMSK2.
  22. TCCR2A &= ~((1<<COM2A1) | (1<<COM2A0) | (1<<COM2B1) | (1<<COM2B0) | (1<<WGM21) | (1<<WGM20));//Сбрасываем биты 7 - 4 в регистре TCCR2A, так как переключение выходов OC2A и OC2B нас пока не интересует, а также отключаем режим ШИМ (WGM).
  23. TIMSK2 |= (1<<TOIE2);// Разрешаем прерывания, установив бит TOIE2 в регистре TIMSK2. Прерывание будет переворачивать сигнал на SCL
  24. DDRD |= B00001100; //Инициализируем третий и второй пины порта D как выходы.
  25. PORTD |= B00001100; //Выводим HIGH на третий и второй пины порта D.
  26. Serial.begin(9600);
  27. }
  28.  
  29. void generator_SCL(){
  30. PORTD ^= PORTD | SCL_TM1637; //Инвертируем третий пин порта D. Тем самым формируем сигнал SCL.
  31. SCL_STAT = !SCL_STAT; //Записываем состояние SCL в переменную SCL_STAT
  32.  
  33. }
  34.  
  35.  
  36.  
  37. void start_transfer(){
  38. DDRD |= B00001100; //Инициализируем третий и второй пины порта D как выходы.
  39. PORTD |= B00001000; //Выводим HIGH на SCL
  40. delay(1);
  41. PORTD |= B00000100; // Выводим HIGH на SDA (Конец передачи)
  42. delay(1);
  43. PORTD &= B11111011; // Посылаем на SDA LOW, тем самым отправляем приемнику сигнал о старте передачи данных (SCL = HIGH).
  44. TCCR2B = 0x02; //Подключаем 2 Мгц к Таймеру2. Таймер начинает считать до 255, вызывать подпрограмму прерывания (generator_SCL()) и сбрасываться в 0.
  45. }
  46.  
  47. void end_transfer(){
  48. DDRD |= B00000100; //Инициализируем второй пин порта D (SDA) как выход.
  49. PORTD &= B11111011; //Выводим на SDA LOW.
  50. TCCR2B = 0x00; //Останавливаем Таймер2.
  51. PORTD |= B00001000; //Выводим на SCL HIGH
  52. SCL_STAT = true; // Не забываем присвоить переменной статуса SCL значение true
  53. TCNT2 = 0; //Обнуляем таймер.
  54. PORTD |= B00000100; //Выводим на SDA HIGH.
  55. }
  56.  
  57. void wait_ack(){
  58. ACK_tm1637 = 0;
  59. DDRD &= B11111011; //Инициализируем пин SDA как вход
  60. PORTD |= B00000100; //Подключаем подтягивающий резистор к SDA
  61. while(WAIT_HL < 2000){ //Начинаем слушать шину SDA не более 2000 циклов
  62. if(!(PIND & B00000100)){//Если SDA = LOW,
  63. WAIT_HL = 2000;
  64. ACK_tm1637 = 1; //присваиваем переменной ACK_tm1637 значение 1, как подтверждение получения ACK
  65. }
  66. WAIT_HL += 1;
  67. }
  68. if(ACK_tm1637 == 0){
  69. Serial.print("NO ACK!");
  70. }
  71. WAIT_HL = 0;
  72. while(WAIT_HL < 2000){ //Ждем положительного фронта на SCL (см. DATASHEET TM1637
  73. if(PIND & B00000100){ //Если пришел положительный фронт,
  74. WAIT_HL = 2000; //уходим в loop
  75. }
  76. WAIT_HL += 1;
  77. }
  78. WAIT_HL = 0;
  79. }
  80.  
  81.  
  82. void byte_send(){
  83. send_byte = pack;
  84. DDRD |= B00000100; //Инициализируем второй пин (SDA) порта D как выход.
  85. bit_n = 0;
  86. while(bit_n <= 7){ //отправляем байт на SDA
  87. if(!SCL_STAT){ //Если пин SCL переключился на LOW
  88. if(send_byte & B00000001){ //Если младший бит равен 1,
  89. PORTD |= SDA_TM1637; //выводим 1 на пин SDA,
  90. send_byte = send_byte >> 1; //сдвигаем байт на 1 бит вправо и переходим к отправке следующего бита.
  91. bit_n += 1;
  92. while(!SCL_STAT){} //Ждем HIGH на SCL
  93. } else{ //Если младший бит равен 0
  94. PORTD &= ~SDA_TM1637; //выводим на SDA 0,
  95. send_byte = send_byte >> 1; //сдвигаем байт вправо на 1 бит и переходим к отправке следующего бита
  96. bit_n += 1;
  97. while(!SCL_STAT){} //Ждем HIGH на SCL
  98. }
  99. }
  100.  
  101. }
  102. }
  103.  
  104.  
  105. void loop() {
  106. delay(1000);
  107. start_transfer();
  108. pack = command1;
  109. byte_send();
  110. wait_ack();
  111. pack = command2;
  112. byte_send();
  113. wait_ack();
  114. pack = symbol_1;
  115. byte_send();
  116. wait_ack();
  117. pack = symbol_2;
  118. byte_send();
  119. wait_ack();
  120. pack = symbol_3;
  121. byte_send();
  122. wait_ack();
  123. pack = symbol_4;
  124. byte_send();
  125. wait_ack();
  126. pack = symbol_5;
  127. byte_send();
  128. wait_ack();
  129. pack = symbol_6;
  130. byte_send();
  131. wait_ack();
  132. pack = command3;
  133. byte_send();
  134. wait_ack();
  135. pack = command4;
  136. byte_send();
  137. wait_ack();
  138. end_transfer();
  139. }
  140.  
  141. ISR(TIMER2_OVF_vect) {
  142. generator_SCL();
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement