max7219_8x8led.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright 2021 IOsetting <iosetting(at)outlook.com>
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. /**
  15. * Demo: MAX7219 8x8 LED Matrix
  16. * Board: STC8H1K08
  17. *
  18. * P1.3 -> DIN
  19. * P1.5 -> SCLK
  20. * P1.7 -> CS
  21. */
  22. #include "fw_hal.h"
  23. #define MAX7219_CS P17
  24. #define DECODE_MODE 0x09
  25. #define INTENSITY 0x0A
  26. #define SCAN_LIMIT 0x0B
  27. #define SHUT_DOWN 0x0C
  28. #define DISPLAY_TEST 0x0F
  29. const uint8_t numbers[]={
  30. 0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6, // -0-.
  31. 0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
  32. 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18, // -1-
  33. 0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00,
  34. 0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30, // -2-
  35. 0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00,
  36. 0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06, // -3-
  37. 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
  38. 0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE, // -4-
  39. 0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00,
  40. 0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E, // -5-
  41. 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
  42. 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6, // -6-
  43. 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
  44. 0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18, // -7-
  45. 0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,
  46. 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6, // -8-
  47. 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
  48. 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06, // -9-
  49. 0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00};
  50. void MAX7219_write(uint8_t addr, uint8_t dat)
  51. {
  52. MAX7219_CS = 0;
  53. SPI_TxRx(addr);
  54. SPI_TxRx(dat);
  55. MAX7219_CS = 1;
  56. }
  57. void MAX7219_init(void)
  58. {
  59. MAX7219_write(SHUT_DOWN, 0x01); // 0x00:shutdown, 0x01:normal
  60. MAX7219_write(DECODE_MODE, 0x00); // Bypass code B decoder, no-decode operation
  61. MAX7219_write(SCAN_LIMIT, 0x07); // Scan-limit, 0:1-digit, 1:2-digits, ... 7:8-digits
  62. MAX7219_write(INTENSITY, 0x01); // 0x00:min, 0xFF:max
  63. MAX7219_write(DISPLAY_TEST, 0x00); // 0x00:normal, 0x01:test mode
  64. }
  65. void SPI_init(void)
  66. {
  67. // MAX7219 can work with frequency up to 20MHz
  68. SPI_SetClockPrescaler(SPI_ClockPreScaler_4);
  69. // Clock idles low
  70. SPI_SetClockPolarity(HAL_State_OFF);
  71. // Data transfer is driven by lower SS pin
  72. SPI_SetClockPhase(SPI_ClockPhase_LeadingEdge);
  73. // MSB first
  74. SPI_SetDataOrder(SPI_DataOrder_MSB);
  75. // Define the output pins
  76. SPI_SetPort(SPI_AlterPort_P12P54_P13_P14_P15);
  77. // Ignore SS pin, use MSTR to swith between master/slave mode
  78. SPI_IgnoreSlaveSelect(HAL_State_ON);
  79. // Master mode
  80. SPI_SetMasterMode(HAL_State_ON);
  81. // Start SPI
  82. SPI_SetEnabled(HAL_State_ON);
  83. }
  84. void main()
  85. {
  86. uint8_t pos = 0, size = sizeof(numbers), i, j;
  87. SYS_SetClock();
  88. // Configure GPIO pins before SPI and device
  89. GPIO_P1_SetMode(GPIO_Pin_3, GPIO_Mode_InOut_QBD);
  90. GPIO_P1_SetMode(GPIO_Pin_5|GPIO_Pin_7, GPIO_Mode_Output_PP);
  91. // Configure SPI and device
  92. SPI_init();
  93. MAX7219_init();
  94. while(1)
  95. {
  96. for (i = 0; i < 8; i++)
  97. {
  98. j = (pos + i) % size;
  99. MAX7219_write(i + 1, numbers[j]);
  100. }
  101. pos = (pos + 1) % size;
  102. SYS_Delay(100);
  103. }
  104. }