【STM32单片机】小恐龙游戏设计

news2024/11/16 6:22:54

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使用按键、IIC OLED模块等。
主要功能:
系统运行后,OLED液晶显示游戏初始界面,按下K4键开始,K1键跳跃;
在初始界面状态下,按下K3键进入设置界面,K1用于选择,K4确定,K3返回;
游戏界面左上角为最高得分,右上角为本次游戏得分。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/


void Buzzer_Init()//蜂鸣器初始化
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

void Buzzer(uint8_t SW)//蜂鸣器控制
{
	if(SW)
	{
	GPIO_SetBits(GPIOB,GPIO_Pin_0);
	}
	else
	{
	GPIO_ResetBits(GPIOB,GPIO_Pin_0);	
	}
}
void bostacle_refresh(void)//随机障碍
{
	obstacle_pos=obstacle(obstacle_ran,0);
	if(obstacle_pos+obstacle_length<=0)
	{
	obstacle_ran=rand()%4;
	obstacle_pos=obstacle(obstacle_ran,1);	
	}

	switch (obstacle_ran)//随机三种不同宽度障碍
	{
		case 0: obstacle_length=8;break;
		case 1: obstacle_length=16;break;
		default: obstacle_length=24;break;
	}			
}

void Show_other(void)//显示云、地面、分数
{	
	OLED_ShowString(1,14,"SC:",1,0);
	OLED_ShowString(1,0,"HS:",1,0);
	score++;
	if(score%100==0)Buzzer(1);
	else Buzzer(0);
	OLED_ShowDainamic8x128(7,roll);
	OLED_ShowCloud();
	OLED_ShowNum(1,17,score,5,1);
	OLED_ShowNum(1,4,Hs,5,1);
}
void loop_dead(void)//检测恐龙是否撞到障碍
{
	if((height<=16) && ((obstacle_pos>=16&&obstacle_pos<=32)||(obstacle_pos+obstacle_length>=16 && obstacle_pos+obstacle_length<=32)))deadflag=1;
	if(height<=0)KeyNum=Key();
	if(KeyNum==1 || height>0)
	{
		height=dinojump(0);
	}
	else dinorun();
}

const uint8_t close[]=
{
	3,2,1,1,1,1,2,3
};

void OLED_DeadAnimation(uint8_t newbest)//结算动画页面
{
	uint8_t i,j;
	if(Key()==4)reset=4;
	if(t==0)
	{	if(!Settlement)
		{
			for(i=0;i<8;i++)
			{
				OLED_SetCursor(i,0);
				for(j=0;j<128;j++)
				{
					OLED_Write_Data(0xFF);
					Delay_ms(close[i]);
				}
			}			
		}
		OLED_Clear();
		if(newbest==0)
		{
		OLED_ShowChinese(2,1,2,0);
		OLED_ShowChinese(2,2,3,0);
		OLED_ShowChinese(2,3,4,0);
		OLED_ShowString(2,7,"...",3,0);		
		}
		else 
		{
		OLED_ShowChinese(2,1,7,0);
		OLED_ShowChinese(2,2,8,0);
		OLED_ShowChinese(2,3,9,0);
		OLED_ShowString(2,7,"!!!",3,0);			
		}

		OLED_ShowString(7,2,"SC:",1,0);
		OLED_ShowNum(7,5,score,5,1);
		OLED_ShowDino(0,70);
		t++;
	}
}
void live(void)//游戏页面
{
	bostacle_refresh();
	loop_dead();
	Show_other();
	Speed=(score/30)+beingspeed;
	if(Speed>=speedmax)Speed=speedmax;
	Delay_ms(37-Speed);	
}
void die(void)//碰撞障碍后
{	
	uint8_t nowbest=0;
	if(score>Hs)nowbest=1;
	else nowbest=0;
	OLED_DeadAnimation(nowbest);	
	if(reset==4)
	{
		deadflag=0;
		height=0;
		obstacle(obstacle_ran,1);
		height=dinojump(1);
		t=0;
		reset=0;
		OLED_Clear();
		if(nowbest)Hs=score;
		score=0;
	}	
}

void Menu1(void)//返回游戏
{
	if(KeyNum==4)
		{
		mode=7;
		playflag=0;
		bmpflag=0;
		MenuShow=0;
		MenuSelect=0;
		menuclear=0;	
		OLED_Clear();
		}
}
void Menu2(void)//设置初始速度
{	
	OLED_ShowMenuChinese(1,1,4,0);OLED_ShowMenuChinese(1,2,5,0);OLED_ShowMenuChinese(1,3,6,0);OLED_ShowMenuChinese(1,4,7,0);//初始速度
	OLED_ShowNum(3,8,begingtemp,1,3);
	if(KeyNum==1){begingtemp++;begingtemp%=10;beingspeed=begingtemp*3;};
	if(KeyNum==4){Key4++;if(Key4>1){mode=7;Key4=0;}OLED_Clear();}
}
void Menu3(void)//设置速度上限
{
	OLED_ShowMenuChinese(1,1,8,0);OLED_ShowMenuChinese(1,2,9,0);OLED_ShowMenuChinese(1,3,10,0);OLED_ShowMenuChinese(1,4,11,0);
	OLED_ShowNum(3,8,speedtep,1,3);
	if(KeyNum==1){speedtep--;if(speedtep<=1)speedtep=1;speedmax=speedtep*4;}
	if(KeyNum==4){Key4++;if(Key4>1){mode=7;Key4=0;}OLED_Clear();}	
}
void Menu4(void)//蜂鸣器开关
{
	OLED_ShowMenuChinese(1,1,12,0);OLED_ShowMenuChinese(1,2,13,0);OLED_ShowMenuChinese(1,3,14,0);OLED_ShowMenuChinese(1,4,15,0);OLED_ShowMenuChinese(1,5,16,0);
	if(FMQswitch==0)
	{
		OLED_ShowString(3,7,"ON ",3,0);
	}
	else 
	OLED_ShowString(3,7,"OFF ",3,0);
	if(KeyNum==1){FMQswitch++;FMQswitch%=2;}
	if(KeyNum==4){Key4++;if(Key4>1){mode=7;Key4=0;}OLED_Clear();}	
}
void Menu5(void)//结算动画开关
{
	OLED_ShowMenuChinese(1,1,17,0);OLED_ShowMenuChinese(1,2,18,0);OLED_ShowMenuChinese(1,3,19,0);OLED_ShowMenuChinese(1,4,20,0);OLED_ShowMenuChinese(1,5,21,0);OLED_ShowMenuChinese(1,6,22,0);
	if(FMQswitch==0)
	{
		OLED_ShowString(3,7,"ON ",3,0);
	}
	else 
	{
	OLED_ShowString(3,7,"OFF",3,0);
	Settlement=~Settlement;
	}
	if(KeyNum==1){FMQswitch++;FMQswitch%=2;}
	if(KeyNum==4){Key4++;if(Key4>1){mode=7;Key4=0;}OLED_Clear();}	
}
void Menu6(void)//关机
{
	OLED_OFF();
}

void Menu(void)//菜单
{
	KeyNum=Key();
	if(KeyNum==2)
	{
		playflag=0;
		bmpflag=0;
	}
	if(menuclear==0)
	{
	OLED_Clear();menuclear++;
	}
	
	if(!MenuShow)
	{
		if(KeyNum==1)
		{	
			MenuSelect++;
			MenuSelect%=6;
			OLED_Clear();
		}
		OLED_ShowChinese(1,4,0,0);
		OLED_ShowChinese(1,5,1,0);
		switch(MenuSelect)
		{
		case 0:if(MenuSelect==0){
								OLED_ShowString(2,1,"1.",3,1);OLED_ShowMenuChinese(2,2,0,1);OLED_ShowMenuChinese(2,3,1,1);OLED_ShowMenuChinese(2,4,2,1);OLED_ShowMenuChinese(2,5,3,1);//返回游戏
								OLED_ShowString(3,1,"2.",3,0);OLED_ShowMenuChinese(3,2,4,0);OLED_ShowMenuChinese(3,3,5,0);OLED_ShowMenuChinese(3,4,6,0);OLED_ShowMenuChinese(3,5,7,0);//初始速度
								OLED_ShowString(4,1,"3.",3,0);OLED_ShowMenuChinese(4,2,8,0);OLED_ShowMenuChinese(4,3,9,0);OLED_ShowMenuChinese(4,4,10,0);OLED_ShowMenuChinese(4,5,11,0);//速度上限
								}
				else {OLED_ShowString(2,1,"1.",3,0);OLED_ShowMenuChinese(2,2,0,0);OLED_ShowMenuChinese(2,3,1,0);OLED_ShowMenuChinese(2,4,2,0);OLED_ShowMenuChinese(2,5,3,0);}break;//返回游戏}
		case 1:if(MenuSelect==1){
								OLED_ShowString(2,1,"1.",3,0);OLED_ShowMenuChinese(2,2,0,0);OLED_ShowMenuChinese(2,3,1,0);OLED_ShowMenuChinese(2,4,2,0);OLED_ShowMenuChinese(2,5,3,0);//返回游戏
								OLED_ShowString(3,1,"2.",3,1);OLED_ShowMenuChinese(3,2,4,1);OLED_ShowMenuChinese(3,3,5,1);OLED_ShowMenuChinese(3,4,6,1);OLED_ShowMenuChinese(3,5,7,1);//初始速度
								OLED_ShowString(4,1,"3.",3,0);OLED_ShowMenuChinese(4,2,8,0);OLED_ShowMenuChinese(4,3,9,0);OLED_ShowMenuChinese(4,4,10,0);OLED_ShowMenuChinese(4,5,11,0);//速度上限
								}
				else {OLED_ShowString(3,1,"2.",3,0);OLED_ShowMenuChinese(3,2,4,0);OLED_ShowMenuChinese(3,3,5,0);OLED_ShowMenuChinese(3,4,6,0);OLED_ShowMenuChinese(3,5,7,0);}break;//返回游戏}
		case 2:if(MenuSelect==2){
								OLED_ShowString(2,1,"1.",3,0);OLED_ShowMenuChinese(2,2,0,0);OLED_ShowMenuChinese(2,3,1,0);OLED_ShowMenuChinese(2,4,2,0);OLED_ShowMenuChinese(2,5,3,0);//返回游戏
								OLED_ShowString(3,1,"2.",3,0);OLED_ShowMenuChinese(3,2,4,0);OLED_ShowMenuChinese(3,3,5,0);OLED_ShowMenuChinese(3,4,6,0);OLED_ShowMenuChinese(3,5,7,0);//初始速度
								OLED_ShowString(4,1,"3.",3,1);OLED_ShowMenuChinese(4,2,8,1);OLED_ShowMenuChinese(4,3,9,1);OLED_ShowMenuChinese(4,4,10,1);OLED_ShowMenuChinese(4,5,11,1);//速度上限
								}
				else {OLED_ShowString(4,1,"3.",3,0);OLED_ShowMenuChinese(4,2,8,0);OLED_ShowMenuChinese(4,3,9,0);OLED_ShowMenuChinese(4,4,10,0);OLED_ShowMenuChinese(4,5,11,0);};break;//返回游戏}
		case 3:if(MenuSelect==3){
								OLED_ShowString(2,1,"4.",3,1);OLED_ShowMenuChinese(2,2,12,1);OLED_ShowMenuChinese(2,3,13,1);OLED_ShowMenuChinese(2,4,14,1);OLED_ShowMenuChinese(2,5,15,1);OLED_ShowMenuChinese(2,6,16,1);//蜂鸣器开关
								OLED_ShowString(3,1,"5.",3,0);OLED_ShowMenuChinese(3,2,17,0);OLED_ShowMenuChinese(3,3,18,0);OLED_ShowMenuChinese(3,4,19,0);OLED_ShowMenuChinese(3,5,20,0);OLED_ShowMenuChinese(3,6,21,0);OLED_ShowMenuChinese(3,7,22,0);//结算动画开关
								OLED_ShowString(4,1,"6.",3,0);OLED_ShowMenuChinese(4,2,23,0);OLED_ShowMenuChinese(4,3,24,0);//关机
								}
				else {OLED_ShowString(2,1,"4.",3,0);OLED_ShowMenuChinese(2,2,12,0);OLED_ShowMenuChinese(2,3,13,0);OLED_ShowMenuChinese(2,2,14,0);OLED_ShowMenuChinese(2,3,15,1);OLED_ShowMenuChinese(2,3,16,0);}break;
		case 4:if(MenuSelect==4){
								OLED_ShowString(2,1,"4.",3,0);OLED_ShowMenuChinese(2,2,12,0);OLED_ShowMenuChinese(2,3,13,0);OLED_ShowMenuChinese(2,4,14,0);OLED_ShowMenuChinese(2,5,15,0);OLED_ShowMenuChinese(2,6,16,0);//蜂鸣器开关
								OLED_ShowString(3,1,"5.",3,1);OLED_ShowMenuChinese(3,2,17,1);OLED_ShowMenuChinese(3,3,18,1);OLED_ShowMenuChinese(3,4,19,1);OLED_ShowMenuChinese(3,5,20,1);OLED_ShowMenuChinese(3,6,21,1);OLED_ShowMenuChinese(3,7,22,1);//结算动画开关
								OLED_ShowString(4,1,"6.",3,0);OLED_ShowMenuChinese(4,2,23,0);OLED_ShowMenuChinese(4,3,24,0);//关机
								}
				else {OLED_ShowString(3,1,"5.",3,0);OLED_ShowMenuChinese(3,2,17,0);OLED_ShowMenuChinese(3,3,18,0);OLED_ShowMenuChinese(3,4,19,0);OLED_ShowMenuChinese(3,5,20,0);OLED_ShowMenuChinese(3,6,21,0);OLED_ShowMenuChinese(3,7,22,0);}break;//结算动画开关
		case 5:if(MenuSelect==5){
								OLED_ShowString(2,1,"4.",3,0);OLED_ShowMenuChinese(2,2,12,0);OLED_ShowMenuChinese(2,3,13,0);OLED_ShowMenuChinese(2,4,14,0);OLED_ShowMenuChinese(2,5,15,0);OLED_ShowMenuChinese(2,6,16,0);//蜂鸣器开关
								OLED_ShowString(3,1,"5.",3,0);OLED_ShowMenuChinese(3,2,17,0);OLED_ShowMenuChinese(3,3,18,0);OLED_ShowMenuChinese(3,4,19,0);OLED_ShowMenuChinese(3,5,20,0);OLED_ShowMenuChinese(3,6,21,0);OLED_ShowMenuChinese(3,7,22,0);//结算动画开关
								OLED_ShowString(4,1,"6.",3,1);OLED_ShowMenuChinese(4,2,23,1);OLED_ShowMenuChinese(4,3,24,1);//关机
								}
				else {OLED_ShowString(4,1,"6.",3,0);OLED_ShowMenuChinese(4,2,23,0);OLED_ShowMenuChinese(4,3,24,0);}break;//关机
		}
	}
		if(KeyNum==4)
		{	
			if(ClearF==0)
			{
				ClearF++;
				OLED_Clear();
			}
			switch(MenuSelect)
			{
				case 0:mode=1;break;
				case 1:mode=2;break;
				case 2:mode=3;break;
				case 3:mode=4;break;
				case 4:mode=5;break;
				case 5:mode=6;break;
			}
		}		
				switch(mode)
			{
				case 1:Menu1();MenuShow=1;break;
				case 2:Menu2();MenuShow=1;break;
				case 3:Menu3();MenuShow=1;break;
				case 4:Menu4();MenuShow=1;break;
				case 5:Menu5();MenuShow=1;break;
				case 6:Menu6();MenuShow=1;break;
				case 7:MenuShow=0;break;
				default :break;
			}
}
int main(void)
{	
	Key_Init();
	OLED_Init();
	Buzzer_Init();
	end:
	while(1)
	{	
		if(playflag==0)
		{	
			if(bmpflag==0)
			{
			OLED_ShowBMP();
			bmpflag++;			
			}
			KeyNum=Key();
			if(KeyNum==4)
			{
				playflag=1;
				OLED_Clear();
			}
			if(KeyNum==2)
			{
				playflag=2;
			}
		}
		else if(playflag==1)
		{
			if(!deadflag){live();}else{die();goto end;}

		}
		else if(playflag==2)
		{
			Menu();
		}
	}
}



三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

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

相关文章

Twitter优化秘籍:置顶、列表、受众增长

在 Twitter 上&#xff0c;将你的一条推送文置顶到个人数据顶部是提高可见性和吸引关注者的绝佳方式。无论你是个人用户还是企业&#xff0c;此功能都可以让你的重要信息常驻在众人眼前&#xff0c;即使你发布了新的推文。接下来&#xff0c;我们将分享一些优化建议&#xff0c…

机器视觉工程师们,常回家看看

我们在这个社会上扮演着多重角色&#xff0c;有时候我们很难平衡好这些角色之间的关系。 人们常言&#xff0c;积善成德&#xff0c;改变命运。善修者&#xff0c;懂得积累&#xff0c;懂得改变命运的重要性。 我曾年少不知父母之不易。一路依靠&#xff0c;一路成长。 所谓…

【数据增强】

【数据增强】 1 数据增强的情形2 数据增强的方法 1 数据增强的情形 当数据比较小&#xff0c;难以获取新的训练数据时&#xff0c;可以考虑数据增强&#xff0c;如随机裁剪部分&#xff0c;随机左右上下翻转、随机旋转一个角度、随机亮度变化等微小变化&#xff0c;数据的多样…

conan入门(二十七):因profile [env]字段废弃导致的boost/1.81.0 在aarch64-linux-gnu下交叉编译失败

今天在尝试用conan 1.60.0使用aarch64-linux-gnu编译器交叉编译boost/1.81.0时报错了&#xff1a; conan install boost/1.81.0 -pr:h aarch64-linux-gnu.jinja -pr:b default --build boost输出如下&#xff1a; Configuration (profile_host): [settings] archarmv8 arch_b…

iOS——present相关属性以及dismiss多级的方法

push和present 两者的区别 push: push由视图栈控制&#xff0c;每一个视图都入栈&#xff0c;调用之前的视图则需要出栈&#xff0c;可返回任意一层&#xff0c;一般用于同一业务不同界面之间的切换。 push是由UINavigationController管理的视图控制器堆栈&#xff0c;在wind…

CSS3实现上下拉长加载动画效果

上下拉长加载动画效果 <!DOCTYPE html> <html><head><style>.container {display: flex;justify-content: center;align-items: center;width: 150px;height: 150px;margin: 50px auto;}.rectangle {width: 20px;height: 50px;background-color: #02A…

黑马JVM总结(十九)

&#xff08;1&#xff09;GC调优1 通过官网查看查看JVM的参数&#xff1a; 可以使用java命令查看当前环境下的虚拟机参数&#xff1a; 学会使用一些工具如前面学的jmap &#xff0c;jconsole等等工具 &#xff08;2&#xff09;GC调优2 垃圾回收调优只是众多调优中的一个方…

基于微信小程序的电动车智能充电系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明用户的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌…

THREE.JS 3D模型服务器报404问题(VUE fbx文件在本地能显示 服务器上不显示报404)

问题&#xff1a; 作为新手&#xff0c;新建立的threeJS模型&#xff0c;本地运行模型是可以显示的 &#xff0c;但服务器模型却报404 写法&#xff1a; fbxloader("TR7007Q").then((tree) > { tree.position.set(-1080, -20, 0);this.$refs.draw.scene.add(tree…

编辑.htaccess文件执行任意代码(CVE-2022-25578)

简介 CVE-2022-25578是Taocms v3.0.2中存在的一个安全漏洞&#xff0c;该漏洞允许攻击者通过任意编辑.htaccess文件来执行代码注入攻击。 Taocms是一个完善支持多数据库&#xff08;Sqlite/Mysql&#xff09;的CMS网站内容管理系统&#xff0c;是国内最小且功能完善的基于php…

DM/达梦数据库查询或更新某一列中多个字典码对应内容

准备工作&#xff08;建表、插入数据&#xff09; 1、建立表格&#xff1a;学生-学习科目表student_study 注意&#xff1a;科目kemu列内容是字典码&#xff0c;需要更换成对应内容。 CREATE TABLE "TEST"."STUDENT_STUDY" ( "NAME" VARCHAR(2…

技术分享| anyRTC音视频混流技术解析

一&#xff0c;简介 在视频通讯场景中&#xff0c;比如会议、直播等经常能看到图像合成的场景。图像合成是在指定的一块画面区域&#xff0c;在这个区域内&#xff0c;按画面的位置(坐标)布局&#xff0c;将区域中的每个视频画面的像素混合计算成一个像素&#xff08;RGB&…

深度学习中的激活函数 – 完整概述

1.什么是激活函数? 生物神经网络启发了人工神经网络的发展。然而,人工神经网络甚至不能近似代表大脑的工作方式。在我们知道为什么在人工神经网络中使用激活函数之前,了解生物神经网络中激活函数的相关性仍然很有用。 典型的神经元具有由细胞体、向其他神经元发送信息的轴…

源码:TMS FlexCel Studio for .NET 7.19

TMS FlexCel Studio for .NET 是100% 托管代码 Excel 文件操作引擎以及 Excel 和 PDF 报告生成&#xff0c;适用于 .NET、Xamarin.iOS、Xamarin.Android、Xamarin.Mac、Windows Phone 和 Windows Store 功能概述 使用 FlexCel Studio for .NET 创建可动态快速读写 Excel 文件的…

SQLite 3.43 发布,性能大提升!

前言 SQLite是一种被广泛运用的嵌入式关系型数据库管理系统&#xff0c;最新发布的SQLite 3.43版本带来了一个重要的改进&#xff0c;大幅提升了对JSON数据的处理性能&#xff0c;达到了之前的两倍。 主要更新 添加对 Contentless-Delete FTS5 索引的支持。这是 FTS5 全文搜索…

Go 常用命令介绍

Go 常用命令 文章目录 Go 常用命令一、Go 常用命令1.1 go build1.1.1 指定输出目录1.1.2 常用环境变量设置编译操作系统和 CPU 架构1.1.3 查看支持的操作系统和CPU架构 1.2 go test1.3 go vet1.4 go clean1.5 go fmt1.6 go get1.7 go install1.8 go tool1.9 go generate1.10 go…

iOS——KVC(键值编码)

键值编码&#xff08;KVC&#xff09; KVC&#xff08;Key Value Coding&#xff09;是一种允许以字符串形式间接操作对象属性的方式。 最基本的KVC是由NSKeyValueCoding协议提供支持&#xff0c;最基本的操作属性如下&#xff1a; setValue: 属性值 forKey: 属性名&#xff…

Flink1.14 Source概念入门讲解与源码解析

目录 Flink Source概念 Source Source源码 getBoundedness() createReader(SourceReaderContext readerContext) createEnumerator(SplitEnumeratorContext enumContext) SplitEnumerator restoreEnumerator(SplitEnumeratorContext enumContext, EnumChkT checkpoint) …

使用Selenium进行网页登录和会话管理

随着互联网的快速发展&#xff0c;网页登录和会话管理是许多网站和应用程序的基本功能。通过网页登录&#xff0c;用户可以访问个人账户、购物车订单、历史记录等个性化信息。为了提高用户体验和效率&#xff0c;自动化登录和会话管理成为一个重要的需求。而Selenium作为一种强…

信创办公–基于WPS的EXCEL最佳实践系列 (限制可录入内容)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;限制可录入内容&#xff09; 目录 应用背景操作过程1、数据有效性&#xff08;支出证明单&#xff09;2、如何完成数据有效性的使用&#xff08;差旅报销申请表&#xff09;3、清除数据验证4、利用圈释无效数据&#xff0c;验…