max7219.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /* max7219.cpp
  2. * MAX7219 Interaction Code
  3. * ---------------------------
  4. * For more information see
  5. * http://www.adnbr.co.uk/articles/max7219-and-7-segment-displays
  6. *
  7. * Created on: 29 січ. 2016
  8. * Author: shilov
  9. */
  10. #include <user_config.h>
  11. #include <SmingCore/SmingCore.h>
  12. #include "configuration.h"
  13. #include "max7219.h"
  14. // перевод числа 0-7 в номер индикатора
  15. //const uint8_t max7219_dig[8] = {
  16. // 0x05,0x01,0x07,0x03,0x04,0x08,0x06,0x02
  17. //};
  18. void
  19. MAX7219_writeData (uint8_t reg, uint8_t data)
  20. {
  21. PinRes(PIN_LOAD); // опустили защёлку
  22. // software spi
  23. uint8_t i; // счетчик бит
  24. uint16_t sdata = ((reg & 0x000F) << 8) | (data & 0x00FF);
  25. for (i = 16; i != 0; i--)
  26. {
  27. PinRes(PIN_CLK); // выдали строб
  28. if (sdata >= 0x8000)
  29. { // если старший бит == 1
  30. PinSet(PIN_DIN); // MOSI = 1
  31. }
  32. else
  33. { // если старший бит == 0
  34. PinRes(PIN_DIN); // MOSI = 0
  35. }
  36. PinSet(PIN_CLK); // защёлкнули строб
  37. sdata <<= 1; // сдвиг влево на 1 бит
  38. }
  39. PinSet(PIN_LOAD); // подняли защёлку
  40. PinSet(PIN_DIN);
  41. }
  42. void MAX7219_Init (void)
  43. {
  44. // настройка пинов SPI
  45. pinMode (PIN_LOAD, OUTPUT);
  46. pinMode (PIN_DIN, OUTPUT);
  47. pinMode (PIN_CLK, OUTPUT);
  48. PinSet(PIN_LOAD);
  49. PinSet(PIN_DIN);
  50. PinSet(PIN_CLK);
  51. // Настройка MAX71219
  52. MAX7219_writeData (MAX7219_MODE_DECODE, MAX7219_DIG_MASK);
  53. MAX7219_writeData (MAX7219_MODE_SCAN_LIMIT, MAX7219_DIGITS - 1); // Scan limit runs from 0.
  54. MAX7219_writeData (MAX7219_MODE_INTENSITY, MAX7219_BRIGHT); // яркость
  55. MAX7219_writeData (MAX7219_MODE_POWER, MAX7219_ON); // включили питание
  56. }
  57. void MAX7219_FillMinus(void)
  58. {
  59. uint8_t i, m = MAX7219_DIG_MASK;
  60. for (i = 8; i > 0; i--)
  61. {
  62. if (m >= 0x80)
  63. {
  64. MAX7219_writeData (i, MAX7219_CHAR_MINUS);
  65. }
  66. else
  67. {
  68. MAX7219_writeData (i, SYM_Minus);
  69. }
  70. m <<= 1;
  71. }
  72. }