| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- // Copyright 2021 IOsetting <iosetting(at)outlook.com>
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- /**
- * Demo: MAX7219 8x8 LED Matrix
- * Board: STC8H1K08
- *
- * P1.3 -> DIN
- * P1.5 -> SCLK
- * P1.7 -> CS
- */
- #include "fw_hal.h"
- #define MAX7219_CS P17
- #define DECODE_MODE 0x09
- #define INTENSITY 0x0A
- #define SCAN_LIMIT 0x0B
- #define SHUT_DOWN 0x0C
- #define DISPLAY_TEST 0x0F
- const uint8_t numbers[]={
- 0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6, // -0-.
- 0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18, // -1-
- 0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30, // -2-
- 0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06, // -3-
- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE, // -4-
- 0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00,
- 0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E, // -5-
- 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6, // -6-
- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18, // -7-
- 0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6, // -8-
- 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06, // -9-
- 0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00};
- void MAX7219_write(uint8_t addr, uint8_t dat)
- {
- MAX7219_CS = 0;
- SPI_TxRx(addr);
- SPI_TxRx(dat);
- MAX7219_CS = 1;
- }
- void MAX7219_init(void)
- {
- MAX7219_write(SHUT_DOWN, 0x01); // 0x00:shutdown, 0x01:normal
- MAX7219_write(DECODE_MODE, 0x00); // Bypass code B decoder, no-decode operation
- MAX7219_write(SCAN_LIMIT, 0x07); // Scan-limit, 0:1-digit, 1:2-digits, ... 7:8-digits
- MAX7219_write(INTENSITY, 0x01); // 0x00:min, 0xFF:max
- MAX7219_write(DISPLAY_TEST, 0x00); // 0x00:normal, 0x01:test mode
- }
- void SPI_init(void)
- {
- // MAX7219 can work with frequency up to 20MHz
- SPI_SetClockPrescaler(SPI_ClockPreScaler_4);
- // Clock idles low
- SPI_SetClockPolarity(HAL_State_OFF);
- // Data transfer is driven by lower SS pin
- SPI_SetClockPhase(SPI_ClockPhase_LeadingEdge);
- // MSB first
- SPI_SetDataOrder(SPI_DataOrder_MSB);
- // Define the output pins
- SPI_SetPort(SPI_AlterPort_P12P54_P13_P14_P15);
- // Ignore SS pin, use MSTR to swith between master/slave mode
- SPI_IgnoreSlaveSelect(HAL_State_ON);
- // Master mode
- SPI_SetMasterMode(HAL_State_ON);
- // Start SPI
- SPI_SetEnabled(HAL_State_ON);
- }
- void main()
- {
- uint8_t pos = 0, size = sizeof(numbers), i, j;
- SYS_SetClock();
- // Configure GPIO pins before SPI and device
- GPIO_P1_SetMode(GPIO_Pin_3, GPIO_Mode_InOut_QBD);
- GPIO_P1_SetMode(GPIO_Pin_5|GPIO_Pin_7, GPIO_Mode_Output_PP);
- // Configure SPI and device
- SPI_init();
- MAX7219_init();
- while(1)
- {
- for (i = 0; i < 8; i++)
- {
- j = (pos + i) % size;
- MAX7219_write(i + 1, numbers[j]);
- }
- pos = (pos + 1) % size;
- SYS_Delay(100);
- }
- }
|