【蓝桥杯嵌入式】按键控制LED与LCD(必考三件套)

【蓝桥杯嵌入式】按键控制LED与LCD(必考三件套)

  • 前言
  • LED相关功能的实现
    • LED基础功能函数(点亮、全熄灭、翻转)
    • LED的闪烁与定时点亮熄灭
    • 流水灯的实现
  • 按键的扫描及长短按、双击的实现
    • 按键的短按
    • 按键业务逻辑程序进程
    • 按键的长短按
    • 长短按与双击
  • LCD移植与显示
    • LCD的移植与进程函数
    • LCD与LED冲突的问题解决
    • LCD的高亮显示

前言

按键、LED以及LCD是蓝桥杯每年必考的三个知识点,也作为工程建立的基础与突破口,因此熟练掌握该三个板块内容及其重要:

  1. 本人习惯自建user.c函数,将各种程序放在该文件内,方便程序编写

  2. LCD的实现不需要配置相关IO口,只需要对工程进行移植即可

    LCD_Init();
    LCD_SetBackColor(Black);	//设置背景颜色
    LCD_SetTextColor(White);	//设置字体颜色
    LCD_Clear(Black);			//清屏
    LCD_DisplayStringLine(Line4, (unsigned char *)"    Hello,world.   ");	//LCD显示函数
    
  3. 按键分为短按,长按和双击,长按考频率不高,双击至今还未考过

  4. LCD与LED共用引脚,需要对LCD相关函数进行优化

    u32 temp = GPIOC->ODR;GPIOC->ODR = temp;
    
  5. 业务逻辑在三个进程函数内实现,进程函数在while(1)中运行

  6. 亘古不变的变量

    uchar ui = 0;		//lcd显示的界面号
    char text[20];		//lcd的显存buf
    struct keys key[4] = {0,0,0};	//按键结构体变量					
    

注: 本文内容主要实现按键、LCD与LED的底层工程函数与配合使用功能的程序设计,相关cubemx工程配置请参考:【蓝桥杯嵌入式】Cubemx新建工程引脚配置与点亮LED

LED相关功能的实现

LED基础功能函数(点亮、全熄灭、翻转)

点亮一个LED灯

void led_show(uchar led, bool mode)
{HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);					//打开锁存器if(mode)HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8<<(led-1),GPIO_PIN_RESET);	//点亮一个LED灯elseHAL_GPIO_WritePin(GPIOC,GPIO_PIN_8<<(led-1),GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);					//关闭锁存器
}

关闭所有LED灯(用于初始化熄灭全部LED,在main.c的while(1)之前调用)

void led_offAll(void)
{HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

翻转LED

void led_toggle(uchar led)
{HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8<<(led-1));HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

LED的闪烁与定时点亮熄灭

  led的闪烁通过定时器在特定的时间内改变led的亮灭来实现闪烁效果,其中led的闪烁采用系统滴答定时器实现,本人习惯将stm32g4xx_it.c中的滴答定时器中断服务函数SysTick_Handler剪切至user.c中用于控制led的闪烁。
全局变量

bool shake_flag = 0;	//闪烁标志位
bool led_mode = 1;		//led状态
bool sec5_flag = 0;		//5s计时器

led进程函数

void led_process(void)
{//led闪烁if(shake_flag)led_show(1,led_mode);elseled_show(1,0);//5s计时启动,LED8亮if(sec5_flag == 1)led_show(8,1);elseled_show(8,0);
}

led闪烁的定时器中断底层设计
通过系统滴答定时器计时,滴答定时器的定时时间为1ms

uint shake_tick = 0;
u32 sec5_tick = 0;
void SysTick_Handler(void)
{//控制led闪烁if(shake_flag){shake_tick++;//led闪烁频率为1sif(shake_tick >= 500){shake_tick = 0;led_mode = !led_mode;}}//5s计时器if(sec5_flag){sec5_tick++;if(sec5_tick >= 5000){sec5_flag = 0;sec5_tick = 0;}}HAL_IncTick();
}

流水灯的实现

/**********************全局变量*******************/
//流水灯标志位
bool flue_flag = 0;	
bool flue_cnt = 0;u32 led_tick = 0;
void led_process(void)
{//控制进入led的时间 用于控制流水灯速度if(uwTick - led_tick < 150)return;led_tick = uwTick;if(flue_flag){static uchar i = 1;		if(i > 4)				//流水灯的范围{i = 1;led_show(4,0);}led_show(i,1);			//点亮流水灯	led_show(i-1,0);		//熄灭之前的灯i++;					//流水flue_cnt = 1;			//用于只关闭流水范围内的灯一次}else if(flue_cnt && flue_cnt == 1)	//流水结束 关闭流水范围内的灯 关一次{for(uchar  i = 1; i <= 4; i++)led_show(i,0);flue_cnt = 0;}
}

按键的扫描及长短按、双击的实现

  开发板的按键四颗按键分别接在PB0~PB2以及PA0引脚,当按下按键时,IO口被拉低,通过定时器扫描按键IO口电平状态来检测按键是否被按下,按键原理图如下图所示:

定时器中断回调函数
记得在main.c函数的初始化中打开定时器中断!!!

HAL_TIM_Base_Start_IT(&htim6);

重写回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

直接去tim.c底下的stm32g4xx_hal_tim.h里面找即可,直接拖到文件末尾,倒数第三个板块的第一个函数。

按键的短按

按键结构体定义:

struct keys{uchar judge_sta;	//状态集	bool key_sta;		//IO口电平bool single_flag;	//短按标志位
};

按键变量的定义

struct keys key[4] = {0,0,0};

其中短按的程序设计逻辑为:

  1. IO口电平为0,按下
  2. 软件消抖(判断是否真实按下)
  3. 松手检测,短按标志置1

短按的定时器扫描实现:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6)		//对应的定时器中断	 10ms{//读取IO口电平key[0].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);key[1].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(uchar i = 0; i < 4; i++){switch(key[i].judge_sta){case 0:if(key[i].key_sta == 0)			//按键按下key[i].judge_sta = 1;break;case 1:								//消抖 10msif(key[i].key_sta == 0)key[i].judge_sta = 2;elsekey[i].judge_sta = 0;break;case 2:if(key[i].key_sta == 1)			//松手 短按标志置1{key[i].single_flag = 1;key[i].judge_sta = 0;}break;}}}
}

按键业务逻辑程序进程

void key_process(void)
{if(key[0].single_flag == 1)		//按键1按下{//按键1短按业务逻辑程序led_toggle(1);ui = (ui + 1) % 3;	//按键1通常为切换界面LCD_Clear(Black);	//☆切换界面记得需要清屏key[0].single_flag = 0;		//清空按下标志位}if(key[1].single_flag == 1)		//按键2按下{//按键2短按业务逻辑程序led_toggle(2);key[1].single_flag = 0;}if(key[2].single_flag == 1)		//按键3按下{//按键3短按业务逻辑程序led_toggle(3);key[2].single_flag = 0;}if(key[3].single_flag == 1)		//按键4按下{//按键4短按业务逻辑程序led_toggle(4);key[3].single_flag = 0;}/*******以下是有长短按时的业务逻辑,其他按键同理******/if(key[3].long_flag == 1)		//按键4长按{//按键4短按业务逻辑程序led_show(5,1);key[3].long_flag = 0;}if(key[3].double_flag == 1)		//按键4双击{//按键4短按业务逻辑程序led_show(5,0);key[3].double_flag = 0;}
}

按键的长短按

按键结构体的定义

struct keys{uchar judge_sta;	//状态集	bool key_sta;		//IO口电平bool single_flag;	//短按按下标志位uint key_time;		//按键按下时间bool long_flag;		//长按标志位
};

按键变量的定义

struct keys key[4] = {0,0,0,0,0};

长按的程序设计逻辑为:

  1. IO口电平为0,按下,启动计时
  2. 软件消抖(判断是否真实按下)
  3. 计时,若按下时间超过0.8s,长按标志置1
  4. 松手检测,若按下时间小于0.8s,短按标志置1

按键的长短按定时器扫描实现

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{	if(htim->Instance == TIM6)			//对应的定时器中断	 10ms{//读取IO口电平key[0].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);key[1].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(uchar i = 0; i < 4; i++){switch(key[i].judge_sta){case 0:if(key[i].key_sta == 0)			//按键按下 时间置0{key[i].judge_sta = 1;key[i].key_time = 0;}break;case 1:								//消抖 10msif(key[i].key_sta == 0)key[i].judge_sta = 2;elsekey[i].judge_sta = 0;break;case 2:if(key[i].key_sta == 1)			//松手{if(key[i].key_time < 80)	//按下时间小于800ms 短按	key[i].single_flag = 1;key[i].judge_sta = 0;}else{key[i].key_time++;if(key[i].key_time >= 80)	//按下时间一旦大于800ms 长按	key[i].long_flag = 1;}break;}}}
}

长短按与双击

按键结构体的定义

struct keys{uchar judge_sta;	//状态集bool key_sta;		//IO口电平uint key_time1;		//第一次按下时间uint key_time2;		//松手后的时间bool single_flag;	//短按标志bool long_flag;		//长按标志bool double_flag;	//双击标志
};

按键变量的定义

struct keys key[4] = {0,0,0,0,0,0,0};

双击的程序设计逻辑为:

  1. IO口电平为0,按下,启动第一次按下计时
  2. 软件消抖(判断是否真实按下)
  3. 计时按下时间
  4. 松手,开始计时松手时间,若再次按下,则进入双击
  5. 松手超过300ms,判断为长短按,结束
  6. 进入双击,消抖
  7. 检测松手,双击标志置1
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{	if(htim->Instance == TIM6)			//对应的定时器中断	 10ms{//读取IO口电平key[0].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);key[1].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);key[2].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);key[3].key_sta = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);for(uchar i = 0; i < 4; i++){switch(key[i].judge_sta){case 0:if(key[i].key_sta == 0)			//按键按下 时间置0{key[i].judge_sta = 1;key[i].key_time1 = 0;key[i].key_time2 = 0;}break;case 1:								//消抖 10msif(key[i].key_sta == 0)key[i].judge_sta = 2;elsekey[i].judge_sta = 0;break;case 2:if(key[i].key_sta == 1)			//松手key[i].judge_sta = 3;else{key[i].key_time1++;if(key[i].key_time1 >= 80)key[i].long_flag = 1;}break;case 3:if(key[i].key_sta == 1){key[i].key_time2++;if(key[i].key_time2 >= 30)	//长短按{if(key[i].key_time1 < 80)key[i].single_flag = 1;key[i].judge_sta = 0;	}}elsekey[i].judge_sta = 4;		//双击了break;case 4:if(key[i].key_sta == 0)key[i].judge_sta = 5;		//消抖else{if(key[i].key_time1 >= 80)key[i].long_flag = 1;elsekey[i].single_flag = 1;	key[i].judge_sta = 0;}break;case 5:if(key[i].key_sta == 1)		//双击松手{key[i].double_flag = 1;key[i].judge_sta = 0;}break;}}}
}

LCD移植与显示

LCD的移植与进程函数

  LCD的相关引脚配置无需在cubemx中进行配置,只需要将官方提供的lcd.c复制到src文件夹,将lcd.h,fonts.h复制到ins文件夹中即可,并将lcd.c文件添加至工程中,复制例程中main.c的相关配置即可
初始化lcd

LCD_Init();

lcd相关配置

LCD_SetBackColor(Black);	//设置背景颜色
LCD_SetTextColor(White);	//设置字体颜色
LCD_Clear(Black);			//清屏

lcd进程函数

void lcd_process(void)
{if(ui == 0)					//第一个界面显示的内容{sprintf(text,"     Title1 ");LCD_DisplayStringLine(Line1, (unsigned char *)text);	//LCD显示函数/******************其他显示的内如下****************/}else if(ui == 1)		//第二个界面显示的内容{sprintf(text,"     Title2 ");LCD_DisplayStringLine(Line1, (unsigned char *)text);	//LCD显示函数/******************其他显示的内如下****************/}else if(ui == 2)		//第三个界面显示的内容{sprintf(text,"     Title3 ");LCD_DisplayStringLine(Line1, (unsigned char *)text);	//LCD显示函数/******************其他显示的内如下****************/}
}

LCD与LED冲突的问题解决

  对于蓝桥杯的开发板,几乎每题都会遇到LED与LCD显示冲突的情况,这是因为LCD与LED共用了PC8 ~ PC15的引脚,这使得LCD更新显示,PC的引脚电平就无法确定了,使得LCD显示与LED会冲突。

解决办法: 操作LCD之前保存GPIOC相关寄存器的值,对LCD操作结束后,重新恢复原值,对LCD的高亮显示

void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(u16 RGB_Code);

这三个函数进行处理,即,首行都加上u32 temp = GPIOC->ODR;,尾行都加上GPIO->ODR = temp;即可

如下所示,其他两个函数进行同理操作

void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{u32 temp = GPIOC->ODR;GPIOB->BRR  |= GPIO_PIN_9;GPIOB->BRR  |= GPIO_PIN_8;GPIOB->BSRR |= GPIO_PIN_5;GPIOC->ODR = LCD_Reg;GPIOB->BRR  |= GPIO_PIN_5;__nop();__nop();__nop();GPIOB->BSRR |= GPIO_PIN_5;GPIOB->BSRR |= GPIO_PIN_8;GPIOC->ODR = LCD_RegValue;GPIOB->BRR  |= GPIO_PIN_5;__nop();__nop();__nop();GPIOB->BSRR |= GPIO_PIN_5;GPIOB->BSRR |= GPIO_PIN_8;GPIOC->ODR = temp;
}

LCD的高亮显示

  LCD的高亮显示即设置LCD的背景颜色,若直接设置LCD的背景颜色则是对整个界面设置,因此需要再LCD_DisplayStringLine的内部设置颜色,从而确定高亮显示的位置,改写LCD_DisplayStringLine函数为LCD_DisplayStringLineHight代表高亮显示的函数,其中添加一个参数表示高亮显示的起点,高亮显示的终点或长度可自行决定设置,这里以第九届赛题为例:起始位置为参数,每次高亮长度为2个位置

高亮函数的实现

void LCD_DisplayStringLineHight(u8 Line, u8 *ptr,uint8_t start)
{u32 i = 0;u16 refcolumn = 319;//319;LCD_SetBackColor(Black);	//其他位置保持背景颜色为黑色 while ((*ptr != 0) && (i < 20))	 //	20{if(i >= start && i < (start + 2))LCD_SetBackColor(Green);	//特定位置设置背景颜色为绿色 elseLCD_SetBackColor(Black);	//其他位置保持背景颜色为黑色 LCD_DisplayChar(Line, refcolumn, *ptr);refcolumn -= 16;ptr++;i++;}LCD_SetBackColor(Black);	//其他位置保持背景颜色为黑色 
}

LCD进程函数中调用高亮函数,实现特定位置的高亮显示

void lcd_process(void)
{if(ui == 0)					//第一个界面显示的内容{sprintf(text,"     Title1 ");LCD_DisplayStringLine(Line1, (unsigned char *)text);	//LCD显示函数/******************其他显示的内如下****************/sprintf(text,"     %02d:%02d:%02d  ",12,2,2);switch(choice){case 0:	LCD_DisplayStringLine(Line3,(unsigned char *)text);break;case 1:	LCD_DisplayStringLineHight(Line3,(unsigned char *)text,5);break;case 2:	LCD_DisplayStringLineHight(Line3,(unsigned char *)text,8);break;case 3:	LCD_DisplayStringLineHight(Line3,(unsigned char *)text,11);break;default:break;}}
}

实际效果:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再聊一聊AUC指标

关于模型评估的指标&#xff0c;之前已经写过不少这方面的文章&#xff0c;最近在实践中又有了一点新的思考&#xff0c;本文对模型评估中的AUC指标再进行一些简单的探讨。 情况一&#xff0c;以下图中的数据为例&#xff0c;1代表用户发生逾期&#xff0c;标记为坏样本&#x…

C#将Console写至文件,且文件固定最大长度

参考文章 将C#的Console.Write同步到控制台和log文件输出 业务需求 在生产环境中&#xff0c;控制台窗口不便展示出来。 为了在生产环境中&#xff0c;完整记录控制台应用的输出&#xff0c;选择将其输出到文件中。 但是&#xff0c;一次性存储所有输出的话&#xff0c;文件会…

Stable Diffusion介绍

Stable Diffusion是一种前沿的开源深度学习模型框架&#xff0c;专门设计用于从文本描述生成高质量的图像。这种称为文本到图像生成的技术&#xff0c;利用了大规模变换器&#xff08;transformers&#xff09;和生成对抗网络&#xff08;GANs&#xff09;的力量&#xff0c;以…

五分钟快速搭建五金行业小程序商城教程解析

作为五金行业的从业者&#xff0c;你可能想要拓展线上业务&#xff0c;提供更方便快捷的购物体验给顾客。而小程序商城成为了一种非常受欢迎的方式。但是&#xff0c;你可能觉得不懂代码无法实现这样的小程序商城。现在&#xff0c;我将通过以下步骤&#xff0c;教你如何在五分…

Github项目推荐-ChatGPT-Admin-Web

项目地址 https://github.com/AprilNEA/ChatGPT-Admin-Web 项目简介 通过api接入大模型&#xff0c;并基于此封装了一层用户管理的功能&#xff0c;适合团队内使用。 项目截图

Vue基础知识:Vue路由——重定向,以及?(可选符)的使用

当网页打开时&#xff0c;url默认是/路径&#xff08;根路径&#xff09;&#xff0c;未匹配到组件时&#xff0c;会出现空白&#xff0c;为了解决这个问题 就要利用重定向 重定向&#xff1a;匹配path后&#xff0c;强制跳转path路径 重定向的语法&#xff1a; {path:匹配…

爬虫实战一、Scrapy开发环境(Win10+Anaconda3)搭建

#前言 在这儿推荐使用Anaconda进行安装&#xff0c;并不推荐大家用pythonpip安装&#xff0c;因为pythonpip的坑实在是太多了。 #一、环境中准备&#xff1a; Win10&#xff08;企业版&#xff09;Anaconda3-5.0.1-Windows-x86_64&#xff0c;下载地址&#xff0c;如果打不开…

易宝OA GetProductInv SQL注入漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、 流程管理 、知识管理(档案和业务管理)、协同办公等多种功能。 0x02 漏洞概述 易宝OA /SmartTradeScan/Inventory/GetProductInv 接口处存在SQL注入漏洞,未经身份…

nodejs应用程序不同部署环境下的差异配置方案

一、背景 nodejs应用程序&#xff0c;不同于java语言使用分布式配置&#xff0c;当部署于不同的环境里&#xff0c;因为环境的差异&#xff0c;配置项的值也不尽相同。 最常见的差异就是数据库的连接信息&#xff0c;而代码是一份&#xff0c;不能把生产环境的信息暴露在非生产…

day02 51单片机

51单片机学习 1闪烁LED 1.1 需求描述 这个案例,我们要让P00引脚对应的LED按照1秒闪烁1次。 1.2 硬件设计 1.1 软件设计 1)LED闪烁的代码 想让LED闪烁,就需要P00的值不断在0和1之间循环变化。实现这一功能的代码也很简单: #include <STC89C5xRC.H> //包含STC89…

xss【2】

1.xss钓鱼 钓鱼攻击利用页面&#xff0c;fish.php黑客钓鱼获取到账号密码存储的位置 xss进行键盘记录 2.xss常规防范 3.xss验证payload XSS&#xff08;跨站攻击&#xff09;_details/open/ontoggle-CSDN博客

数据结构(3)----栈和队列

目录 一.栈 1.栈的基本概念 2.栈的基本操作 3.顺序栈的实现 •顺序栈的定义 •顺序栈的初始化 •进栈操作 •出栈操作 •读栈顶元素操作 •若使用另一种方式: 4.链栈的实现 •链栈的进栈操作 •链栈的出栈操作 •读栈顶元素 二.队列 1.队列的基本概念 2.队列的基…

Annaconda的替代品miniforge!

用了多年的Annaconda竟然要收费了&#xff08;个人不收费&#xff0c;企业收费&#xff0c;但个人电脑在企业IP下&#xff0c;还是被警告了&#xff09;&#xff0c;只能用miniforge 全面替换了&#xff01; 一、卸载anaconda windows下卸载&#xff0c; 设置 -> 应用和功…

【算法】动态规划练习(一)

目录 1137. 第 N 个泰波那契数 分析 代码 面试题 08.01. 三步问题 分析 代码 746. 使用最小花费爬楼梯 分析 代码 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波…

C++进阶篇11---IO流

一、对C语言的输入输出的理解 C语言中我们经常用scanf()和printf()进行输入输出&#xff0c;形象的描述它们的作用如下 对于缓冲区的理解&#xff1a; 可以屏蔽掉低级I/O的实现&#xff0c;低级I/O的实现依赖操作系统本身内核的实现&#xff0c;所以如果能够屏蔽这部分的差异…

基于PHP的校园招聘管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的校园招聘管理系统 一 介绍 此校园招聘管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为个人用户&#xff0c;企业和管理员三种。 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二…

蓝桥杯第十四届C++C组

目录 三国游戏 填充 翻转 【单调队列优化DP】子矩阵 【快速幂、欧拉函数】互质数的个数 【tire树】异或和之差 【质因数分解】公因数匹配 子树的大小 三国游戏 题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都…

C语言整数和小数的存储

1.整数在内存中的存储 计算机使用二进制进行存储、运算&#xff0c;整数在内存中存储使用的是二进制补码 1.1原码、反码、补码 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&am…

Qt实现无边框圆角窗口

我们在使用QDialog的时候许多场景下都不需要默认的标题栏&#xff0c;这时候我们需要设置他的标志位。 this->setWindowFlags(Qt::FramelessWindowHint);由于现代的窗口风格&#xff0c;我们一般会设置窗口为圆角边框的样式&#xff0c;我们可以使用qss的方式来进行设置。 …

汇编——SSE打包整数

SSE也可以进行整数向量的加法&#xff0c;示例如下&#xff1a; ;sse_integer.asm extern printfsection .datadummy db 13 align 16pdivector1 dd 1dd 2dd 3dd 4pdivector2 dd 5dd 6dd 7dd 8fmt1 db "Packed Integer Vector 1: %d, %d, %d, %d",…