8080时序

news2024/9/25 12:54:56

在这里插入图片描述
通过RS来区分是命令还是数据
在WR高电平时,将数据放入D[0:15]数据线上

在WR上升沿,读取D[0:15]数据线上的数据
在这里插入图片描述

//提前把默认信号设置为对应电平
static inline void LcdSendCmd(uint16_t cmdVal)
{
	LCD_CS_RESET();//cs输出低电平,表示片选信号开始工作
	LCD_RS_RESET();//rs=1,表示数据
	LCD_WR_SET();
	LCD_RD_SET(); //rd保持高电平,//三个前置条件设置好了
	
	LCD_DATA_WRITE(cmdVal);
	LCD_WR_RESET();
	LCD_WR_SET();//产生上升沿,LCD读取data数据
	LCD_CS_SET();//cs输出低电平,表示片选信号结束工作
}


static inline void LcdSendData(uint16_t dataVal)
{
	LCD_CS_RESET();
	LCD_RS_SET();
    //LCD_RD_SET();
	LCD_DATA_WRITE(dataVal);
	LCD_WR_RESET();
	LCD_WR_SET();
	LCD_CS_SET();
}

在这里插入图片描述

static inline uint16_t LcdGetData(void)
{
	uint16_t data;
	
	LCD_CS_RESET();   //
	LCD_RS_SET();
	
	LCD_RD_RESET();   //HX8352B have a Dummy RD
	LCD_RD_SET();
	LCD_RD_RESET();   //So HX8352B have 2 RD. After test,HX8352A HX8352C ST7793 SPFD5420 R61509V all OK
    LCD_RD_SET();
	data = LCD_DATA_READ();
	LCD_CS_SET();
	return data;	
}
static inline void LcdWriteReg(uint16_t addr, uint16_t data)
{
	LcdSendCmd(addr);
	LcdSendData(data);
}

static inline uint16_t LcdReadReg(uint16_t addr)
{
	uint16_t data;

	LcdSendCmd(addr);
	/*SET GPIOB Input*/
	gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_MAX, GPIO_PIN_ALL);

	data = LcdGetData();
	/*SET GPIOB Output*/
	gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_MAX, GPIO_PIN_ALL);

	return data;
}

#include <stdint.h>
#include <stdio.h>
#include "gd32f30x.h"
#include "delay.h"
#include "lcd_drv.h"
#include "RTT_Debug.h"

static void GpioInit(void)
{
	/* 使能RCU相关时钟 */
	rcu_periph_clock_enable(RCU_AF);  
	rcu_periph_clock_enable(RCU_GPIOA);  // 使能GPIOA的时钟
	rcu_periph_clock_enable(RCU_GPIOB);  // 使能GPIOB的时钟
	rcu_periph_clock_enable(RCU_GPIOC);  // 使能GPIOC的时钟

	/*
	*WR---PC0		RS---PC1  
	*CS---PC2		RD---PC3//pb3和pb4是给JTAG接口使用的 JTMS JTCK JTDI JTD0 四个引脚 
	*RST--PC8		BK---PA8
	*D0--D15    	PB0--15
	*/
	
	/* 数据总线 */
	gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);//关闭JTAG和使能swD的模式
	gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_MAX, GPIO_PIN_ALL); // D0~D15 
	gpio_port_write(GPIOB, 0);//默认GPIOB所有pin都输出低电平

	/* 控制信号 */
	gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_MAX, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_8);
	gpio_bit_set(GPIOC, GPIO_PIN_8);//复位信号
	gpio_bit_reset(GPIOC, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
	
	/* 背光信号 */
	gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_8);
	gpio_bit_reset(GPIOA, GPIO_PIN_8);

}

#define  LCD_RST_SET()   		gpio_bit_set(GPIOC, GPIO_PIN_8)
#define  LCD_RST_RESET()  		gpio_bit_reset(GPIOC, GPIO_PIN_8) 

#define  LCD_RD_SET()			gpio_bit_set(GPIOC, GPIO_PIN_3) 
#define  LCD_RD_RESET()			gpio_bit_reset(GPIOC, GPIO_PIN_3) 
	 
#define  LCD_CS_SET()    		gpio_bit_set(GPIOC, GPIO_PIN_2) 
#define  LCD_CS_RESET()			gpio_bit_reset(GPIOC, GPIO_PIN_2) 
				
#define  LCD_RS_SET()			gpio_bit_set(GPIOC, GPIO_PIN_1) 
#define  LCD_RS_RESET()			gpio_bit_reset(GPIOC, GPIO_PIN_1) 

#define  LCD_WR_SET()     		gpio_bit_set(GPIOC, GPIO_PIN_0) 
#define  LCD_WR_RESET()   		gpio_bit_reset(GPIOC, GPIO_PIN_0)

#define  LCD_BK_ON()      		gpio_bit_set(GPIOA, GPIO_PIN_8)
#define  LCD_BK_OFF() 	  		gpio_bit_reset(GPIOA, GPIO_PIN_8)

#define  LCD_DATA_WRITE(data)   gpio_port_write(GPIOB, data) 
#define  LCD_DATA_READ()    	gpio_input_port_get(GPIOB)

// 8080写时序图 https://i-blog.csdnimg.cn/direct/01e0ae04b5a94ad68201b5b8b1faf312.png
static inline void LcdSendCmd(uint16_t cmdVal)
{
	LCD_CS_RESET();//cs输出低电平,表示片选信号开始工作
	LCD_RS_RESET();//rs=1,表示数据
    
	LCD_RD_SET(); //rd保持高电平,
	
	LCD_DATA_WRITE(cmdVal);
	LCD_WR_RESET();
	LCD_WR_SET();
	LCD_CS_SET();
}


static inline void LcdSendData(uint16_t dataVal)
{
	LCD_CS_RESET();
	LCD_RS_SET();
    //LCD_RD_SET();
	LCD_DATA_WRITE(dataVal);
	LCD_WR_RESET();
	LCD_WR_SET();
	LCD_CS_SET();
}

//https://i-blog.csdnimg.cn/direct/6232e4d7ef3b489bb62a21447a169cf8.png
static inline uint16_t LcdGetData(void)
{
	uint16_t data;
	
	LCD_CS_RESET();   //
	LCD_RS_SET();
	
	
	LCD_RD_RESET();   //HX8352B have a Dummy RD
	LCD_RD_SET();
	LCD_RD_RESET();   //So HX8352B have 2 RD. After test,HX8352A HX8352C ST7793 SPFD5420 R61509V all OK
    LCD_RD_SET();
	data = LCD_DATA_READ();
	LCD_CS_SET();
	return data;	
}
static inline void LcdWriteReg(uint16_t addr, uint16_t data)
{
	LcdSendCmd(addr);
	LcdSendData(data);
}

static inline uint16_t LcdReadReg(uint16_t addr)
{
	uint16_t data;

	LcdSendCmd(addr);
	/*SET GPIOB Input*/
	gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_MAX, GPIO_PIN_ALL);

	data = LcdGetData();
	/*SET GPIOB Output*/
	gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_MAX, GPIO_PIN_ALL);

	return data;
}

#define LCD_ID         		 0x65


static void LcdInit(void)
{
	LCD_RST_RESET();
	DelayNms(100);
	LCD_RST_SET();
	DelayNms(100);
	
	uint16_t id;
	id = LcdReadReg(0);	 
	DBG_log("LCD ID:%x\n", id); 
	
	if ((id & 0xFF) != LCD_ID)
	{
		DBG_Error("LCD init error\n");
		return;
	}
#if 0
	LcdWriteReg(0xE2, 0x15); //VREFsetting
	LcdWriteReg(0xE5, 0x28);
	LcdWriteReg(0xE7, 0x28);
	LcdWriteReg(0xE8, 0x48);
	LcdWriteReg(0xEC, 0x09);
	LcdWriteReg(0xED, 0x06);
	// Power on Setting
	LcdWriteReg(0x17, 0x05); 
	LcdWriteReg(0x23, 0x76); 
	LcdWriteReg(0x24, 0x57); 
	LcdWriteReg(0x25, 0x71); 
	LcdWriteReg(0x1B, 0x1E); //VREG1 = 4.5V
	LcdWriteReg(0x01, 0x00); 
	LcdWriteReg(0x1C, 0x04); 	
	// Power on sequence
	LcdWriteReg(0x18, 0x88); 
	LcdWriteReg(0x19, 0x01); 
	DelayNms(5);
	LcdWriteReg(0x1F, 0x8C); 
	LcdWriteReg(0x1F, 0x84); 
	DelayNms(5);
	LcdWriteReg(0x1F, 0x94); 
	DelayNms(5);
	LcdWriteReg(0x1F, 0xD4); 
	DelayNms(5);
	// Gamma Setting
	LcdWriteReg(0x40, 0x08); 
	LcdWriteReg(0x41, 0x31); 
	LcdWriteReg(0x42, 0x2F); 
	LcdWriteReg(0x43, 0x3E); 
	LcdWriteReg(0x44, 0x3D); 
	LcdWriteReg(0x45, 0x3F); 
	LcdWriteReg(0x46, 0x2F); 
	LcdWriteReg(0x47, 0x79); 
	LcdWriteReg(0x48, 0x08); 
	LcdWriteReg(0x49, 0x06); 
	LcdWriteReg(0x4A, 0x08); 
	LcdWriteReg(0x4B, 0x0E); 
	LcdWriteReg(0x4C, 0x17); 
	LcdWriteReg(0x50, 0x00); 
	LcdWriteReg(0x51, 0x02); 
	LcdWriteReg(0x52, 0x01); 
	LcdWriteReg(0x53, 0x10); 
	LcdWriteReg(0x54, 0x0E); 
	LcdWriteReg(0x55, 0x37); 
	LcdWriteReg(0x56, 0x06); 
	LcdWriteReg(0x57, 0x50); 
	LcdWriteReg(0x58, 0x08); 
	LcdWriteReg(0x59, 0x11); 
	LcdWriteReg(0x5A, 0x17); 
	LcdWriteReg(0x5B, 0x19); 
	LcdWriteReg(0x5C, 0x17); 
	LcdWriteReg(0x5D, 0xFF); 
	// Display ON Setting
	LcdWriteReg(0x16, 0x0B); 
	LcdWriteReg(0x28, 0x20); 
	DelayNms(5);
	LcdWriteReg(0x28, 0x38); 
	DelayNms(5); // Waiting 2 frames al least
	LcdWriteReg(0x28, 0x3C); 
	DelayNms(100);
#endif
#if 1
    LcdWriteReg(0x00E2, 0x0000);
    LcdWriteReg(0x00E5, 0x0000);
    LcdWriteReg(0x00E7, 0x0000);
    LcdWriteReg(0x00E8, 0x005E);
    LcdWriteReg(0x00EC, 0x0008);
    LcdWriteReg(0x00ED, 0x0047);
    LcdWriteReg(0x00EE, 0x0020);
    LcdWriteReg(0x00EF, 0x0059);
    LcdWriteReg(0x0029, 0x0000);
    LcdWriteReg(0x002A, 0x0010);
    LcdWriteReg(0x002B, 0x0003);
    
	LcdWriteReg(0x0023, 0x007C); // Power on Setting
    LcdWriteReg(0x0024, 0x0080);
    LcdWriteReg(0x0025, 0x004F);
    LcdWriteReg(0x0026, 0x0007);
    LcdWriteReg(0x0029, 0x0000); //Frame control
    LcdWriteReg(0x002A, 0x0000);
    LcdWriteReg(0x002B, 0x0003);
    LcdWriteReg(0x001B, 0x001E);
    
	LcdWriteReg(0x0018, 0x00EF); // Power on sequence
    LcdWriteReg(0x0019, 0x0001);
    DelayNms(10),
    LcdWriteReg(0x001F, 0x008C);
    LcdWriteReg(0x001F, 0x0084);
    DelayNms(10),
    LcdWriteReg(0x001F, 0x0094);
    DelayNms(10),
    LcdWriteReg(0x001F, 0x00D4);
    DelayNms(10),
    LcdWriteReg(0x002F, 0x0000);
    
	LcdWriteReg(0x0040, 0x0000); // Gamma Setting
    LcdWriteReg(0x0041, 0x0029);
    LcdWriteReg(0x0042, 0x0026);
    LcdWriteReg(0x0043, 0x003E);
    LcdWriteReg(0x0044, 0x003D);
    LcdWriteReg(0x0045, 0x003F);
    LcdWriteReg(0x0046, 0x001F);
    LcdWriteReg(0x0047, 0x0074);
    LcdWriteReg(0x0048, 0x0008);
    LcdWriteReg(0x0049, 0x0004);
    LcdWriteReg(0x004A, 0x0006);
    LcdWriteReg(0x004B, 0x000C);
    LcdWriteReg(0x004C, 0x0017);

    LcdWriteReg(0x0050, 0x0000);
    LcdWriteReg(0x0051, 0x0002);
    LcdWriteReg(0x0052, 0x0001);
    LcdWriteReg(0x0053, 0x0019);
    LcdWriteReg(0x0054, 0x0016);
    LcdWriteReg(0x0055, 0x003F);
    LcdWriteReg(0x0056, 0x000B);
    LcdWriteReg(0x0057, 0x0060);
    LcdWriteReg(0x0058, 0x0008);
    LcdWriteReg(0x0059, 0x0013);
    LcdWriteReg(0x005A, 0x0019);
    LcdWriteReg(0x005B, 0x001B);
    LcdWriteReg(0x005C, 0x0017);
    LcdWriteReg(0x005D, 0x00FF);
    
	LcdWriteReg(0x0016, 0x000B); // Display ON Setting
	LcdWriteReg(0x0017, 0x0055);
	LcdWriteReg(0x0028, 0x0020);
	DelayNms(40);
	LcdWriteReg(0x0028, 0x0038); 
	DelayNms(40);                // Waiting 2 frames al least
	LcdWriteReg(0x0028, 0x003C); 
    LcdWriteReg(0x0002, 0x0000); // Set active window
	DelayNms(100);
#endif
}


static void LcdSetCursor(LcdArea_t *area)
{
	LcdWriteReg(0x02, area->x1 >> 8);     
	LcdWriteReg(0x03, area->x1);	 
	LcdWriteReg(0x04, area->x2 >> 8); 
	LcdWriteReg(0x05, area->x2);
	LcdWriteReg(0x06, area->y1 >> 8); 
	LcdWriteReg(0x07, area->y1);
	LcdWriteReg(0x08, area->y2 >> 8);
	LcdWriteReg(0x09, area->y2); 	
	LcdWriteReg(0x80, area->x1 >> 8);
	LcdWriteReg(0x81, area->x1);
	LcdWriteReg(0x82, area->y1 >> 8);
	LcdWriteReg(0x83, area->y1);
	LcdSendCmd(0x22);
}

void LcdFillPureColor(LcdArea_t *area, uint16_t color)
{ 
	
    if ((area->x1 > LCD_PIXEL_WIDTH - 1) || (area->x2 > LCD_PIXEL_WIDTH - 1)
		|| (area->y1 > LCD_PIXEL_HEIGHT - 1) || (area->y2 > LCD_PIXEL_HEIGHT - 1))
	{
		return;
	}

	LcdSetCursor(area);
	uint32_t totalPoint = (area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1);
	LCD_CS_RESET();
	LCD_RD_SET();
	LCD_RS_SET();
	LCD_DATA_WRITE(color);
	for (uint32_t i = 0; i < totalPoint; i++) 
	{	
		LCD_WR_RESET();
		LCD_WR_SET();
	}
	LCD_CS_SET();
}

void LcdDrvInit(void)
{
	GpioInit();
	LcdInit();	
//	LCD_BK_ON();
	LcdArea_t area = {0, 0, LCD_PIXEL_WIDTH - 1, LCD_PIXEL_HEIGHT - 1};
	LcdFillPureColor(&area, BLACK);
}

void LcdDrawChar(uint16_t x, uint16_t y, uint8_t ascii, uint16_t textColor, uint16_t bkColor, AsciiFontDesc_t *font)
{
	uint8_t *bitmap;
	LcdArea_t area;
	uint8_t data;
	uint16_t i, j, k;
	
	if (!font->isJustNum)
	{
		bitmap = (uint8_t *)font->bitmap + (ascii - ' ') * font->charHasBytes;
	}
	else
	{
		bitmap = (uint8_t *)font->bitmap + (ascii - '0') * font->charHasBytes;
	}
	
	area.x1 = x;
	area.y1 = y;
	area.x2 = x + (font->width - 1);
	area.y2 = y + (font->height - 1);
	LcdSetCursor(&area);
	
	for (i = 0; i < font->height; i++)
	{
		for (j = 0; j < font->width / 8; j++)
		{
			data = *(bitmap++);
			for (k = 0; k < 8; k++)
			{
				if (data & 0x80)
				{
					LcdSendData(textColor);
				}
				else
				{
					LcdSendData(bkColor);
				}
				data <<= 1;
			}			
		}
		if (font->width % 8 == 0)
		{
			continue;
		}
		data = *(bitmap++);
		for (k = 0; k < font->width % 8; k++)
		{
			if (data & 0x80)
			{
				LcdSendData(textColor);
			}
			else
			{
				LcdSendData(bkColor);
			}
			data <<= 1;
		}
	}	
}

void LcdDrawString(uint16_t x, uint16_t y, char *str, uint16_t textColor, uint16_t bkColor, AsciiFontDesc_t *font)
{
	uint8_t i = 0;
	
	while (*str != '\0')
	{
		LcdDrawChar(x + (i * font->width), y, *str, textColor, bkColor, font);	
		str++;
		i++;
	}
}

void LcdDrawChinese(uint16_t x, uint16_t y, uint16_t textColor, uint16_t bkColor, ChineseFontDesc_t *font)
{
	uint8_t *bitmap;
	LcdArea_t area;
	uint8_t data;
	uint16_t i, j, k, m;

	bitmap = (uint8_t *)font->bitmap;
	
	for (i = 0; i < font->charNums; i++)
	{
		area.x1 = x + (i * font->width);
		area.y1 = y;
		area.x2 = area.x1 + (font->width - 1);
		area.y2 = y + (font->height - 1);
		LcdSetCursor(&area);
		for (j = 0; j < font->height; j++)
		{
			for (k = 0; k < font->width / 8; k++)
			{
				data = *(bitmap++);
				for (m = 0; m < 8; m++)
				{
					if (data & 0x80)
					{
						LcdSendData(textColor);
					}
					else
					{
						LcdSendData(bkColor);
					}
					data <<= 1;
				}			
			}
			if (font->width % 8 == 0)
			{
				continue;
			}
			data = *(bitmap++);
			for (m = 0; m < font->width % 8; m++)
			{
				if (data & 0x80)
				{
					LcdSendData(textColor);
				}
				else
				{
					LcdSendData(bkColor);
				}
				data <<= 1;
			}
		}
	}
}
void LcdDrawPicture(uint16_t x, uint16_t y, uint16_t pictureColor, uint16_t bkColor, PictureDesc_t *picDesc)
{
	uint8_t *picture;
	uint8_t data;
	LcdArea_t area;
	uint16_t i, j, k;
	
	picture = (uint8_t *)picDesc->picture;
	data = *picture;
	area.x1 = x;
	area.y1 = y;
	area.x2 = x + (picDesc->width - 1);
	area.y2 = y + (picDesc->height - 1);
	LcdSetCursor(&area);

	for (i = 0; i < picDesc->height; i++)
	{
		for(j = 0; j < picDesc->width; )
		{
			for (k = 0; k < 8; k++)
			{	
				if (data & 0x80)
				{
					LcdSendData(pictureColor);
				}
				else
				{
					LcdSendData(bkColor);
				}
				data <<= 1;	
				j++;
				if (j == picDesc->width)
				{
					break;
				}
			}
			picture++;
			data = *picture;
		}		
	}	
}

void TurnOnScreen(void)
{
	LCD_BK_ON();
}

void TurnOffScreen(void)
{
	LCD_BK_OFF();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Diffusion分割】MedSegDiff-v2:Diffusion模型进行医学图像分割

MedSegDiff-V2: Diffusion-Based Medical Image Segmentation with Transformer 摘要&#xff1a; 最近的研究揭示了 DPM 在医学图像分析领域的实用性&#xff0c;医学图像分割模型在各种任务中表现出的出色性能就证明了这一点。尽管这些模型最初是以 UNet 架构为基础的&…

低代码BPA(业务流程自动化)技术探讨

一、BPA流程设计平台的特点 可视化设计工具 大多数BPA流程设计平台提供直观的拖拽式界面&#xff0c;用户可以通过图形化方式设计、修改及优化业务流程。这种可视化的方式不仅降低了门槛&#xff0c;还便于非技术人员理解和参与流程设计。集成能力 现代BPA平台通常具备与其他系…

My_String完善

#include "my_string_ok.h" My_string_Ok::My_string_Ok():size(20) { len 0; ptr new char[size]; ptr[len] \0; } My_string_Ok::My_string_Ok(int num,char c) { cout<<"有参构造"<<endl; ptr new char [20] ; len 0; for…

K8s安装部署(v1.28)--超详细(cri-docker作为运行时)

1、准备环境 ip角色系统主机名cpumem192.168.40.129mastercentos7.9k8smaster48192.168.40.130node1centos7.9k8snode148192.168.40.131node2centos7.9k8snode248192.168.40.132node3centos7.9k8snode348 2、系统配置&#xff08;所有节点&#xff09; 重要&#xff1a;首先…

怎么更换自己的ip地址?多种方法可实现

在当今的数字化时代&#xff0c;IP地址作为我们在网络世界中的“身份证”&#xff0c;扮演着举足轻重的角色。然而&#xff0c;有时候出于隐私保护、网络安全或是访问特定服务等需求&#xff0c;我们可能需要更换自己的IP地址。那么&#xff0c;如何实现这一目标呢&#xff1f;…

2024年10月2-4日(星期三-星期五)骑行(石林-老圭山)

2024年10月2-4日 (星期六&#xff09;骑行&#xff08;石林-大草坪---长坪---石头寨---海邑镇---老圭山&#xff09;&#xff0c;早8:30到9:00&#xff0c;新螺蛳湾客运站正门&#xff0c;地铁二号线南部客运站站出口集合&#xff0c;9:30装车&#xff0c;10:00出发。偶遇地点:…

网络安全前景大好,转行这些职位成了“香饽饽”

网络安全就业前景 大数据、人工智能、云计算、物联网、5G等新兴技术的高速发展&#xff0c;蒸蒸日上。但是随之也出现了许多问题&#xff0c;比如&#xff1a;政府单位、企业、个人信息泄露&#xff0c;网络安全问题日益严峻&#xff0c;网络空间安全建设刻不容缓。 网络安全…

【unity进阶知识3】封装一个事件管理系统

前言 框架的事件系统主要负责高效的方法调用与数据传递&#xff0c;实现各功能之间的解耦&#xff0c;通常在调用某个实例的方法时&#xff0c;必须先获得这个实例的引用或者新实例化一个对象&#xff0c;低耦合度的框架结构希望程序本身不去关注被调用的方法所依托的实例对象…

亲测好用,吐血整理 ChatGPT 3.5/4.0新手使用手册~

都知道ChatGPT很强大&#xff0c;聊聊天、写论文、搞翻译、写代码、写文案、审合同等等&#xff0c;无所不能~ 那么到底怎么使用呢&#xff1f;其实很简单了&#xff0c;国内AI产品发展也很快&#xff0c;很多都很好用了~ 我一直在用&#xff0c;建议收藏下来~ 有最先进、最…

古代的“契丹人”在今天属于哪个民族

在中国古代&#xff0c;自从我国历史上的夏朝建立以来&#xff0c;一共出现了二十多个朝代。随着朝代的不断更替&#xff0c;社会也在不断前进。如今&#xff0c;封建社会已经成为过去&#xff0c;朝代和政权已不再是同一个概念。例如&#xff0c;在三国时期&#xff0c;魏、蜀…

可视掏耳勺鸡肋吗?高清可视掏耳勺牌子推荐!

很多人习惯在洗漱完顺手拿一根棉签掏耳朵&#xff0c;但是棉签的表面直径大且粗糙&#xff0c;不易将耳朵深处的耳垢挖出&#xff0c;耳垢堆积在耳道深处长时间不清理会导致堵塞耳道&#xff0c;引起耳鸣甚至感染。而可视掏耳勺作为一种新型的挖耳工具&#xff0c;它的安全性也…

羽毛球场馆预约系统,便捷管理预约

全国羽毛球运动的热度不断上升&#xff0c;在健身行业中掀起了一股羽毛球热潮。同时羽毛球运动的风靡&#xff0c;也吸引了不少人入局&#xff0c;各种大大小小的羽毛球馆不断出现&#xff0c;为大众的羽毛球喜好提供了场地。 随着互联网的发展&#xff0c;羽毛球馆也开始向线…

程序员转型攻略:数据分析师、AI大模型工程师、产品经理、云计算工程师,哪个更适合你?

先给结论再说理由&#xff1a;数据分析师、AI大模型工程师、产品经理和云计算工程师。 这些领域不仅因应了当前技术发展的趋势&#xff0c;也为程序员提供了转型的广阔舞台和职业发展的新机遇。 一起来看看吧&#xff01; 数据分析师&#xff1a;数据驱动决策的关键 程序员…

开源大模型技术路线及趋势

1. 三个维度 大模型研发力量 学术机构 大模型创业公司 科技大厂 旗舰开源模型的形态/模态 基础大模型 -> instruct大模型 -> 多模态&#xff08;VL大模型 -> 类gpt-4o大模型&#xff09; 时间线 23年上半年 23年下半年 24年 25年 2. 核心观察 学术机构及…

帮助中心:如何搭建有效解决客户问题的内容

在竞争激烈的市场环境中&#xff0c;优质的客户服务是企业脱颖而出的关键之一。而搭建一个高效、全面的帮助中心&#xff0c;提供有效解决客户问题的内容&#xff0c;则是提升客户满意度和忠诚度的重要途径。本文将探讨如何搭建这样一个帮助中心&#xff0c;以确保客户在遇到问…

机器学习_神经网络_深度学习

【神经网络——最易懂最清晰的一篇文章 - CSDN App】https://blog.csdn.net/illikang/article/details/82019945?type=blog&rId=82019945&refer=APP&source=weixin_45387165 参考以上资料,可对神经网络有初步了解。接下来可参考书籍等投身实际项目中使用。 书…

7大网络安全机构真实测评:零基础转行网安这么选就对了~

最近有不少零基础的朋友想学网络安全&#xff0c;但网络一搜索&#xff0c;各大品牌的课程都跳出来&#xff0c;让人看得眼花缭乱&#xff0c;真不知道怎么选。 今天就比较几家主流的7大网络安全机构课程&#xff0c;综合对了对比测评。不知道怎么选的朋友们&#xff0c;千万别…

稳定日入100,分享一个适合练手的AI绘画副业赛道

现在的AI玩法真的太多了&#xff0c;以前搞副业的人坚定的贯彻了把AI当作工具的思想&#xff0c;开发出各种各样有意思的AI副业玩法。 比如最近这种用AI做的女生的漫画Vlog视频就特别的火 更多实操教程和AI绘画工具,可以扫描下方,免费获取 1.爆款分析 这类账号为什么比较容易…

为什么现在很多人对网络空间安全专业持劝退态度?

知乎上有网友提问&#xff1a; 为什么现在很多人对网络空间安全专业持劝退态度&#xff1f; 来自某中部985网安大三本科的自述&#xff1a; 当初报志愿的时候第一志愿计科&#xff0c;第二志愿网安&#xff0c;结果就录到网安了。 但其实这两年感受下来&#xff0c;网安和计科…

GESP等级考试C++二级-do...while语句

与《GESP等级考试C二级-while语句》中提到的while语句类似&#xff0c;do...while语句也是用于循环执行某些语句。 1 do...while语句的格式 do...while语句的格式如图1所示。 图1 do...while语句的格式 该语句首先执行do中的“若干操作”&#xff0c;之后判断while语句中的“…