feat: spi demo with max7219 led matrix 4in1
This commit is contained in:
parent
5c24252306
commit
37dacac881
@ -14,6 +14,7 @@
|
||||
|
||||
/**
|
||||
* Demo: MAX7219 8x8 LED Matrix
|
||||
* Board: STC8H1K08
|
||||
*
|
||||
* P1.3 -> DIN
|
||||
* P1.5 -> SCLK
|
203
demo/spi/max7219_8x8led_4in1.c
Normal file
203
demo/spi/max7219_8x8led_4in1.c
Normal file
@ -0,0 +1,203 @@
|
||||
// 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 4 in 1
|
||||
* Board: STC8H1K08
|
||||
*
|
||||
* P1.3 -> DIN
|
||||
* P1.5 -> SCLK
|
||||
* P1.7 -> CS
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* PlatformIO configuration example
|
||||
|
||||
[env:stc8g1k08]
|
||||
platform = intel_mcs51
|
||||
board = stc8g1k08
|
||||
build_flags =
|
||||
-D__CONF_FOSC=36864000UL
|
||||
-D__CONF_MCU_MODEL=MCU_MODEL_STC8G1K08
|
||||
-D__CONF_CLKDIV=0x00
|
||||
-D__CONF_IRCBAND=0x01
|
||||
-D__CONF_VRTRIM=0x20
|
||||
-D__CONF_IRTRIM=0xA3
|
||||
-D__CONF_LIRTRIM=0x03
|
||||
upload_protocol = custom
|
||||
upload_port = /dev/ttyUSB0
|
||||
upload_speed = 115200
|
||||
upload_flags =
|
||||
-p$UPLOAD_PORT
|
||||
-s$UPLOAD_SPEED
|
||||
-e
|
||||
upload_command = ${platformio.packages_dir}/tool-stc8prog/stc8prog $UPLOAD_FLAGS -f $SOURCE
|
||||
|
||||
*/
|
||||
|
||||
#include "fw_hal.h"
|
||||
|
||||
#define MAX7219_CS P17
|
||||
#define MAX7219_BLOCKS 4
|
||||
|
||||
#define DECODE_MODE 0x09
|
||||
#define INTENSITY 0x0A
|
||||
#define SCAN_LIMIT 0x0B
|
||||
#define SHUT_DOWN 0x0C
|
||||
#define DISPLAY_TEST 0x0F
|
||||
|
||||
const uint8_t numbers[]={
|
||||
0x3e,0x63,0x63,0x7f,0x63,0x63,0x63,0x63, //A
|
||||
0x7e,0x63,0x63,0x7e,0x63,0x63,0x63,0x7e, //B
|
||||
0x3e,0x63,0x63,0x60,0x60,0x63,0x63,0x3e, //C
|
||||
0x7e,0x63,0x63,0x63,0x63,0x63,0x63,0x7e, //D
|
||||
0x7f,0x60,0x60,0x7f,0x60,0x60,0x60,0x7f, //E
|
||||
0x7f,0x60,0x60,0x7e,0x60,0x60,0x60,0x60, //F
|
||||
0x3e,0x63,0x63,0x60,0x67,0x63,0x63,0x3e, //G
|
||||
0x63,0x63,0x63,0x7f,0x63,0x63,0x63,0x63, //H
|
||||
0x3f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3f, //I
|
||||
0x1f,0x06,0x06,0x06,0x06,0x66,0x66,0x3c, //J
|
||||
0x63,0x66,0x6c,0x78,0x6c,0x66,0x63,0x61, //K
|
||||
0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7f, //L
|
||||
0x63,0x77,0x7f,0x6b,0x63,0x63,0x63,0x63, //M
|
||||
0x63,0x63,0x73,0x7b,0x6f,0x67,0x63,0x63, //N
|
||||
0x3e,0x63,0x63,0x63,0x63,0x63,0x63,0x3e, //O
|
||||
0x7e,0x63,0x63,0x63,0x7e,0x60,0x60,0x60, //P
|
||||
0x3c,0x66,0x66,0x66,0x66,0x6e,0x66,0x3f, //Q
|
||||
0x7e,0x63,0x63,0x63,0x7e,0x6c,0x66,0x63, //R
|
||||
0x3e,0x63,0x63,0x60,0x3e,0x03,0x63,0x3e, //S
|
||||
0x3f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, //T
|
||||
0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x3e, //U
|
||||
0x63,0x63,0x63,0x63,0x63,0x36,0x1c,0x08, //V
|
||||
0x63,0x63,0x63,0x63,0x6b,0x7f,0x77,0x63, //W
|
||||
0x63,0x63,0x36,0x1c,0x1c,0x36,0x63,0x63, //X
|
||||
0x33,0x33,0x33,0x33,0x1e,0x0c,0x0c,0x0c, //Y
|
||||
0x7f,0x03,0x06,0x0c,0x18,0x30,0x60,0x7f, //Z
|
||||
0x3e,0x63,0x73,0x6b,0x67,0x63,0x63,0x3e, //0
|
||||
0x0c,0x1c,0x3c,0x0c,0x0c,0x0c,0x0c,0x3f, //1
|
||||
0x3e,0x63,0x63,0x06,0x0c,0x18,0x30,0x7f, //2
|
||||
0x3e,0x63,0x63,0x0e,0x03,0x63,0x63,0x3e, //3
|
||||
0x06,0x0e,0x1e,0x36,0x66,0x7f,0x06,0x06, //4
|
||||
0x7f,0x60,0x60,0x7e,0x03,0x03,0x03,0x7e, //5
|
||||
0x3e,0x63,0x60,0x7e,0x63,0x63,0x63,0x3e, //6
|
||||
0x7f,0x03,0x03,0x06,0x0c,0x18,0x18,0x18, //7
|
||||
0x3e,0x63,0x63,0x3e,0x63,0x63,0x63,0x3e, //8
|
||||
0x3e,0x63,0x63,0x63,0x3f,0x03,0x63,0x3e, //9
|
||||
};
|
||||
|
||||
uint8_t val[MAX7219_BLOCKS];
|
||||
uint8_t character_len = sizeof(numbers) / 8;
|
||||
|
||||
void MAX7219_singeWrite(uint8_t index, uint8_t addr, uint8_t dat)
|
||||
{
|
||||
index = index % MAX7219_BLOCKS;
|
||||
MAX7219_CS = 0;
|
||||
SPI_TxRx(addr);
|
||||
SPI_TxRx(dat);
|
||||
while(index--)
|
||||
{
|
||||
SPI_TxRx(addr);
|
||||
SPI_TxRx(dat);
|
||||
}
|
||||
MAX7219_CS = 1;
|
||||
}
|
||||
|
||||
void MAX7219_multiWrite(uint8_t addr, uint8_t len, uint8_t* dat)
|
||||
{
|
||||
MAX7219_CS = 0;
|
||||
while (len--)
|
||||
{
|
||||
SPI_TxRx(addr);
|
||||
SPI_TxRx(*dat++);
|
||||
}
|
||||
MAX7219_CS = 1;
|
||||
}
|
||||
|
||||
void MAX7219_init(void)
|
||||
{
|
||||
for (uint8_t i = 0; i < MAX7219_BLOCKS; i++)
|
||||
{
|
||||
MAX7219_singeWrite(i, SHUT_DOWN, 0x01); // 0x00:shutdown, 0x01:normal
|
||||
MAX7219_singeWrite(i, DECODE_MODE, 0x00); // Bypass code B decoder, no-decode operation
|
||||
MAX7219_singeWrite(i, SCAN_LIMIT, 0x07); // Scan-limit, 0:1-digit, 1:2-digits, ..., 7:8-digits
|
||||
MAX7219_singeWrite(i, INTENSITY, 0x00); // 0x00:min, 0xFF:max
|
||||
MAX7219_singeWrite(i, 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_SetEnableState(HAL_State_ON);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
/**
|
||||
* ________________________
|
||||
* | |
|
||||
* |_______________________|
|
||||
* A B
|
||||
*
|
||||
* pos: point to the bit for boundary A
|
||||
* lpos: point to the bit for boundary B
|
||||
*/
|
||||
uint16_t pos = 0, lpos = 0;
|
||||
uint8_t i, j, cpos = 0, bpos = 0, tcpos = 0;
|
||||
|
||||
SYS_SetClock();
|
||||
// Configure GPIO pins before SPI and device
|
||||
// DIN(P13)
|
||||
GPIO_P1_SetMode(GPIO_Pin_3, GPIO_Mode_InOut_QBD);
|
||||
// SCLK(P15), CS(P17)
|
||||
GPIO_P1_SetMode(GPIO_Pin_5|GPIO_Pin_7, GPIO_Mode_Output_PP);
|
||||
// Configure SPI and device
|
||||
SPI_init();
|
||||
MAX7219_init();
|
||||
|
||||
while(1)
|
||||
{
|
||||
lpos = pos + sizeof(numbers) - MAX7219_BLOCKS * 8;
|
||||
cpos = lpos / 8; // char position
|
||||
bpos = lpos % 8; // bit position
|
||||
for (i = 0; i < 8; i++) // fill each line
|
||||
{
|
||||
for (j = 0; j < MAX7219_BLOCKS; j++)
|
||||
{
|
||||
tcpos = (cpos + j) % character_len;
|
||||
val[j] = numbers[tcpos * 8 + i] << bpos;
|
||||
tcpos = (cpos + j + 1) % character_len;
|
||||
val[j] |= numbers[tcpos * 8 + i] >> (8 - bpos);
|
||||
}
|
||||
MAX7219_multiWrite(i + 1, MAX7219_BLOCKS, val);
|
||||
}
|
||||
pos = (pos + 1) % sizeof(numbers);
|
||||
SYS_Delay(50);
|
||||
}
|
||||
}
|
204
demo/spi/max7219_8x8led_4in1_stc8g1k08.c
Normal file
204
demo/spi/max7219_8x8led_4in1_stc8g1k08.c
Normal file
@ -0,0 +1,204 @@
|
||||
// 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 4 in 1
|
||||
* Board: STC8G1K08, STC8G1K08A
|
||||
*
|
||||
* P5.4 -> DIN
|
||||
* P3.2 -> SCLK
|
||||
* P5.5 -> CS
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* PlatformIO configuration example
|
||||
|
||||
[env:stc8g1k08]
|
||||
platform = intel_mcs51
|
||||
board = stc8g1k08
|
||||
build_flags =
|
||||
-D__CONF_FOSC=36864000UL
|
||||
-D__CONF_MCU_MODEL=MCU_MODEL_STC8G1K08
|
||||
-D__CONF_CLKDIV=0x00
|
||||
-D__CONF_IRCBAND=0x01
|
||||
-D__CONF_VRTRIM=0x20
|
||||
-D__CONF_IRTRIM=0xA3
|
||||
-D__CONF_LIRTRIM=0x03
|
||||
upload_protocol = custom
|
||||
upload_port = /dev/ttyUSB0
|
||||
upload_speed = 115200
|
||||
upload_flags =
|
||||
-p$UPLOAD_PORT
|
||||
-s$UPLOAD_SPEED
|
||||
-e
|
||||
upload_command = ${platformio.packages_dir}/tool-stc8prog/stc8prog $UPLOAD_FLAGS -f $SOURCE
|
||||
|
||||
*/
|
||||
|
||||
#include "fw_hal.h"
|
||||
|
||||
#define MAX7219_CS P55
|
||||
#define MAX7219_BLOCKS 4
|
||||
|
||||
#define DECODE_MODE 0x09
|
||||
#define INTENSITY 0x0A
|
||||
#define SCAN_LIMIT 0x0B
|
||||
#define SHUT_DOWN 0x0C
|
||||
#define DISPLAY_TEST 0x0F
|
||||
|
||||
const uint8_t numbers[]={
|
||||
0x3e,0x63,0x63,0x7f,0x63,0x63,0x63,0x63, //A
|
||||
0x7e,0x63,0x63,0x7e,0x63,0x63,0x63,0x7e, //B
|
||||
0x3e,0x63,0x63,0x60,0x60,0x63,0x63,0x3e, //C
|
||||
0x7e,0x63,0x63,0x63,0x63,0x63,0x63,0x7e, //D
|
||||
0x7f,0x60,0x60,0x7f,0x60,0x60,0x60,0x7f, //E
|
||||
0x7f,0x60,0x60,0x7e,0x60,0x60,0x60,0x60, //F
|
||||
0x3e,0x63,0x63,0x60,0x67,0x63,0x63,0x3e, //G
|
||||
0x63,0x63,0x63,0x7f,0x63,0x63,0x63,0x63, //H
|
||||
0x3f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3f, //I
|
||||
0x1f,0x06,0x06,0x06,0x06,0x66,0x66,0x3c, //J
|
||||
0x63,0x66,0x6c,0x78,0x6c,0x66,0x63,0x61, //K
|
||||
0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7f, //L
|
||||
0x63,0x77,0x7f,0x6b,0x63,0x63,0x63,0x63, //M
|
||||
0x63,0x63,0x73,0x7b,0x6f,0x67,0x63,0x63, //N
|
||||
0x3e,0x63,0x63,0x63,0x63,0x63,0x63,0x3e, //O
|
||||
0x7e,0x63,0x63,0x63,0x7e,0x60,0x60,0x60, //P
|
||||
0x3c,0x66,0x66,0x66,0x66,0x6e,0x66,0x3f, //Q
|
||||
0x7e,0x63,0x63,0x63,0x7e,0x6c,0x66,0x63, //R
|
||||
0x3e,0x63,0x63,0x60,0x3e,0x03,0x63,0x3e, //S
|
||||
0x3f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, //T
|
||||
0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x3e, //U
|
||||
0x63,0x63,0x63,0x63,0x63,0x36,0x1c,0x08, //V
|
||||
0x63,0x63,0x63,0x63,0x6b,0x7f,0x77,0x63, //W
|
||||
0x63,0x63,0x36,0x1c,0x1c,0x36,0x63,0x63, //X
|
||||
0x33,0x33,0x33,0x33,0x1e,0x0c,0x0c,0x0c, //Y
|
||||
0x7f,0x03,0x06,0x0c,0x18,0x30,0x60,0x7f, //Z
|
||||
0x3e,0x63,0x73,0x6b,0x67,0x63,0x63,0x3e, //0
|
||||
0x0c,0x1c,0x3c,0x0c,0x0c,0x0c,0x0c,0x3f, //1
|
||||
0x3e,0x63,0x63,0x06,0x0c,0x18,0x30,0x7f, //2
|
||||
0x3e,0x63,0x63,0x0e,0x03,0x63,0x63,0x3e, //3
|
||||
0x06,0x0e,0x1e,0x36,0x66,0x7f,0x06,0x06, //4
|
||||
0x7f,0x60,0x60,0x7e,0x03,0x03,0x03,0x7e, //5
|
||||
0x3e,0x63,0x60,0x7e,0x63,0x63,0x63,0x3e, //6
|
||||
0x7f,0x03,0x03,0x06,0x0c,0x18,0x18,0x18, //7
|
||||
0x3e,0x63,0x63,0x3e,0x63,0x63,0x63,0x3e, //8
|
||||
0x3e,0x63,0x63,0x63,0x3f,0x03,0x63,0x3e, //9
|
||||
};
|
||||
|
||||
uint8_t val[MAX7219_BLOCKS];
|
||||
uint8_t character_len = sizeof(numbers) / 8;
|
||||
|
||||
void MAX7219_singeWrite(uint8_t index, uint8_t addr, uint8_t dat)
|
||||
{
|
||||
index = index % MAX7219_BLOCKS;
|
||||
MAX7219_CS = 0;
|
||||
SPI_TxRx(addr);
|
||||
SPI_TxRx(dat);
|
||||
while(index--)
|
||||
{
|
||||
SPI_TxRx(addr);
|
||||
SPI_TxRx(dat);
|
||||
}
|
||||
MAX7219_CS = 1;
|
||||
}
|
||||
|
||||
void MAX7219_multiWrite(uint8_t addr, uint8_t len, uint8_t* dat)
|
||||
{
|
||||
MAX7219_CS = 0;
|
||||
while (len--)
|
||||
{
|
||||
SPI_TxRx(addr);
|
||||
SPI_TxRx(*dat++);
|
||||
}
|
||||
MAX7219_CS = 1;
|
||||
}
|
||||
|
||||
void MAX7219_init(void)
|
||||
{
|
||||
for (uint8_t i = 0; i < MAX7219_BLOCKS; i++)
|
||||
{
|
||||
MAX7219_singeWrite(i, SHUT_DOWN, 0x01); // 0x00:shutdown, 0x01:normal
|
||||
MAX7219_singeWrite(i, DECODE_MODE, 0x00); // Bypass code B decoder, no-decode operation
|
||||
MAX7219_singeWrite(i, SCAN_LIMIT, 0x07); // Scan-limit, 0:1-digit, 1:2-digits, ..., 7:8-digits
|
||||
MAX7219_singeWrite(i, INTENSITY, 0x00); // 0x00:min, 0xFF:max
|
||||
MAX7219_singeWrite(i, 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_SetEnableState(HAL_State_ON);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
/**
|
||||
* ________________________
|
||||
* | |
|
||||
* |_______________________|
|
||||
* A B
|
||||
*
|
||||
* pos: point to the bit for boundary A
|
||||
* lpos: point to the bit for boundary B
|
||||
*/
|
||||
uint16_t pos = 0, lpos = 0;
|
||||
uint8_t i, j, cpos = 0, bpos = 0, tcpos = 0;
|
||||
|
||||
SYS_SetClock();
|
||||
// Configure GPIO pins before SPI and device
|
||||
// SCLK(P32), CS(P55)
|
||||
GPIO_P3_SetMode(GPIO_Pin_2, GPIO_Mode_Output_PP);
|
||||
GPIO_P5_SetMode(GPIO_Pin_5, GPIO_Mode_Output_PP);
|
||||
// MOSI(P54)
|
||||
GPIO_P5_SetMode(GPIO_Pin_4, GPIO_Mode_InOut_QBD);
|
||||
// Configure SPI and device
|
||||
SPI_init();
|
||||
MAX7219_init();
|
||||
|
||||
while(1)
|
||||
{
|
||||
lpos = pos + sizeof(numbers) - MAX7219_BLOCKS * 8;
|
||||
cpos = lpos / 8; // char position
|
||||
bpos = lpos % 8; // bit position
|
||||
for (i = 0; i < 8; i++) // fill each line
|
||||
{
|
||||
for (j = 0; j < MAX7219_BLOCKS; j++)
|
||||
{
|
||||
tcpos = (cpos + j) % character_len;
|
||||
val[j] = numbers[tcpos * 8 + i] << bpos;
|
||||
tcpos = (cpos + j + 1) % character_len;
|
||||
val[j] |= numbers[tcpos * 8 + i] >> (8 - bpos);
|
||||
}
|
||||
MAX7219_multiWrite(i + 1, MAX7219_BLOCKS, val);
|
||||
}
|
||||
pos = (pos + 1) % sizeof(numbers);
|
||||
SYS_Delay(100);
|
||||
}
|
||||
}
|
144
demo/spi/max7219_8x8led_stc8g1k08.c
Normal file
144
demo/spi/max7219_8x8led_stc8g1k08.c
Normal file
@ -0,0 +1,144 @@
|
||||
// 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: STC8G1K08, STC8G1K08A
|
||||
*
|
||||
* P5.4 -> DIN
|
||||
* P3.2 -> SCLK
|
||||
* P5.5 -> CS
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
* PlatformIO configuration example
|
||||
|
||||
[env:stc8g1k08]
|
||||
platform = intel_mcs51
|
||||
board = stc8g1k08
|
||||
build_flags =
|
||||
-D__CONF_FOSC=36864000UL
|
||||
-D__CONF_MCU_MODEL=MCU_MODEL_STC8G1K08
|
||||
-D__CONF_CLKDIV=0x00
|
||||
-D__CONF_IRCBAND=0x01
|
||||
-D__CONF_VRTRIM=0x20
|
||||
-D__CONF_IRTRIM=0xA3
|
||||
-D__CONF_LIRTRIM=0x03
|
||||
upload_protocol = custom
|
||||
upload_port = /dev/ttyUSB0
|
||||
upload_speed = 115200
|
||||
upload_flags =
|
||||
-p$UPLOAD_PORT
|
||||
-s$UPLOAD_SPEED
|
||||
-e
|
||||
upload_command = ${platformio.packages_dir}/tool-stc8prog/stc8prog $UPLOAD_FLAGS -f $SOURCE
|
||||
|
||||
*/
|
||||
|
||||
#include "fw_hal.h"
|
||||
|
||||
#define MAX7219_CS P55
|
||||
|
||||
#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_SetEnableState(HAL_State_ON);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
uint8_t pos = 0, size = sizeof(numbers), i, j;
|
||||
|
||||
SYS_SetClock();
|
||||
// Configure GPIO pins before SPI and device
|
||||
// SCLK(P32), CS(P55)
|
||||
GPIO_P3_SetMode(GPIO_Pin_2, GPIO_Mode_Output_PP);
|
||||
GPIO_P5_SetMode(GPIO_Pin_5, GPIO_Mode_Output_PP);
|
||||
// MOSI(P54)
|
||||
GPIO_P5_SetMode(GPIO_Pin_4, GPIO_Mode_InOut_QBD);
|
||||
// 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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user