当前位置:网站首页>Stm32f030f4 drives tim1637 nixie tube chip
Stm32f030f4 drives tim1637 nixie tube chip
2022-07-01 23:21:00 【Wei Wenjie top】
TIM1637.C
/***************************************************
* @brief TM1637 Digital tube drive
* @date 2020/03/25
* @author YHB
****************************************************/
#include "TIM1637.h"
#include "stm32f0xx.h"
#include "my_sys.h"
#include "ALL_Includes.h"
#include "GPIO.h"
unsigned char tab[] =
{
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
0x77,/*10 A*/
0x7C,/*11 b*/
0x58,/*12 c*/
0x5E,/*13 d*/
0x79,/*14 E*/
0x71,/*15 F*/
0x76,/*16 H*/
0x38,/*17 L*/
0x54,/*18 n*/
0x73,/*19 P*/
0x3E,/*20 U*/
0x00,/*21 Black screen */
};
unsigned char temp=0xCF;// Display the jumping colon
unsigned char NumDis[24]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0X6F,\
0x77,0x7C,0x39,0x5E,0x79,0x71,\
0x08,0x48,0x49,\
0x76,0x38,0x0E,0x50,0x37};//0123456789ABCDEF One, two, three HLJRS
// The highest bit is set to 1 Time display On the nixie tube ":" Symbol
unsigned char disp_num[] = {0x3F, 0x06 ,0xCF,0xCF,0x3f, 0x06}; // Deposit 6 The content to be displayed by a nixie tube
/*******************************************************************
* Function Name :void Delay_1us(uint32_t nTimer)
* Description :1uS Time delay
* Input :nTimer
* Output :void
* Other :
* Date :2022.10.27
*******************************************************************/
void Delay_1us(uint32_t nTimer)
{
uint32_t i=0;
for(i=0;i<nTimer;i++){
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
}
}
/*******************************************************************
* Function Name :void Delay_1ms(uint32_t nTimer)
* Description :1mS Time delay
* Input :nTimer
* Output :void
* Other :
* Date :2022.10.27
*******************************************************************/
void Delay_1ms(uint32_t nTimer)
{
uint32_t i=1000*nTimer;
Delay_1us(i);
}
/***************************************************
* @brief TM1637 Port initialization
* @date 2022/06/25
* @author YHB
****************************************************/
// Port initialization
void TM1637_Init( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd( TM1637_CLK_GPIO_CLK | TM1637_DIO_GPIO_CLK, ENABLE );
GPIO_InitStructure.GPIO_Pin = TM1637_CLK_GPIO_PIN | TM1637_DIO_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init( TM1637_CLK_GPIO_PORT, &GPIO_InitStructure );
}
/*
* Function name :DS18B20_Mode_IPU
* describe : send DS18B20-DATA The pin changes to input mode
* Input : nothing
* Output : nothing
*/
static void TM1637_DIO_Mode_IPU(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Choose what you want to control TM1637_DQ_GPIO_PORT Pin */
GPIO_InitStructure.GPIO_Pin = TM1637_DIO_GPIO_PIN;
/* Set the pin mode to pull-up input mode */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_NOPULL;
/* Call library function , initialization TM1637_DIO_GPIO_PORT*/
GPIO_Init(TM1637_DIO_GPIO_PORT, &GPIO_InitStructure);
}
/*
* Function name :TM1637_DIO_Mode_Out_PP
* describe : send TM1637_DIO_Mode The pin changes to output mode
* Input : nothing
* Output : nothing
*/
static void TM1637_DIO_Mode_Out_PP(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Choose what you want to control TM1637_DIO_GPIO_PORT Pin */
GPIO_InitStructure.GPIO_Pin = TM1637_DIO_GPIO_PIN;
/* Set pin mode to universal push pull output */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;
/* Set the pin rate to 50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
/* Call library function , initialization TM1637_DIO_GPIO_PORT*/
GPIO_Init(TM1637_DIO_GPIO_PORT, &GPIO_InitStructure);
}
// Start bit CLK For high voltage ,DIO From high to low
void TM1637_Start( void )
{
TM1637_DIO_Mode_Out_PP();
TM1637_CLK_PORT_H();
TM1637_DIO_PORT_H();
Delay_1us(2);
TM1637_DIO_PORT_L();
}
// Waiting for an answer When the transmission data is correct , On the falling edge of the eighth clock , Inside the chip, a ACK The signal , take DIO Pin pull down , Release after the end of the ninth clock DIO Bus .
void TM1637_Ack( void )
{
TM1637_CLK_PORT_L();
Delay_1us(5); // Delay after the eighth falling edge of the clock 5us, Start judging ACK The signal
//while( TM1637_DIO_Read_Bit()); // Wait for the reply bit This line of code can also be omitted It will not affect the actual use effect You need to shield this code when using software simulation , Otherwise the program will get stuck here .
TM1637_CLK_PORT_H();
Delay_1us(2);
TM1637_CLK_PORT_L();
}
// Stop bit CLK For high voltage ,DIO From low to high
void TM1637_Stop( void )
{
TM1637_DIO_Mode_Out_PP();
TM1637_CLK_PORT_L();
Delay_1us(2);
TM1637_DIO_PORT_L();
Delay_1us(2);
TM1637_CLK_PORT_H();
Delay_1us(2);
TM1637_DIO_PORT_H();
}
// Input data in CLK Low level change of , stay CLK The high level of is transmitted .
// One byte per transmission , The chip generates a ACK
// Write a byte
void TM1637_WriteByte( unsigned char oneByte )
{
unsigned char i;
TM1637_DIO_Mode_Out_PP();
for( i = 0; i < 8; i++ )
{
TM1637_CLK_PORT_L();
if( oneByte & 0x01 ) // Little Endian
{TM1637_DIO_PORT_H();}
else
{ TM1637_DIO_PORT_L();}
Delay_1us(3);
oneByte = oneByte >> 1;
TM1637_CLK_PORT_H();
Delay_1us(3);
}
}
//TM1637_Display_INC();// Fixed display 0 1 : 2 3
// Write display register Address auto increment
void TM1637_Display_INC( void )
{
unsigned char i;
TM1637_Start();
TM1637_WriteByte( 0x40 ); // Write data to the display register 40H The address is automatically added 1 Pattern ,44H Fixed address mode , This procedure adopts self adding 1 Pattern
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte( 0xC0 ); // Address command settings display address 00H
TM1637_Ack();
for( i = 0; i < 6; i++ ) // Add the address itself , You don't have to write your address every time
{
TM1637_WriteByte( disp_num[i] ); // send data disp_num[] Storage in 6 The content to be displayed by a nixie tube
TM1637_Ack();
}
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte( 0x88 | 0x07 ); // Turn on the display , Maximum brightness ----- Adjust the pulse width control 0---7 Pulse width 14/16
TM1637_Ack();
TM1637_Stop();
}
// Write display register Address does not automatically increase
// add Address of nixie tube 0--5
// value What to show
void TM1637_Display_NoINC( unsigned char add, unsigned char value )
{
// unsigned char i;
TM1637_Start();
TM1637_WriteByte( 0x44 ); // Write data to the display register 40H The address is automatically added 1 Pattern ,44H Fixed address mode , This procedure adopts self adding 1 Pattern
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte( 0xC0 | add ); // Address command settings display address C0H---C5H
TM1637_Ack();
TM1637_WriteByte( value ); // send data value Store what you want to display
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte( 0x88 | 0x07 ); // Turn on the display , Maximum brightness ----- Adjust the pulse width control 0---7 Pulse width 14/16
TM1637_Ack();
TM1637_Stop();
}
// Write display register :
// add Address of nixie tube 0--5
// value What to show
void TM1637_Display_INC_DP( void)
{
unsigned char i;
TM1637_Start();
TM1637_WriteByte( 0x44 ); // Write data to the display register 40H The address is automatically added 1 Pattern ,44H Fixed address mode , This procedure adopts self adding 1 Pattern
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte( 0xC3 ); // Address command settings display address 00H
TM1637_Ack();
TM1637_WriteByte( 0X86 ); // send data disp_num[] Storage in 6 The content to be displayed by a nixie tube
TM1637_Ack();
TM1637_Stop();
TM1637_Start();
TM1637_WriteByte( 0x88 | 0x07 ); // Turn on the display , Maximum brightness ----- Adjust the pulse width control 0---7 Pulse width 14/16
TM1637_Ack();
TM1637_Stop();
}
// level : Set the brightness level 0---7
void TM1637_SetBrightness( unsigned char level )
{
TM1637_Start();
TM1637_WriteByte( 0x88 | level ); // Turn on the display , Maximum brightness ----- Adjust the pulse width control 0---7 Pulse width 14/16
TM1637_Ack();
TM1637_Stop();
}
// Read button When reading keys , The clock frequency should be less than 250K, Read the low order first , Post read high .
unsigned char TM1637_ScanKey( void )
{
unsigned char reKey, i;
TM1637_Start();
TM1637_WriteByte( 0x42 ); // Read key scan data
TM1637_Ack();
TM1637_DIO_PORT_H(); // Pull up the data cable before reading the key
TM1637_DIO_Mode_IPU();
for( i = 0; i < 8; i++ ) // Read from the low position
{
TM1637_CLK_PORT_L();
reKey = reKey >> 1;
Delay_1us(30);
TM1637_CLK_PORT_H();
if( TM1637_DIO_Read_Bit())
{
reKey = reKey | 0x80;
}
else
{
reKey = reKey | 0x00;
}
Delay_1us(30);
}
TM1637_Ack();
TM1637_Stop();
return( reKey );
}
// Key handling functions , The low order of key data is in the front and the high order is in the back
unsigned char TM1637_KeyProcess( void )
{
unsigned char temp;
unsigned char keyNum = 0;
temp = TM1637_ScanKey(); // Read the return value of the key
if( temp != 0xff )
{
switch( temp )
{
case 0xf7 : //K1 And SG1 Press the corresponding key
keyNum = 1;
break;
case 0xf6 : //K1 And SG2 Press the corresponding key
keyNum = 2;
break;
case 0xf5 : //K1 And SG3 Press the corresponding key
keyNum = 3;
break;
case 0xf4 : //K1 And SG4 Press the corresponding key
keyNum = 4;
break;
case 0xf3 : //K1 And SG5 Press the corresponding key
keyNum = 5;
break;
case 0xf2 : //K1 And SG6 Press the corresponding key
keyNum = 6;
break;
case 0xf1 : //K1 And SG7 Press the corresponding key
keyNum = 7;
break;
case 0xf0 : //K1 And SG8 Press the corresponding key
keyNum = 8;
break;
case 0xef : //K2 And SG1 Press the corresponding key
keyNum = 9;
break;
case 0xee : //K2 And SG2 Press the corresponding key
keyNum = 10;
break;
case 0xed : //K2 And SG3 Press the corresponding key
keyNum = 11;
break;
case 0xec : //K2 And SG4 Press the corresponding key
keyNum = 12;
break;
case 0xeb : //K2 And SG5 Press the corresponding key
keyNum = 13;
break;
case 0xea : //K2 And SG6 Press the corresponding key
keyNum = 14;
break;
case 0xe9 : //K2 And SG7 Press the corresponding key
keyNum = 15;
break;
case 0xe8 : //K2 And SG8 Press the corresponding key
keyNum = 16;
break;
default :
keyNum = 0;
break;
}
}
return keyNum;
}
TIM1637.H
#ifndef _TM1637_H
#define _TM1637_H
#include "stm32f0xx.h"
#include "stm32f0xx.h"
#include "my_sys.h"
#include "ALL_Includes.h"
#include "GPIO.h"
/***********************************************************************
* project :165 Configure subcode
* author : Electronic Engineering Department
* edition :zyz_lcm1.0.0
* date :03/14/2011
* function : Write 595
************************************************************************/
/* Definition IIC Connected GPIO port , The user only needs to modify the following code to change the control LED Pin */
extern unsigned char NumDis[24];//0123456789ABCDEF One, two, three HLJRS
#define TM1637_CLK_GPIO_PORT GPIOF /* GPIO port */
#define TM1637_CLK_GPIO_CLK RCC_AHBPeriph_GPIOF /* GPIO Port clock */
#define TM1637_CLK_GPIO_PIN GPIO_Pin_0
#define TM1637_DIO_GPIO_PORT GPIOF /* GPIO port */
#define TM1637_DIO_GPIO_CLK RCC_AHBPeriph_GPIOF /* GPIO Port clock */
#define TM1637_DIO_GPIO_PIN GPIO_Pin_1
// In order to write code conveniently when simulating timing , The clock port and data port to be used are also redefined .
/**********************************************************************/
#define TM1637_DIO_PORT_H() GPIO_SetBits(TM1637_DIO_GPIO_PORT,TM1637_DIO_GPIO_PIN)
#define TM1637_DIO_PORT_L() GPIO_ResetBits(TM1637_DIO_GPIO_PORT,TM1637_DIO_GPIO_PIN)
#define TM1637_CLK_PORT_H() GPIO_SetBits(TM1637_CLK_GPIO_PORT,TM1637_CLK_GPIO_PIN)
#define TM1637_CLK_PORT_L() GPIO_ResetBits(TM1637_CLK_GPIO_PORT,TM1637_CLK_GPIO_PIN)
#define TM1637_DIO_Read_Bit() GPIO_ReadInputDataBit(TM1637_DIO_GPIO_PORT,TM1637_DIO_GPIO_PIN)
/*****************************************************************************************************/
void TM1637_Init( void );
void Delay_1us(uint32_t nTimer);
void Delay_1ms(uint32_t nTimer);
void TM1637_Display_INC( void );
void TM1637_Display_INC_DP( void);
void TM1637_Display_NoINC( unsigned char add, unsigned char value );
/*****************************************************************************************************/
#endif
main.c
#include "delay.h"
#include "GPIO.H"
#include "USART.h"
#include "TIM.h"
#include "EXTI.h"
#include "ADC.h"
#include "my_sys.h"
#include "mytype.h"
#include "IWDG.H"
#include "stdlib.H"
#include "TM1650.H"
#include "TIM1637.H"
/*
typedef struct
{
u16 heard;
u16 end;
u16 beepled;
u16 shumaguan1;
u16 shumaguan2;
u16 shumaguan3;
u16 shumaguan4;
u16 shumaguanpoint[5];
u8 rang_num1;
u16 remote_addrL1;
u16 data1[10]; // Receive serial data
}sPkg;
*/
sPkg usasPkg ={0,0,0,1,2,3,4,0,10,1,1};
#define point 0x80
#define ADD_NUM 0x20
#define time_rang_b100 100
#define time_rang_b200 200
#define time_rang_b300 300
#define time_rang_b400 400
#define time_rang_b500 500
#define time_rang_b800 800
#define time_rang_b1000 1000
#define time_rang_b2000 2000
u8 rang_num;
u8 rang_num_old=100;
u8 rang_num_new=100;
u8 rang_num_old1=100;
u8 rang_num_new1=10;
newPkg_usart(4) jiadianPkg={8,0xa2,0x90,0x01,0x00,{00,00,00,00}};// Send Protocol
u8 USART[8]={0X7F,0X80,0X00,0X00,0X00,0X00,0X00,0X82}; //
unsigned char tab_num[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void ADJC(void) ; // Battery voltage detection
void YIBIAO2(void) ; // Instrument drive reverse
void YIBIAO1(void) ; // Instrument drive forward
void YIBIAO(void) ; // Instrument startup detection
void STMFLASH_Read(void); // Read flash data
void STMFLASH_Write(u16 NumToWrite); write in flash data
u16 STMFLASH_ReadHalfWord(u32 faddr) ; // write in flash data
// Common cathode digital tube
unsigned char SEGData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//1-9
unsigned char SEGDataDp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // A decimal point is only used for addresses 0xc1
unsigned char i,j;
/*
Private definition
*/
void time_judge( void );
unsigned int countTime = 0;
unsigned char time, sec;
struct {
char shi;
char ge;
}Hour;
struct {
char shi;
char ge;
}Min;
int main(void)
{
int data=0;
GPIO_MyInit();
USART_MyInit();
// TIM14_MyInit(400,50); // 10 frequency division .PWM frequency =48000000/50/40=24000hz Buzzer
// ADC_MyInit();
I2C_MyInit();//TIM1650
TM1637_Init();//TIM1637
delay_init();
TIM3_Int_Init(65535);//us Timer 10ms
TIM14_Init(7199,1999);// Timer
Write_DATA(0x48,0x01);
Write_DATA(0x48,0x75);// Data command :0x48,5 Levels of brightness ,7 The segment shows
for(i=0;i<16;i++)
{
for(j=0;j<4;j++)
{
// Display_Fix(j,tab1[(j+i)%16]|point);//
Display_Num(j,i);
}
delay_ms(50);
}
for(j=0;j<4;j++)
{
// Display_Fix(j,tab1[(j+i)%16]|point);//
Display_Num(j,0);
}
Display_Num(1,usasPkg.shumaguan2|0x80);
while(1)
{
// ADJC();
// GPIO_ResetBits(GPIOB,GPIO_Pin_1); // Wireless mode transmission SEA Interface Grounding
USART[2]=checkdata[0];
USART[3]=checkdata[1];
USART[4]=checkdata[2];
USART[5]=checkdata[3];
USART[6]=checkdata[4];
USART[7]=checkdata[5];
// agreement AA BB 02 04 CC DD
if(time_flag_1s==1)
{
time_flag_1s=0;
}
if(time_flag1_2s>=time_rang_b800)
{
if(data>=9)
{
data=0;
}
time_judge();
//TM1637_Display_NoINC( 00, NumDis[data++] );
//TM1637_Display_NoINC( 01, NumDis[data] );
TM1637_Display_NoINC( 00, NumDis[Min.shi] );
TM1637_Display_NoINC( 01, NumDis[Min.ge] );
TM1637_Display_NoINC( 02, NumDis[data++]|0X80);
TM1637_Display_NoINC( 03, NumDis[Min.ge]|0X80);
//TM1637_Display_INC_DP();//: Show
srand(rang_num_new);
usasPkg.rang_num1= rand()%10 +1; // Produce a 30 To 50 The random number
rang_num_new=usasPkg.rang_num1;
time_flag1_2s=0;
}
if(time_flag2_2s>=time_rang_b1000)
{
srand(rang_num_old);
rang_num= rand()%10 +1; // Produce a 30 To 50 The random number
rang_num_old=rang_num;
// TM1637_Display_INC();// Fixed display 0 1 : 2 3
TM1637_Display_NoINC( 02, NumDis[data]|0X00);//: flashing
TM1637_Display_NoINC( 03, NumDis[data]|0X00);
time_flag2_2s=0;
}
if(time_flag3_2s>=time_rang_b1000+time_rang_b2000+time_rang_b300+time_rang_b800)
{
srand(rang_num_new1);
usasPkg.rang_num2= rand()%10+1; // Produce a 0 To 10 The random number
rang_num_new1=usasPkg.rang_num2;
if(usasPkg.rang_num2>=3)
{
usasPkg.rang_num2=2;
}
time_flag3_2s=0;
}//if
}//while
}//main
/*************************************************************
* name : time_judge( void )
* function : Judge the change of time
* Input : void
* Output : nothing
**************************************************************/
void time_judge( void )
{
if(++sec == 60) //60 second
{
sec = 0;
if((Hour.shi || Hour.ge || Min.shi || Min.ge) && (--Min.ge <= -1))
{
Min.ge = 9;
if((Hour.shi) ||(Hour.ge) && (--Min.shi <= -1))
{
Min.shi = 5;
if(Hour.shi && (--Hour.ge <= -1))
{
Hour.ge = 9;
if(--Hour.shi <= -1)
{
Hour.shi = 0;
}
}
else
if((!Hour.shi) && (--Hour.ge <= -1))
{
Hour.ge = 0;
}
}
else
if((!Hour.shi) && (!Hour.ge) && (--Min.shi <= -1))
{
Min.shi = 0;
}
}
else
if(((!Hour.shi) && (!Hour.ge) && (!Min.shi) ) && (Min.ge <= -1))
{
Min.ge = 0;
}
}
}
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
return *(u16*)faddr;
}
u16 C;
// Read the data of the specified length from the specified address
void STMFLASH_Read()
{
C=STMFLASH_ReadHalfWord(0x08002000);// Read 2 Bytes
}
void STMFLASH_Write(u16 NumToWrite)
{
FLASH_Unlock(); // Unlock
FLASH_ErasePage(0x08002000);// Erase this sector
FLASH_ProgramHalfWord(0x08002000, NumToWrite);// write in 16 Bit data
// FLASH_ProgramOptionByteData(0x08002000,NumToWrite);// write in 8 Bit data
FLASH_Lock();// locked
}
边栏推荐
- CADD course learning (3) -- target drug interaction
- 会声会影2022智能、快速、简单的视频剪辑软件
- from pip._internal.cli.main import main ModuleNotFoundError: No module named ‘pip‘
- Zhongang Mining: it has inherent advantages to develop the characteristic chemical industry dominated by fluorine chemical industry
- y53.第三章 Kubernetes从入门到精通 -- ingress(二六)
- 每日三题 6.30
- "35 years old, the boss of the company, with a monthly salary of 20000, give away takeout": the times abandoned you, not even saying goodbye
- dat.GUI
- [micro service sentinel] sentinelresourceaspect details
- 2022 examination questions and online simulation examination for safety management personnel of hazardous chemical business units
猜你喜欢
常见的二十种软件测试方法详解(史上最全)
硅谷产品实战学习感触
window安装wsl(二)
91. (cesium chapter) cesium rocket launch simulation
MySQL binlog cleanup
Three development trends of enterprise application from the perspective of the third technological revolution
Groups and ranges of regular series
2022年危险化学品经营单位安全管理人员考试题及在线模拟考试
Programming English vocabulary notebook
数字峰会人气火爆,城链科技引发新一轮商业变革
随机推荐
mysql binlog的清理
Istio、eBPF 和 RSocket Broker:深入研究服务网格
【微服务|Sentinel】sentinel整合openfeign
Matplotlib常用图表
会声会影2022智能、快速、简单的视频剪辑软件
想请教股票开户要认识谁?在线开户是安全么?
Microservice stability management
数字化转型道阻且长,如何迈好关键的第一步
2022 examination questions and online simulation examination for safety management personnel of hazardous chemical business units
Linux基础 —— CentOS7 离线安装 MySQL
Typescript enumeration
win 10 mstsc连接 RemoteApp
dat. GUI
91. (cesium chapter) cesium rocket launch simulation
Understanding threads
Huisheng Huiying 2022 intelligent, fast and simple video editing software
Compare the version number [double pointer to intercept the string you want]
The difference between timer and scheduledthreadpoolexecutor
rviz打开后如何显示实时2D地图
plain framework的实际应用和扩展