sujingliang

    1. 【新年花灯】点亮旋转时钟数码管 6/569 电源技术 2025-03-23
      补充:       本开发板基于新定义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>*/ }  
    2. 【新年花灯】AI给的烟花效果 4/425 电源技术 2025-02-11
      okhxyyo 发表于 2025-2-11 14:22 为什么说是AI给的烟花特效啊
      算法是deepseek生成的
    3. EEWORLD陪你过大年,新年积分兑换盲盒收到啦-UFUN 7/756 聊聊、笑笑、闹闹 2025-01-26
       
    4. EEWORLD陪你过大年,新年积分兑换盲盒收到啦-UFUN 7/756 聊聊、笑笑、闹闹 2025-01-25
      资料从这里下: http://www.wangchaochao.top/2019/03/09/uFun-1/ 有原理图 这个板子都有飞线。可能和《ufun时钟问题更改》有关。    
    5. 收到了uFun开发板,从这里找到资料:http://www.wangchaochao.top/2019/03/09/uFun-1/   小巧的板子,主控STM32F103永不过时呀,还集成了很多外设,虽然已过了多年,但仍然可以看得出当年设计者的独具匠心。   感谢EEWORLD,感谢开发板提供者。       要多多攒积分,争取每年都可以获得幸运盲盒,呵呵。
    6. 活动很好,才看到,积分很少,已花了100积分兑换
    7. lugl4313820 发表于 2024-11-2 21:57 大佬,可以分享一下您的小程源码吗?
      建议参考微信官方的资料,很详细: https://developers.weixin.qq.com/miniprogram/dev/framework/device/ble.html   有些UP主在bilibili上也有视频说明。 https://esp-document.icce.top/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%BC%80%E5%8F%91/18%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%A2%9E%E5%8A%A0%E8%93%9D%E7%89%99%E9%80%9A%E4%BF%A1%E5%8A%9F%E8%83%BD.html
    8. 赞 学习了: 如果定义多个特征值报0x87错,虽然头文件定义是内寸不足 #define BLE_STATUS_OUT_OF_MEMORY            ((tBleStatus)(0x87)) 但是调整CFG_BLE_NUM_GATT_ATTRIBUTES可以解决   CFG_BLE_NUM_GATT_ATTRIBUTES CFG_BLE_NUM_GATT_ATTRIBUTES must be ≥ 2. Parameter Description: Maximum number of Attributes that can be stored in the GATT database When a GATT characteristic is added to the database a minimum of 2 attribute records are needed: one for the characteristic declaration and one for the characteristic value. On top of this, additional records may be needed based on the characteristic properties, in particular: - If the characteristic has the notify or indicate property set, then one additional attribute record is needed. - If the characteristic has the broadcast property set, then one additional attribute record is needed. - If the characteristic has the extended property set, then one additional attribute record is needed. In summary, one characteristic may need from 2 to 5 attribute records depending on the characteristic properties.
    9. 赞。 学习了: 如果想触发ACI_GATT_SRV_READ_VSEVT_CODE,需要将Characteristic type设为Non-buffered。
    10. 本帖最后由 sujingliang 于 2024-10-6 14:34 编辑 1、printf需要重定向 2、app_ble.c中540行左右可能需要自己加一下(好像已经加了):   /* USER CODE BEGIN APP_BLE_Init_4 */     APP_BLE_Procedure_Gap_Peripheral(PROC_GAP_PERIPH_ADVERTISE_START_FAST);   /* USER CODE END APP_BLE_Init_4 */
    11. 时钟不对,应该像上面这样配
    12. 感谢呀,今天用楼主的方法解决了2个板子。 这个板子识别不到芯片的这个问题,今天我也遇到了。而且另一个H7板子也出了这个问题。真快被吓着了。怪不得这些板子都特意设计boot引脚选择,问题还是挺频发的。
    13. 测评入围:ST NUCLEO-WB09KE 22/120 EEWORLD颁奖专区 2024-09-14
      麻烦问一下,第一次参加电子工程世界不太了解流程,我回复本贴比较晚,是在9月9日。   至今没有收到开发板,看到别人都有评测报告出来了,有些心慌了。   我是不是被取消了评审资格了,我看到规定里是有这么一条确认晚了会被取消资格。   如果被取消资格也只能怨自己了。
    14. 测评入围:ST NUCLEO-WB09KE 22/120 EEWORLD颁奖专区 2024-09-09
      个人信息无误,确认可以完成测评分享计划

最近访客

< 1/1 >

统计信息

已有16人来访过

  • 芯积分:285
  • 好友:1
  • 主题:7
  • 回复:14

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言