补充:
本开发板基于新定义MCU(RD8G37Q48RJ)为主控,主要用于实现的旋转LED电子钟功能:LED亮灭表示秒刻度,数码管显示时间,液晶屏显示日期,BM8363时钟芯片提供RTC计时。
主控
RD8G37Q48RJ 高速 1T 8051内核 Flash MCU,48pin,8 Kbytes SRAM ,128 Kbytes Flash,0~4 Kbytes LDROM,6 Kbytes独立EEPROM,17路12位ADC,14路16位PWM,5个定时器,乘除法器,1路UART,6路USCI三选一(UART/SPI/IIC),LCD/LED驱动,CRC校验模块,模拟比较器
60个LED用于表示秒刻度
SEG(8个):(Seg8、Seg9、Seg10、Seg11、Seg12、Seg13、Seg14、Seg15)
COM(8个):(COM0、COM1、COM2、COM3、COM4、COM5、COM6、COM7)
8*8=64个LED,秒刻度使用其中60个LED.
数码管
SEG(8个):(Seg4、Seg5、Seg6、Seg7)
COM(8个):(COM0、COM1、COM2、COM3、COM4、COM5、COM6、COM7)
4*8=32个LED
新定义RD8G37的LED驱动
RD8G37系列内部集成了硬件LCD/LED显示驱动电路,可以方便用户实现LCD和LED的显示驱动。LCD和LED显示驱动二选一;4种显示驱动模式可选:8*24、6*26、5*27、4*28;
利用8(COM)*8(SEG)=64来显示电子钟60秒钟,多出的4个LED用来表示刻钟(15分钟1个刻度)。
利用8(COM)*4(SEG)=32来控制数码管。
DDIC固件库函数提供了DDIC_Control可以控制SEG和COM脚对应LCD/LED的亮灭
/*****************************************************
*函数名称:void DDIC_Control(DDIC_Control_SEG_TypeDef DDIC_Seg,uint8_t DDIC_Com,DDIC_Control_Status DDIC_Contr)
*函数功能:控制输入的SEG和COM脚对应LCD/LED的亮灭
*入口参数:
DDIC_Control_SEG_TypeDef:DDIC_Seg:选择控制的SEG口
DDIC_Control_COM_TypeDef:DDIC_Com:选择控制的COM口(uint8_t作为入参,方便进行位或操作)
DDIC_Control_Status:DDIC_Contr:控制状态
*出口参数:void
*****************************************************/
void DDIC_Control(DDIC_Control_SEG_TypeDef DDIC_Seg, uint8_t DDIC_Com,
DDIC_Control_Status DDIC_Contr)
{
if (DDIC_Contr)
{
LCDRAM[DDIC_Seg] |= DDIC_Com;
}
else
{
LCDRAM[DDIC_Seg] &= (~DDIC_Com);
}
}
先定义一个结构用于定义后面的SEG和COM对
typedef struct {
DDIC_Control_SEG_TypeDef seg;
DDIC_Control_COM_TypeDef com;
}LedSegCom;
一对SEG和COM,控制一个LED。
对于60个秒刻度,可以建立一个数组对应每个秒钟的SEG和COM:
LedSegCom secondLedSegArray[60]={
DDIC_SEG8,DDIC_COM0, //0秒
DDIC_SEG8,DDIC_COM1, //1秒
DDIC_SEG8,DDIC_COM2, //2秒
DDIC_SEG8,DDIC_COM3, //3秒
...
}
通过下面函数指定那个秒钟LED的亮灭:
void TurnOnSecondLed(unsigned char second,bit bOnOff)
{
if(bOnOff)
{
DDIC_Control(secondLedSegArray[second].seg,secondLedSegArray[second].com,DDIC_Control_ON);
}else
{
DDIC_Control(secondLedSegArray[second].seg,secondLedSegArray[second].com,DDIC_Control_OFF);
}
}
控制秒刻度亮灭
void TurnOnSecondLed(unsigned char second,bit bOnOff)
{
if(bOnOff)
{
DDIC_Control(secondLedSegArray[second].seg,secondLedSegArray[second].com,DDIC_Control_ON);
}else
{
DDIC_Control(secondLedSegArray[second].seg,secondLedSegArray[second].com,DDIC_Control_OFF);
}
}
控制刻度(15分钟)亮灭
void TurnOnQuarterHour(unsigned char quarter,bit bOnOff)
{
if(bOnOff)
{
DDIC_Control(quarterHour[quarter].seg,quarterHour[quarter].com,DDIC_Control_ON);
}else
{
DDIC_Control(quarterHour[quarter].seg,quarterHour[quarter].com,DDIC_Control_OFF);
}
}
控制数码管
数码管真值表
//0,1,2,3,...9,A,b,...,F
unsigned char digitalTruthTable[]={ //15, 16上 17右 18下, 19, 20, 21
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x00,0x01,0x02,0x04,0x08,0x10,0x20
};
15-21:对应数码管特殊显示,如数码管上下横线亮,只有右边的竖线亮,只有左边的竖线亮等...
数码管对应的SEG和COM数组:
LedSegCom digitalTube[4][8]={
{DDIC_SEG4,DDIC_COM0,DDIC_SEG4,DDIC_COM1,DDIC_SEG4,DDIC_COM2,DDIC_SEG4,DDIC_COM3,
DDIC_SEG4,DDIC_COM4,DDIC_SEG4,DDIC_COM5,DDIC_SEG4,DDIC_COM6,DDIC_SEG4,DDIC_COM7,
},
{DDIC_SEG5,DDIC_COM0,DDIC_SEG5,DDIC_COM1,DDIC_SEG5,DDIC_COM2,DDIC_SEG5,DDIC_COM3,
DDIC_SEG5,DDIC_COM4,DDIC_SEG5,DDIC_COM5,DDIC_SEG5,DDIC_COM6,DDIC_SEG5,DDIC_COM7,
},
{DDIC_SEG6,DDIC_COM0,DDIC_SEG6,DDIC_COM1,DDIC_SEG6,DDIC_COM2,DDIC_SEG6,DDIC_COM3,
DDIC_SEG6,DDIC_COM4,DDIC_SEG6,DDIC_COM5,DDIC_SEG6,DDIC_COM6,DDIC_SEG6,DDIC_COM7,
},
{DDIC_SEG7,DDIC_COM0,DDIC_SEG7,DDIC_COM1,DDIC_SEG7,DDIC_COM2,DDIC_SEG7,DDIC_COM3,
DDIC_SEG7,DDIC_COM4,DDIC_SEG7,DDIC_COM5,DDIC_SEG7,DDIC_COM6,DDIC_SEG7,DDIC_COM7,
},
};
数码管控制函数:
void TurnOnDitialTube(unsigned char digital,unsigned char chNum)
{
unsigned char i,dtt;
dtt=digitalTruthTable[chNum];
for(i=0;i<8;i++)
{
if(dtt&0x01){
DDIC_Control(digitalTube[digital][i].seg,digitalTube[digital][i].com,DDIC_Control_ON);
}else
{
DDIC_Control(digitalTube[digital][i].seg,digitalTube[digital][i].com,DDIC_Control_OFF);
}
dtt=dtt>>1;
}
}
//控制数码管中的冒号亮灭
void TurnOnColon(bit bOnOff)
{
if(bOnOff)
{
DDIC_Control(DDIC_SEG5,DDIC_COM7,DDIC_Control_ON);
}else
{
DDIC_Control(DDIC_SEG5,DDIC_COM7,DDIC_Control_OFF);
}
}
16机制数据控制数码管
void TurnOnDitialTubeByHex(unsigned char digital,unsigned char Hex)
{
unsigned char i,dtt;
dtt=Hex;
for(i=0;i<8;i++)
{
if(dtt&0x01){
DDIC_Control(digitalTube[digital][i].seg,digitalTube[digital][i].com,DDIC_Control_ON);
}else
{
DDIC_Control(digitalTube[digital][i].seg,digitalTube[digital][i].com,DDIC_Control_OFF);
}
dtt=dtt>>1;
}
}
定义了以上函数就可以开始控制点灯了
1、依次点灯一圈,每次点亮一灯
for(i=0;i<60;i++)
{
TurnOnSecondLed(i,1);
Delay(100);
TurnOnSecondLed(i,0);
Delay(100);
}
2、奇偶分别点灯
for(j=0;j<10;j++)
{
for(i=0;i<60;i++)
{
if(i%2==0)
{
TurnOnSecondLed(i,1);
}else
TurnOnSecondLed(i,0);
Delay(100);
if(i%2==0)
{
TurnOnSecondLed(i,0);
}else
TurnOnSecondLed(i,1);
}
}
3、每隔5个灯控制依次点灯
for(j=0;j<10;j++)
{
for(i=0;i<60;i++)
{
if(i%5==0) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
if(i%5==1) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
if(i%5==2) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
if(i%5==3) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
if(i%5==4) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
TurnOnSecondLed(i,0);
}
不一一解释了,全部源码:
//************************************************************
// Copyright (c)
// FileName : main.c
// Function : Main Function
// Instructions : Contains the MCU initialization function and its H file
//************************************************************
/********************Includes************************************************************************/
#include "SC_Init.h" // MCU initialization header file, including all firmware library header files
#include "SC_it.h"
#include "..\Drivers\SCDriver_list.h"
#include "HeadFiles\SysFunVarDefine.h"
#include "ILI9225.h"
#include "ClockLed.h"
/**************************************Generated by EasyCodeCube*************************************/
//Forbid editing areas between the labels !!!
/*************************************.Generated by EasyCodeCube.************************************/
/*****************************************************************************************************
* Function Name: main
* Description : This function implements main function.
* Arguments : None
* Return Value : None
******************************************************************************************************/
//extern int yanhua();
void prewhile(void)
{
uint8_t i,j,secondIndex=0;
InitLCD();
clrScr(VGA_RED);
//GUI_WriteASCII(0,20,"Lighting",VGA_WHITE,VGA_RED);
GUI_Write16CnChar(32,43,"新年花灯",VGA_WHITE,VGA_RED);
GUI_WriteASCII8x16(12,68,"EEWORLD 2025",VGA_WHITE,VGA_RED);
for(i=0;i<60;i++)
{
TurnOnSecondLed(i,1);
Delay(100);
TurnOnSecondLed(i,0);
Delay(100);
}
clrScr(VGA_Orange_Red);
GUI_Write16CnChar(32,43,"新年花灯",VGA_WHITE,VGA_Orange_Red);
GUI_WriteASCII8x16(12,68,"EEWORLD 2025",VGA_WHITE,VGA_Orange_Red);
for(j=0;j<10;j++)
{
for(i=0;i<60;i++)
{
if(i%2==0)
{
TurnOnSecondLed(i,1);
}else
TurnOnSecondLed(i,0);
Delay(100);
if(i%2==0)
{
TurnOnSecondLed(i,0);
}else
TurnOnSecondLed(i,1);
}
}
clrScr(VGA_GREEN);
GUI_Write16CnChar(32,43,"新年花灯",VGA_WHITE,VGA_GREEN);
GUI_WriteASCII8x16(12,68,"EEWORLD 2025",VGA_WHITE,VGA_GREEN);
for(i=0;i<60;i++)
{
TurnOnSecondLed(i,0);
}
for(j=0;j<10;j++)
{
for(i=0;i<60;i++)
{
if(i%5==0) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
if(i%5==1) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
if(i%5==2) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
if(i%5==3) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
if(i%5==4) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
TurnOnSecondLed(i,0);
}
for(i=0;i<60;i++)
{
if(i%5==4) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
if(i%5==3) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
if(i%5==2) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
if(i%5==1) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
if(i%5==0) TurnOnSecondLed(i,1);
}
Delay(1000);
for(i=0;i<60;i++)
{
TurnOnSecondLed(i,0);
}
}
clrScr(VGA_BLUE);
GUI_Write16CnChar(32,43,"新年花灯",VGA_WHITE,VGA_BLUE);
GUI_WriteASCII8x16(12,68,"EEWORLD 2025",VGA_WHITE,VGA_BLUE);
for(j=0;j<20;j++)
{
for(i=0;i<60;i++)
{
TurnOnSecondLed(i,0);
}
Delay(1000);
for(i=0;i<60;i++)
{
TurnOnSecondLed(i,1);
}
Delay(1000);
}
for(i=0;i<60;i++)
{
TurnOnSecondLed(i,0);
}
clrScr(VGA_PURPLE);
GUI_Write16CnChar(32,43,"新年花灯",VGA_WHITE,VGA_PURPLE);
GUI_WriteASCII8x16(12,68,"EEWORLD 2025",VGA_WHITE,VGA_PURPLE);
for(i=0;i<4;i++)
{
TurnOnQuarterHour(i,1);
}
for(j=0;j<180;j++)
{
if(j%10==0)
{
TurnOnDitialTubeByHex(0,digitalTruthTable[16]|digitalTruthTable[20]);
TurnOnDitialTubeByHex(1,digitalTruthTable[19]);
TurnOnDitialTubeByHex(2,digitalTruthTable[16]);
TurnOnDitialTubeByHex(3,digitalTruthTable[17]|digitalTruthTable[19]);
}
else if(j%10==5)
{
TurnOnDitialTubeByHex(0,digitalTruthTable[19]|digitalTruthTable[21]);
TurnOnDitialTubeByHex(1,digitalTruthTable[16]);
TurnOnDitialTubeByHex(2,digitalTruthTable[19]);
TurnOnDitialTubeByHex(3,digitalTruthTable[16]|digitalTruthTable[18]);
}
for(i=0;i<60;i++)
{
if(i%5==0) TurnOnSecondLed(i,1);
else TurnOnSecondLed(i,0);
}
for(i=0;i<4;i++)
{
TurnOnQuarterHour(i,0);
}
TurnOnQuarterHour(j%4,1);
TurnOnSecondLed(j%60,1);
Delay(500);
}
clrScr(VGA_MAROON);
GUI_Write16CnChar(32,43,"新年花灯",VGA_WHITE,VGA_MAROON);
GUI_WriteASCII8x16(12,68,"EEWORLD 2025",VGA_WHITE,VGA_MAROON);
//点亮一个,熄灭一个
for(i=0;i<5;i++)
{
TurnOnDitialTube(0,2);
Delay(1000);
TurnOnDitialTube(0,15);
Delay(1000);
TurnOnDitialTube(1,0);
Delay(1000);
TurnOnDitialTube(1,15);
Delay(1000);
TurnOnDitialTube(2,2);
Delay(1000);
TurnOnDitialTube(2,15);
Delay(1000);
TurnOnDitialTube(3,5);
Delay(1000);
TurnOnDitialTube(3,15);
Delay(1000);
}
clrScr(VGA_OLIVE);
GUI_Write16CnChar(32,43,"新年花灯",VGA_WHITE,VGA_OLIVE);
GUI_WriteASCII8x16(12,68,"EEWORLD 2025",VGA_WHITE,VGA_OLIVE);
//按顺序点亮数码管,然后按顺序熄灭数码管
for(i=0;i<5;i++)
{
TurnOnDitialTube(0,2);
Delay(2000);
TurnOnDitialTube(1,0);
Delay(2000);
TurnOnDitialTube(2,2);
Delay(2000);
TurnOnDitialTube(3,5);
Delay(2000);
TurnOnDitialTube(0,15);
Delay(2000);
TurnOnDitialTube(1,15);
Delay(2000);
TurnOnDitialTube(2,15);
Delay(2000);
TurnOnDitialTube(3,15);
Delay(2000);
}
clrScr(VGA_RED);
GUI_Write16CnChar(32,43,"新年花灯",VGA_WHITE,VGA_RED);
GUI_WriteASCII8x16(12,68,"EEWORLD 2025",VGA_WHITE,VGA_RED);
TurnOnDitialTube(0,2);
TurnOnDitialTube(1,0);
TurnOnDitialTube(2,2);
TurnOnDitialTube(3,5);
}
void dowork(void)
{
prewhile();
}
void main(void)
{
/*<Generated by EasyCodeCube begin>*/
/*<UserCodeStart>*//*<SinOne-Tag><36>*/
IcResourceInit();
/*<UserCodeEnd>*//*<SinOne-Tag><36>*/
/*<UserCodeStart>*//*<SinOne-Tag><4>*/
/*****MainLoop*****/
prewhile();
while(1)
{
/*<UserCodeStart>*//*<SinOne-Tag><14>*/
/***User program***/
dowork();
/*<UserCodeEnd>*//*<SinOne-Tag><14>*/
/*<Begin-Inserted by EasyCodeCube for Condition>*/
}
/*<UserCodeEnd>*//*<SinOne-Tag><4>*/
/*<Generated by EasyCodeCube end>*/
}