本帖最后由 xld0932 于 2024-8-5 12:20 编辑
#申请原创# @21小跑堂
1.概述
从之前分享的《解析SLCD例程设计思路,加速终端产品应用开发》一文中得到启发,在产品功能需求丰富的情况下,我们可以选择/评估MM32L0130这个集成了SLCD段码液晶显示屏驱动的系列MCU;但对于功能简单,对芯片成本要求又比较高时,选择分立器件或者是一个不错的选择;MM32推出的高性价比的MCU如MM32G0001系列,超值系列的MM32F0010\MM32F0020都是一个不错的选择;再结合当前SLCD显示驱动芯片的价格优势,整体成本可以做到1块钱以内。市面主比较应用的SLCD驱动芯片品牌有合泰的、深圳天微、无锡中微的等等,客户可以依据自己的功能需要,选择性价高的驱动芯片型号。
针对不同厂家的SLCD段码液晶显示屏的驱动芯片,其控制原理及接线方式都大同小异;为了方便程序移植、实现方便,我们基于MM32上面介绍到的3款芯片实现了一个通用的段码液晶显示屏程序架构,下面我们一起来详细的讲解一下。
2、硬件设计
2.1.基于MM32G0001的SLCD原理图
2.2.基于MM32F0010的SLCD原理图
2.3.基于MM32F0020的SLCD原理图
3.硬件实物
4.程序架构
5.程序实现(以MM32F0010为例)
5.1.SLCD驱动程序设计
#ifndef __SLCD_DRIVER_H
#define __SLCD_DRIVER_H
#ifdef __cplusplus
extern "C" {
#endif
#include <string.h>
#include "hal_conf.h"
#define SLCD_DRIVER_COM (4)
#define SLCD_DRIVER_SEG (32)
#define SLCD_DRIVER_CS_RCC RCC_AHBENR_GPIOA
#define SLCD_DRIVER_CS_GPIO GPIOA
#define SLCD_DRIVER_CS_PIN GPIO_Pin_7
#define SLCD_DRIVER_WR_RCC RCC_AHBENR_GPIOA
#define SLCD_DRIVER_WR_GPIO GPIOA
#define SLCD_DRIVER_WR_PIN GPIO_Pin_5
#define SLCD_DRIVER_DATA_RCC RCC_AHBENR_GPIOA
#define SLCD_DRIVER_DATA_GPIO GPIOA
#define SLCD_DRIVER_DATA_PIN GPIO_Pin_4
#define SLCD_DRIVER_CS_H() GPIO_WriteBit(SLCD_DRIVER_CS_GPIO, SLCD_DRIVER_CS_PIN, Bit_SET)
#define SLCD_DRIVER_CS_L() GPIO_WriteBit(SLCD_DRIVER_CS_GPIO, SLCD_DRIVER_CS_PIN, Bit_RESET)
#define SLCD_DRIVER_WR_H() GPIO_WriteBit(SLCD_DRIVER_WR_GPIO, SLCD_DRIVER_WR_PIN, Bit_SET)
#define SLCD_DRIVER_WR_L() GPIO_WriteBit(SLCD_DRIVER_WR_GPIO, SLCD_DRIVER_WR_PIN, Bit_RESET)
#define SLCD_DRIVER_DATA_H() GPIO_WriteBit(SLCD_DRIVER_DATA_GPIO, SLCD_DRIVER_DATA_PIN, Bit_SET)
#define SLCD_DRIVER_DATA_L() GPIO_WriteBit(SLCD_DRIVER_DATA_GPIO, SLCD_DRIVER_DATA_PIN, Bit_RESET)
void SLCD_DRIVER_UpdateRAM(void);
void SLCD_DRIVER_ModifyRAM(uint8_t COMn, uint8_t SEGn, uint8_t State);
void SLCD_DRIVER_Fill(uint8_t Data);
void SLCD_DRIVER_Init(void);
#ifdef __cplusplus
}
#endif
#endif
#include "slcd_driver.h"
uint8_t SLCD_DRIVER_RAM[SLCD_DRIVER_SEG];
void SLCD_DRIVER_InitGPIO(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* CS */
RCC_AHBPeriphClockCmd(SLCD_DRIVER_CS_RCC, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = SLCD_DRIVER_CS_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(SLCD_DRIVER_CS_GPIO, &GPIO_InitStruct);
GPIO_WriteBit(SLCD_DRIVER_CS_GPIO, SLCD_DRIVER_CS_PIN, Bit_SET);
/* WR */
RCC_AHBPeriphClockCmd(SLCD_DRIVER_WR_RCC, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = SLCD_DRIVER_WR_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(SLCD_DRIVER_WR_GPIO, &GPIO_InitStruct);
GPIO_WriteBit(SLCD_DRIVER_WR_GPIO, SLCD_DRIVER_WR_PIN, Bit_SET);
/* DATA */
RCC_AHBPeriphClockCmd(SLCD_DRIVER_DATA_RCC, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = SLCD_DRIVER_DATA_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(SLCD_DRIVER_DATA_GPIO, &GPIO_InitStruct);
GPIO_WriteBit(SLCD_DRIVER_DATA_GPIO, SLCD_DRIVER_DATA_PIN, Bit_SET);
}
void SLCD_DRIVER_Write(uint16_t Data, uint8_t Bits)
{
SLCD_DRIVER_CS_L(); /* CS--->L */
for (uint8_t i = 0; i < Bits; i++)
{
SLCD_DRIVER_WR_L(); /* WR--->L */
if ((Data << i) & 0x8000)
{
SLCD_DRIVER_DATA_H(); /* DATA->H */
}
else
{
SLCD_DRIVER_DATA_L(); /* DATA->L */
}
SLCD_DRIVER_WR_H(); /* WR--->H */
}
SLCD_DRIVER_CS_H(); /* CS--->H */
}
void SLCD_DRIVER_UpdateRAM(void)
{
uint16_t Data = 0;
for (uint8_t i = 0; i < SLCD_DRIVER_SEG; i++)
{
/*Write RAM : 101 a5a4a3a2a1a0 d0d1d2d3*/
Data = 0x05;
Data <<= 0x06;
Data |= (i & 0x3F);
Data <<= 0x04;
Data |= (SLCD_DRIVER_RAM[i] & 0x0F);
Data <<= 0x03;
SLCD_DRIVER_Write(Data, 0x0D);
}
}
void SLCD_DRIVER_ModifyRAM(uint8_t COMn, uint8_t SEGn, uint8_t State)
{
if (State)
{
SLCD_DRIVER_RAM[SEGn] |= (0x01 << COMn);
}
else
{
SLCD_DRIVER_RAM[SEGn] &= ~(0x01 << COMn);
}
}
void SLCD_DRIVER_Fill(uint8_t Data)
{
memset(SLCD_DRIVER_RAM, Data, sizeof(SLCD_DRIVER_RAM));
SLCD_DRIVER_UpdateRAM();
}
void SLCD_DRIVER_Init(void)
{
SLCD_DRIVER_InitGPIO();
memset(SLCD_DRIVER_RAM, 0, sizeof(SLCD_DRIVER_RAM));
SLCD_DRIVER_Write(0x8020 /*0b 1000 0000 0010 0000*/, 0x0C); // SYS_EN
SLCD_DRIVER_Write(0x8060 /*0b 1000 0000 0110 0000*/, 0x0C); // LCD_ON
SLCD_DRIVER_Write(0x8300 /*0b 1000 0011 0000 0000*/, 0x0C); // RC256K
SLCD_DRIVER_Write(0x8520 /*0b 1000 0101 0010 0000*/, 0x0C); // BIAS 1/3
SLCD_DRIVER_Write(0x9C60 /*0b 1001 1100 0110 0000*/, 0x0C); // NORMAL
SLCD_DRIVER_UpdateRAM();
}
5.2.SLCD共用函数设计
#ifndef __SLCD_H
#define __SLCD_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
typedef struct
{
char ch; /*字符索引*/
uint8_t Segment[8]; /*字符对应的段编码*/
} SLCD_8SEG_TypeDef;
#define SLCD_8SEG_NUM (38)
int SLCD_Search8Segment(const char ch, uint8_t *Segment);
int SLCD_SearchCOMnSEGn(const char *str, uint8_t *COMn, uint8_t *SEGn);
#ifdef __cplusplus
}
#endif
#endif
#include "slcd.h"
#include "slcd_driver.h"
const SLCD_8SEG_TypeDef SLCD_8SEG_Table[SLCD_8SEG_NUM] =
{
{' ', {0, 0, 0, 0, 0, 0, 0, 0}},
{'0', {1, 1, 1, 1, 1, 1, 0, 0}},
{'1', {0, 1, 1, 0, 0, 0, 0, 0}},
{'2', {1, 1, 0, 1, 1, 0, 1, 0}},
{'3', {1, 1, 1, 1, 0, 0, 1, 0}},
{'4', {0, 1, 1, 0, 0, 1, 1, 0}},
{'5', {1, 0, 1, 1, 0, 1, 1, 0}},
{'6', {1, 0, 1, 1, 1, 1, 1, 0}},
{'7', {1, 1, 1, 0, 0, 0, 0, 0}},
{'8', {1, 1, 1, 1, 1, 1, 1, 0}},
{'9', {1, 1, 1, 1, 0, 1, 1, 0}},
{'A', {1, 1, 1, 0, 1, 1, 1, 0}},
{'b', {0, 0, 1, 1, 1, 1, 1, 0}},
{'c', {0, 0, 0, 1, 1, 0, 1, 0}},
{'C', {1, 0, 0, 1, 1, 1, 0, 0}},
{'d', {0, 1, 1, 1, 1, 0, 1, 0}},
{'E', {1, 0, 0, 1, 1, 1, 1, 0}},
{'F', {1, 0, 0, 0, 1, 1, 1, 0}},
{'g', {1, 1, 1, 1, 0, 1, 1, 0}},
{'H', {0, 1, 1, 0, 1, 1, 1, 0}},
{'h', {0, 0, 1, 0, 1, 1, 1, 0}},
{'i', {0, 0, 1, 0, 0, 0, 0, 0}},
{'I', {0, 0, 0, 0, 1, 1, 0, 0}},
{'J', {0, 1, 1, 1, 1, 0, 0, 0}},
{'l', {0, 0, 0, 0, 1, 1, 0, 0}},
{'L', {0, 0, 0, 1, 1, 1, 0, 0}},
{'n', {0, 0, 1, 0, 1, 0, 1, 0}},
{'o', {0, 0, 1, 1, 1, 0, 1, 0}},
{'O', {1, 1, 1, 1, 1, 1, 0, 0}},
{'P', {1, 1, 0, 0, 1, 1, 1, 0}},
{'q', {1, 1, 1, 0, 0, 1, 1, 0}},
{'r', {0, 0, 0, 0, 1, 0, 1, 0}},
{'S', {1, 0, 1, 1, 0, 1, 1, 0}},
{'t', {0, 0, 0, 1, 1, 1, 1, 0}},
{'u', {0, 0, 1, 1, 1, 0, 0, 0}},
{'U', {0, 1, 1, 1, 1, 1, 0, 0}},
{'y', {0, 1, 1, 1, 0, 1, 1, 0}},
{'-', {0, 0, 0, 0, 0, 0, 1, 0}},
};
int SLCD_Search8Segment(const char ch, uint8_t *Segment)
{
uint8_t i = 0, j = 0;
for (i = 0; i < SLCD_8SEG_NUM; i++)
{
if (SLCD_8SEG_Table[i].ch == ch)
{
for (j = 0; j < 8; j++)
{
Segment[j] = SLCD_8SEG_Table[i].Segment[j];
}
return (i);
}
}
return (-1);
}
const char SLCD_TruthTable[SLCD_DRIVER_COM][SLCD_DRIVER_SEG][5] =
{
{"L4 ","W2 ","W1 ","4A ","4F ","3A ","3F ","2A ","1F ","1A ","2F ","5D ","DP5 ","6D ","DP6 ","7D ","DP7 ","S1 ","S8 ","8D ","DP8 ","9D ","DP9 ","10D ","S9 "," "," "," "," "," "," "," "},
{"L3 ","W3 ","T1 ","4B ","4G ","3B ","3G ","2B ","1G ","1B ","2G ","5E ","5C ","6E ","6C ","7E ","7C ","S2 ","S7 ","8E ","8C ","9E ","9C ","10E ","10C "," "," "," "," "," "," "," "},
{"L2 ","W4 ","COL3","4C ","4E ","3C ","3E ","2C ","1E ","1C ","2E ","5G ","5B ","6G ","6B ","7G ","7B ","S3 ","S6 ","8G ","8B ","9G ","9B ","10G ","10B "," "," "," "," "," "," "," "},
{"L1 ","W5 ","COL2","COL1","4D ","DP3 ","3D ","DP2 ","1D ","DP1 ","2D ","5F ","5A ","6F ","6A ","7F ","7A ","S4 ","S5 ","8F ","8A ","9F ","9A ","10F ","10A "," "," "," "," "," "," "," "},
};
int SLCD_SearchCOMnSEGn(const char *str, uint8_t *COMn, uint8_t *SEGn)
{
uint8_t i = 0, j = 0;
for (i = 0; i < SLCD_DRIVER_COM; i++)
{
for (j = 0; j < SLCD_DRIVER_SEG; j++)
{
if (strcmp(str, SLCD_TruthTable[i][j]) == 0)
{
*COMn = i;
*SEGn = j;
return (0);
}
}
}
*COMn = 0xFF;
*SEGn = 0xFF;
return (-1);
}
5.3.SLCD API功能设计
#ifndef __SLCD_API_H
#define __SLCD_API_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
void SLCD_DisplayDigit(uint8_t Index, char ch);
void SLCD_DisplayPoint(uint8_t Index, uint8_t State);
void SLCD_DisplayCOL(uint8_t Index, uint8_t State);
void SLCD_DisplayW(uint8_t Index, uint8_t State);
void SLCD_DisplayL(uint8_t Index, uint8_t State);
void SLCD_DisplayS(uint8_t Index, uint8_t State);
void SLCD_DisplayT(uint8_t Index, uint8_t State);
void SLCD_DisplayALL(void);
void SLCD_DisplayCLR(void);
#ifdef __cplusplus
}
#endif
#endif
#include "slcd_api.h"
#include "slcd.h"
#include "slcd_driver.h"
const char DigitTable[10][7][5] =
{
{"1A ", "1B ", "1C ", "1D ", "1E ", "1F ", "1G "},
{"2A ", "2B ", "2C ", "2D ", "2E ", "2F ", "2G "},
{"3A ", "3B ", "3C ", "3D ", "3E ", "3F ", "3G "},
{"4A ", "4B ", "4C ", "4D ", "4E ", "4F ", "4G "},
{"5A ", "5B ", "5C ", "5D ", "5E ", "5F ", "5G "},
{"6A ", "6B ", "6C ", "6D ", "6E ", "6F ", "6G "},
{"7A ", "7B ", "7C ", "7D ", "7E ", "7F ", "7G "},
{"8A ", "8B ", "8C ", "8D ", "8E ", "8F ", "8G "},
{"9A ", "9B ", "9C ", "9D ", "9E ", "9F ", "9G "},
{"10A ", "10B ", "10C ", "10D ", "10E ", "10F ", "10G "}
};
void SLCD_DisplayDigit(uint8_t Index, char ch)
{
uint8_t i = 0, Segment[8];
uint8_t COMn = 0, SEGn = 0;
if ((Index >= 1) && (Index <= 10))
{
Index--;
if (SLCD_Search8Segment(ch, Segment) != -1)
{
for (i = 0; i < 7; i++)
{
if (SLCD_SearchCOMnSEGn(DigitTable[Index][i], &COMn, &SEGn) != -1)
{
SLCD_DRIVER_ModifyRAM(COMn, SEGn, Segment[i]);
}
}
SLCD_DRIVER_UpdateRAM();
}
}
}
const char DP_Table[9][5] =
{
"DP1 ", "DP2 ", "DP3 ", "DP4 ","DP5 ","DP6 ","DP7 ","DP8 ","DP9 "
};
void SLCD_DisplayPoint(uint8_t Index, uint8_t State)
{
uint8_t COMn = 0, SEGn = 0;
if ((Index >= 1) && (Index <= 9))
{
Index--;
if (SLCD_SearchCOMnSEGn(DP_Table[Index], &COMn, &SEGn) != -1)
{
SLCD_DRIVER_ModifyRAM(COMn, SEGn, State);
}
SLCD_DRIVER_UpdateRAM();
}
}
const char COL_Table[3][5] =
{
"COL1", "COL2", "COL3"
};
void SLCD_DisplayCOL(uint8_t Index, uint8_t State)
{
uint8_t COMn = 0, SEGn = 0;
if ((Index >= 1) && (Index <= 3))
{
Index--;
if (SLCD_SearchCOMnSEGn(COL_Table[Index], &COMn, &SEGn) != -1)
{
SLCD_DRIVER_ModifyRAM(COMn, SEGn, State);
}
SLCD_DRIVER_UpdateRAM();
}
}
const char W_Table[5][5] =
{
"W1 ", "W2 ", "W3 ", "W4 ", "W5 "
};
void SLCD_DisplayW(uint8_t Index, uint8_t State)
{
uint8_t COMn = 0, SEGn = 0;
if ((Index >= 1) && (Index <= 5))
{
Index--;
if (SLCD_SearchCOMnSEGn(W_Table[Index], &COMn, &SEGn) != -1)
{
SLCD_DRIVER_ModifyRAM(COMn, SEGn, State);
}
SLCD_DRIVER_UpdateRAM();
}
}
const char L_Table[4][5] =
{
"L1 ", "L2 ", "L3 ", "L4 "
};
void SLCD_DisplayL(uint8_t Index, uint8_t State)
{
uint8_t COMn = 0, SEGn = 0;
if ((Index >= 1) && (Index <= 4))
{
Index--;
if (SLCD_SearchCOMnSEGn(L_Table[Index], &COMn, &SEGn) != -1)
{
SLCD_DRIVER_ModifyRAM(COMn, SEGn, State);
}
SLCD_DRIVER_UpdateRAM();
}
}
const char S_Table[9][5] =
{
"S1 ", "S2 ", "S3 ", "S4 ", "S5 ", "S6 ", "S7 ", "S8 ", "S9 "
};
void SLCD_DisplayS(uint8_t Index, uint8_t State)
{
uint8_t COMn = 0, SEGn = 0;
if ((Index >= 1) && (Index <= 9))
{
Index--;
if (SLCD_SearchCOMnSEGn(S_Table[Index], &COMn, &SEGn) != -1)
{
SLCD_DRIVER_ModifyRAM(COMn, SEGn, State);
}
SLCD_DRIVER_UpdateRAM();
}
}
const char T_Table[1][5] =
{
"T1 "
};
void SLCD_DisplayT(uint8_t Index, uint8_t State)
{
uint8_t COMn = 0, SEGn = 0;
if (Index == 1)
{
Index--;
if (SLCD_SearchCOMnSEGn(T_Table[Index], &COMn, &SEGn) != -1)
{
SLCD_DRIVER_ModifyRAM(COMn, SEGn, State);
}
SLCD_DRIVER_UpdateRAM();
}
}
void SLCD_DisplayALL(void)
{
SLCD_DRIVER_Fill(0xFF);
}
void SLCD_DisplayCLR(void)
{
SLCD_DRIVER_Fill(0x00);
}
5.4.Protocol自定义控制协议
#ifndef __PROTOCOL_H
#define __PROTOCOL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
void ProtocolAnalyzing(uint8_t *Buffer, uint8_t Length);
#ifdef __cplusplus
}
#endif
#endif
#include "protocol.h"
#include "slcd_api.h"
uint8_t Protocol_ASCII_TO_Hex(char ch)
{
char HEX_Table[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
for (uint8_t i = 0; i < 16; i++)
{
if (ch == HEX_Table[i])
{
return (i);
}
}
return (0xFF);
}
void ProtocolAnalyzing(uint8_t *Buffer, uint8_t Length)
{
if (Length == 3)
{
if (Buffer[1] == 'F')
{
SLCD_DisplayALL();
}
else if (Buffer[1] == 'E')
{
SLCD_DisplayCLR();
}
else
{
}
}
/* @T[T1]# */
if (Length == 4)
{
if ((Buffer[0] == '@') && (Buffer[3] == '#'))
{
if (Buffer[1] == 'T')
{
SLCD_DisplayT(1, Buffer[2] - 0x30);
}
}
}
/* @D[Index][ch]# */
/* @P[Index][State]# */
/* @C[Index][State]# */
/* @W[Index][State]# */
/* @L[Index][State]# */
/* @S[Index][State]# */
/* @T[Index][State]# */
if (Length == 5)
{
if ((Buffer[0] == '@') && (Buffer[4] == '#'))
{
if (Buffer[1] == 'D')
{
SLCD_DisplayDigit(Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3]);
}
else if (Buffer[1] == 'P')
{
SLCD_DisplayPoint(Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3] - 0x30);
}
else if (Buffer[1] == 'C')
{
SLCD_DisplayCOL( Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3] - 0x30);
}
else if (Buffer[1] == 'W')
{
SLCD_DisplayW( Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3] - 0x30);
}
else if (Buffer[1] == 'L')
{
SLCD_DisplayL( Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3] - 0x30);
}
else if (Buffer[1] == 'S')
{
SLCD_DisplayS( Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3] - 0x30);
}
else if (Buffer[1] == 'T')
{
SLCD_DisplayT( Protocol_ASCII_TO_Hex(Buffer[2]), Buffer[3] - 0x30);
}
else
{
}
}
}
/* @C[COL1][COL2][COL3]# */
if (Length == 6)
{
if ((Buffer[0] == '@') && (Buffer[5] == '#'))
{
if (Buffer[1] == 'C')
{
SLCD_DisplayCOL(1, Buffer[2] - 0x30);
SLCD_DisplayCOL(2, Buffer[3] - 0x30);
SLCD_DisplayCOL(3, Buffer[4] - 0x30);
}
}
}
/* @L[L1][L2][L3][L4]# */
if (Length == 7)
{
if ((Buffer[0] == '@') && (Buffer[6] == '#'))
{
if (Buffer[1] == 'L')
{
SLCD_DisplayL(1, Buffer[2] - 0x30);
SLCD_DisplayL(2, Buffer[3] - 0x30);
SLCD_DisplayL(3, Buffer[4] - 0x30);
SLCD_DisplayL(4, Buffer[5] - 0x30);
}
}
}
/* @W[W1][W2][W3][W4][W5]# */
if (Length == 8)
{
if ((Buffer[0] == '@') && (Buffer[7] == '#'))
{
if (Buffer[1] == 'W')
{
SLCD_DisplayW(1, Buffer[2] - 0x30);
SLCD_DisplayW(2, Buffer[3] - 0x30);
SLCD_DisplayW(3, Buffer[4] - 0x30);
SLCD_DisplayW(4, Buffer[5] - 0x30);
SLCD_DisplayW(5, Buffer[6] - 0x30);
}
}
}
/* @P[DP1][DP2][DP3][DP4][DP5][DP6][DP7][DP8][DP9]# */
/* @S[S1][S2][S3][S4][S5][S6][S7][S8][S9]# */
if (Length == 12)
{
if ((Buffer[0] == '@') && (Buffer[11] == '#'))
{
if (Buffer[1] == 'P')
{
SLCD_DisplayPoint(1, Buffer[2] - 0x30);
SLCD_DisplayPoint(2, Buffer[3] - 0x30);
SLCD_DisplayPoint(3, Buffer[4] - 0x30);
SLCD_DisplayPoint(4, Buffer[5] - 0x30);
SLCD_DisplayPoint(5, Buffer[6] - 0x30);
SLCD_DisplayPoint(6, Buffer[7] - 0x30);
SLCD_DisplayPoint(7, Buffer[8] - 0x30);
SLCD_DisplayPoint(8, Buffer[9] - 0x30);
SLCD_DisplayPoint(9, Buffer[10] - 0x30);
}
else if (Buffer[1] == 'S')
{
SLCD_DisplayS(1, Buffer[2] - 0x30);
SLCD_DisplayS(2, Buffer[3] - 0x30);
SLCD_DisplayS(3, Buffer[4] - 0x30);
SLCD_DisplayS(4, Buffer[5] - 0x30);
SLCD_DisplayS(5, Buffer[6] - 0x30);
SLCD_DisplayS(6, Buffer[7] - 0x30);
SLCD_DisplayS(7, Buffer[8] - 0x30);
SLCD_DisplayS(8, Buffer[9] - 0x30);
SLCD_DisplayS(9, Buffer[10] - 0x30);
}
else
{
}
}
}
/* @D[1][2][3][4][5][6][7][8][9][10]# */
if (Length == 13)
{
if ((Buffer[0] == '@') && (Buffer[12] == '#'))
{
if (Buffer[1] == 'D')
{
SLCD_DisplayDigit(1, Buffer[2]);
SLCD_DisplayDigit(2, Buffer[3]);
SLCD_DisplayDigit(3, Buffer[4]);
SLCD_DisplayDigit(4, Buffer[5]);
SLCD_DisplayDigit(5, Buffer[6]);
SLCD_DisplayDigit(6, Buffer[7]);
SLCD_DisplayDigit(7, Buffer[8]);
SLCD_DisplayDigit(8, Buffer[9]);
SLCD_DisplayDigit(9, Buffer[10]);
SLCD_DisplayDigit(10, Buffer[11]);
}
}
}
}
6.显示效果
6.1.MM32G0001驱动SLCD显示效果
6.2.MM32F0010驱动SLCD显示效果
6.3.MM32F0020驱动SLCD显示效果
7.附件资料
7.1.GDC0689S(T)P10V3B显示屏:
GDC0689S(T)P10V3B.pdf
(309.4 KB)
7.2.GDC04212S(T)P10V3B显示屏:
GDC04212S(T)P10V3B.pdf
(220.54 KB)
7.3.GDC04362S(T)P10V3T显示屏:
GDC04362S(T)P10V3T.pdf
(419.84 KB)
7.4.MM32G0001原理图:
Schematic_MM32G0001_LCD.pdf
(71.6 KB)
7.5.MM32F0010原理图:
Schematic_MM32F0010_LCD.pdf
(71.8 KB)
7.6.MM32F0020原理图:
Schematic_MM32F0020_LCD.pdf
(78.62 KB)
7.7.MM32G0001工程源码:
MM32G0001.zip
(568.38 KB)
7.8.MM32F0010工程源码:
MM32F0010.zip
(591.5 KB)
7.9.MM32F0020工程源码:
MM32F0020.zip
(603.62 KB)
8.扩展应用
以上实现的段码液晶显示屏程序架构同样适用于段码形式的LED显示屏上,后面会分享一个段码LED应用的多功能闹钟,期待ing……
|
此文章已获得独家原创/原创奖标签,著作权归21ic所有,未经允许禁止转载。
打赏榜单
21小跑堂 打赏了 60.00 元 2024-08-08 理由:恭喜通过原创审核!期待您更多的原创作品~
|
电路完整,代码详细,架构清晰,一问解决MM32上的段码液晶显示屏的使用方式。极具参考价值。