14【模塊學習】74HC595:使用學習

74HC595

  • 1、74HC595簡介
  • 2、代碼演示
    • 2.1、驅動8位流水燈
  • 3、74HC595級聯
    • 3.1、驅動16位流水燈
    • 3.2、驅動8位數碼管
    • 3.3、驅動8x8點陣屏幕
    • 3.4、8x8點陣屏幕滾動顯示

1、74HC595簡介

在51單片機中IO引腳資源十分的緊缺,所以常常需要使用75HC595芯片進行驅動那些需要占用多個IO引腳的芯片。那么75HC595是是什么喃?

74H595是一款串轉并移位控制的芯片,通過移位的方式將串行輸入的數據變為并行輸出的數據

在這里插入圖片描述

引腳功能
VCC供電正極(2v~6v)
GND供電負極
DS串行數據輸入引腳(8位)
Q7~Q0并行數據輸出引腳(Q7對應數據高位)
SHCP移位寄存器時鐘輸入
STCP輸出寄存器時鐘輸入
Q7S8位數據串行輸出引腳(常用于級聯)
OE輸出使能引腳

在這里插入圖片描述

2、代碼演示

在這里插入圖片描述

2.1、驅動8位流水燈

①H595.c文件的代碼如下:

#include "H595.h"/*** 使用74HC595串行數據轉換位并行數據* Byte:輸入的串行數據*/
void HC595_Driver(unsigned char Byte)
{unsigned char i = 0;HC595_ST = 0;for(i = 0; i < 8; i++){HC595_SH = 0;					//SH低電平,將數據寫入到輸入數據引腳上HC595_DS = (Byte & (0x80 >> i));//高位先行HC595_SH = 1;	//595的SH引腳來一個上升沿將數據進行移位}	HC595_ST = 1;		//595的ST引腳來一個上升沿將移位寄存器的數據移到存儲寄存器HC595_OE = 0;		//輸出使能
}

②H595.h文件的代碼如下:

#ifndef __H595_H
#define __H595_H
#include <REGX52.H>	//包含51頭文件,里面全是寄存器地址sbit HC595_SH = P1^2;	//移位時鐘引腳
sbit HC595_DS = P1^3;	//HC595輸入數據口
sbit HC595_ST = P1^4;	//存儲時鐘引腳
sbit HC595_OE = P1^5;	//輸出使能引腳void HC595_Driver(unsigned char Byte);#endif

③main.c文件的代碼如下:

#include "H595.h"
#include "Delay.h"
#include "Timer.h"void main(void)
{Time0_Intrrupt_Init();while(1){unsigned char temp = 0x01;unsigned char i;for(i = 1; i < 8; i++)	//循環7次{HC595_Driver(temp);temp <<= 1;			//循環結束num = 1000 0000Delay_ms(500);		//延時500ms}for(i = 1; i < 8; i++)	//循環7次{HC595_Driver(temp);temp >>= 1;			//循環結束num = 0000 0001Delay_ms(500);		//延時500ms}}
}

3、74HC595級聯

綜上:74HC595的Q7S引腳是串行輸出引腳,常常用于多片的75HC595芯片的級聯。2片級聯,則可看成一個2字節數據串轉并移位寄存器,4片級聯,則可看成4字節數據串轉并移位寄存器

在這里插入圖片描述
如圖:2片74HC595進行級聯,他們的SH引腳,ST引腳,OE引腳都連接在一起,第一片H595芯片的Q7S連接著第二片芯片的數據輸入引腳。

3.1、驅動16位流水燈

在這里插入圖片描述
①H595.c文件的代碼如下:

/*** 2片74HC595的級聯* HByte:高位字節的數據* LByte:低位字節的數據*/
void HC595_Cascade(unsigned char HByte, unsigned char LByte)
{	unsigned char i = 0;HC595_ST = 0;/* 將高位字節的數據移位到第一個595里面 */for(i = 0; i < 8; i++){HC595_SH = 0;HC595_DS = (HByte & (0x80 >> i));//高位先行HC595_SH = 1;	//595的SH引腳來一個上升沿將數據進行移位}	/* 將高位字節的數據移位到第二個595里面,低位字節的數據移到第一個595里面 */for(i = 0; i < 8; i++){HC595_SH = 0;HC595_DS = (LByte & (0x80 >> i));//高位先行HC595_SH = 1;	//595的SH引腳來一個上升沿將數據進行移位}	HC595_ST = 1;		//595的ST引腳來一個上升沿將移位寄存器的數據移到存儲寄存器HC595_OE = 0;		//輸出使能
}

②H595.h文件的代碼如下:

#ifndef __H595_H
#define __H595_H
#include <REGX52.H>	//包含51頭文件,里面全是寄存器地址sbit HC595_SH = P1^2;	//移位時鐘引腳
sbit HC595_DS = P1^3;	//HC595輸入數據口
sbit HC595_ST = P1^4;	//存儲時鐘引腳
sbit HC595_OE = P1^5;	//輸出使能引腳void HC595_Cascade(unsigned char HByte, unsigned char LByte);;#endif

③main.c文件的代碼如下:

#include "H595.h"
#include "Delay.h"
#include "Timer.h"void main(void)
{Time0_Intrrupt_Init();while(1){unsigned char Htemp = 0x01;unsigned char Ltemp = 0x01;unsigned char i;for(i = 1; i < 8; i++)		//循環7次{HC595_Cascade(0x00, Ltemp);Ltemp <<= 1;			//S循環結束num = 1000 0000Delay_ms(500);			//延時500ms}HC595_Cascade(0x00, Ltemp);Delay_ms(500);				//延時500msfor(i = 1; i < 8; i++)		//循環7次{HC595_Cascade(Htemp, 0x00);Htemp <<= 1;			//S循環結束num = 1000 0000Delay_ms(500);			//延時500ms}		for(i = 1; i < 8; i++)		//循環7次{HC595_Cascade(Htemp, 0x00);Htemp >>= 1;			//循環結束num = 0000 0001Delay_ms(500);			//延時500ms}HC595_Cascade(Htemp, 0x00);Delay_ms(500);				//延時500msfor(i = 1; i < 8; i++)		//循環7次{HC595_Cascade(0x00, Ltemp);Ltemp >>= 1;			//循環結束num = 0000 0001Delay_ms(500);			//延時500ms}}
}

3.2、驅動8位數碼管

在這里插入圖片描述

①H595_SEG8.c文件的代碼如下:

/***********************************/
/*    8位數碼管的底層驅動文件      */
/***********************************/#include "H595_Seg8.h"/*** 2片74HC595的級聯* PossData:位選數據* SegData:段碼數字據*/
void HC595_Cascade_Seg8(unsigned char PossData, unsigned char SegData)
{	unsigned char i = 0;SEG_ST = 0;/* 將高位字節的數據移位到第一個595里面 */for(i = 0; i < 8; i++){SEG_SH = 0;SEG_DS = (PossData & (0x80 >> i));//高位先行SEG_SH = 1;	//595的SH引腳來一個上升沿將數據進行移位}	/* 將高位字節的數據移位到第二個595里面,低位字節的數據移到第一個595里面 */for(i = 0; i < 8; i++){SEG_SH = 0;SEG_DS = (SegData & (0x80 >> i));//高位先行SEG_SH = 1;	//595的SH引腳來一個上升沿將數據進行移位}	SEG_ST = 1;		//595的ST引腳來一個上升沿將移位寄存器的數據移到存儲寄存器SEG_OE = 0;		//輸出使能
}/* 字符數據 */
static unsigned char code Data8[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, //共陽極顯示的數值0 ~ 90xBF,0x7F,0x8C									   //-,.P
};/* 顯示的數值緩存區 */
unsigned char SegNum8[] = {0,0,0,0,0,0,0,0};/*** 選擇哪個數碼管顯示數據的函數* Position:哪一個數碼管* Data:需要顯示的數據*/
void Seg8_Choice(unsigned char Position, unsigned char DisplayData)
{HC595_Cascade_Seg8(0x00,0x00);												//讓8個數碼管先熄滅HC595_Cascade_Seg8((0x01 << (Position - 1)), Data8[SegNum8[DisplayData]]);	//傳入段碼數據進行顯示
}

②H595_SEG8.h文件的代碼如下:

#ifndef __H595_Seg8_H
#define __H595_Seg8_H
#include <REGX52.H>	//包含51頭文件,里面全是寄存器地址sbit SEG_SH = P0^0;	//移位時鐘引腳
sbit SEG_DS = P0^1;	//HC595輸入數據口
sbit SEG_ST = P0^2;	//存儲時鐘引腳
sbit SEG_OE = P0^3;	//輸出使能引腳extern unsigned char SegNum8[];void HC595_Cascade_Seg8(unsigned char PossData, unsigned char SegData);
void Seg8_Choice(unsigned char Position, unsigned char DisplayData);#endif

③User_SEG8.c文件的代碼如下:

/********************************************/
/*    使用74HC595驅動8位數碼管的應用層       */
/********************************************/
#include "User_Seg8.h"void Delay1ms()		//@11.0592MHz
{unsigned char i, j;i = 2;j = 199;do{while (--j);} while (--i);
}/*** X的Y次方函數*/
unsigned int SEG8_Pow(unsigned char X,unsigned char Y)
{unsigned int Result = 1;while(Y--){Result *= X;}return Result;
}/*** 數碼管顯示正整數* Number:0~65535* Length:有效數值長度* Lie:   顯示的位置1~8*/
void SEG8_Show_Num(unsigned char Lie,unsigned short Number,unsigned char Length)
{/* 將整數進行拆分在通過數碼管顯示 */unsigned char i,Data;for(i = 0; i < Length; i++){Data = (Number / SEG8_Pow(10,Length - i -1)) % 10;//將整數進行拆分SegNum8[0] = Data;Seg8_Choice(i+Lie,0);//顯示Delay1ms();}
}/*** 數碼管顯示有符號整數* Number:-32768~32767* Length:有效數值長度* Lie:   顯示的位置1~8*/
void SEG8_Show_SignedNum(unsigned char Lie, short Number,unsigned char Length)
{/* 若為負數,先顯示負號 */if(Number < 0){Number = -Number;SegNum8[0] = 10;Seg8_Choice(Lie,0);		//顯示"-"Lie++;}SEG8_Show_Num(Lie, Number, Length);
}/*** 數碼管顯示有符號小數* Number:小數數值* Floatcount:顯示幾位小數* Lie:   顯示的位置1~8* IntCount:  整數的個數* Floatcount:小數的個數*/
void SEG8_Show_FloatNum(unsigned char Lie, float Number, unsigned char IntCount, unsigned char Floatcount)
{short Num = 0;	if(Number < 0){Number = -Number;	//將負數轉換為正數,例如:3.14 = -(-3.14)SegNum8[0] = 10;Seg8_Choice(Lie,0);	//顯示"-"Lie++;}/* 先提取整數部分 */Num = Number;			//此時Num保存的是小數的整數部分,例如:Number = 3.14,Num = 3SEG8_Show_Num(Lie,Num,IntCount);/* 將小數換算為整數 */Number -= Num;					//Number = Number - Num,Number = 3.14 - 3 = 0.14Num = (short)(Number * SEG8_Pow(10,Floatcount));//將小數將小數換算為整數,0.14 * 100 = 14SegNum8[0] = 11;				//先添加數據的索引Seg8_Choice(Lie+IntCount-1,0);	//顯示小數點/* 顯示小數部分 */SEG8_Show_Num(Lie+IntCount, Num, Floatcount);
}

④User_SEG8.h文件的代碼如下:

#ifndef __User_Seg8_H
#define __User_Seg8_H
#include "H595_Seg8.h"unsigned int SEG8_Pow(unsigned char X,unsigned char Y);
void SEG8_Show_Num(unsigned char Lie,unsigned short Number,unsigned char Length);
void SEG8_Show_SignedNum(unsigned char Lie, short Number,unsigned char Length);
void SEG8_Show_FloatNum(unsigned char Lie, float Number, unsigned char IntCount, unsigned char Floatcount);#endif

⑤main.c文件的代碼如下:

#include "User_Seg8.h"void main(void)
{		while(1){SEG8_Show_FloatNum(1,-200.123,3,3);}
}

在這里插入圖片描述

3.3、驅動8x8點陣屏幕

在這里插入圖片描述

如圖:點亮圖上的小亮點,則陰極引腳輸出的數據為:1011 1111(0xBF)選中第2列;陽引腳輸出的數據為:1000 0000(0x80)表示點亮選中的列的最上的LED

LED顯示字符的方法:
例如想要顯示如下圖是字符:

在這里插入圖片描述

列掃描:從左到右依次從第一列進行掃描,即(共陰極的引腳數據依次為:0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE)。而共陽極字模數據Data[8] = {0x00,0x00,0xFF,0x08,0x08,0xFF,0x00,0x00};當進行第一列掃描時,共陽極引腳輸出Data[0]

在這里插入圖片描述

①Dot_LED.c文件的代碼如下:

#include "Dot_LED.h"/*** 2片74HC595的級聯* LEDNode:	陽極數據,選擇選定的列中哪幾個LED點亮* LEDCathode: 陰極數據,選擇哪一列點亮*/
void HC595_Cascade_8x8LED(unsigned char LEDNode, unsigned char LEDCathode)
{	unsigned char i = 0;LED_ST = 0;/* 將高位字節的數據移位到第一個595里面 */for(i = 0; i < 8; i++){LED_SH = 0;LED_DS = (LEDNode & (0x80 >> i));//高位先行LED_SH = 1;	//595的SH引腳來一個上升沿將數據進行移位}	/* 將高位字節的數據移位到第二個595里面,低位字節的數據移到第一個595里面 */for(i = 0; i < 8; i++){LED_SH = 0;LED_DS = (LEDCathode & (0x80 >> i));//高位先行LED_SH = 1;	//595的SH引腳來一個上升沿將數據進行移位}	LED_ST = 1;		//595的ST引腳來一個上升沿將移位寄存器的數據移到存儲寄存器LED_OE = 0;		//輸出使能
}/*** 8x8點陣顯示函數(列掃描顯示)*/
void Show_8X8Dot_ColumnScan(unsigned char *Data)
{unsigned char i = 0;for(i = 0; i < 8; i++){HC595_Cascade_8x8LED(Data[i],~(0x80 >> i));	//依次選擇從左到右第1列行開始(行掃描顯示)}
}

②Dot_LED.h文件的代碼如下:

#ifndef __Dot_LED_H
#define __Dot_LED_H
#include <REGX52.H>	//包含51頭文件,里面全是寄存器地址sbit LED_SH = P2^0;
sbit LED_DS = P2^1;	
sbit LED_ST = P2^2;
sbit LED_OE = P2^3;void HC595_Cascade_8x8LED(unsigned char LEDNode, unsigned char LEDCathode);
void Show_8X8Dot_ColumnScan(unsigned char *Data);#endif

③main.c文件的代碼如下:

#include "Dot_LED.h"/* 顯示H */
static unsigned char H_Data[] = {0x00,0x00,0xFF,0x08,0x08,0xFF,0x00,0x00};//縱向,上為最高位(縱向取模)
void main(void)
{		while(1){Show_8X8Dot_ColumnScan(H_Data);	//列掃描顯示}
}

在這里插入圖片描述

3.4、8x8點陣屏幕滾動顯示

從左向右滾動顯示“HELLO”

滾動顯示的原理: 點陣屏幕一直顯示8個字節Buffer中的數據,我們只需要將HELLO的字模數據依次放入到Buffer中。如下圖所示:
在這里插入圖片描述
取模軟件的使用:

在這里插入圖片描述

①Dot_LED.c文件的代碼如下:

#include "Dot_LED.h"
#include "Timer.h"/*** 2片74HC595的級聯* LEDNode:	陽極數據,選擇選定的列中哪幾個LED點亮* LEDCathode: 陰極數據,選擇哪一列點亮*/
void HC595_Cascade_8x8LED(unsigned char LEDNode, unsigned char LEDCathode)
{	unsigned char i = 0;LED_ST = 0;/* 將高位字節的數據移位到第一個595里面 */for(i = 0; i < 8; i++){LED_SH = 0;LED_DS = (LEDNode & (0x80 >> i));//高位先行LED_SH = 1;	//595的SH引腳來一個上升沿將數據進行移位}	/* 將高位字節的數據移位到第二個595里面,低位字節的數據移到第一個595里面 */for(i = 0; i < 8; i++){LED_SH = 0;LED_DS = (LEDCathode & (0x80 >> i));//高位先行LED_SH = 1;	//595的SH引腳來一個上升沿將數據進行移位}	LED_ST = 1;		//595的ST引腳來一個上升沿將移位寄存器的數據移到存儲寄存器LED_OE = 0;		//輸出使能
}/*** 8x8點陣顯示函數(列掃描顯示)*/
void Show_8X8Dot_ColumnScan(unsigned char *Data)
{unsigned char i = 0;for(i = 0; i < 8; i++){HC595_Cascade_8x8LED(0x00,~(0x80 >> i));	//向將掃描的一列的燈全部熄滅HC595_Cascade_8x8LED(Data[i],~(0x80 >> i));	//依次選擇從左到右第1列行開始(行掃描顯示)}
}/*** 8x8點陣數據滾動函數*/
unsigned char LEDBuffer[8] = {0x00,0x00,0xFF,0x08,0x08,0xFF,0x00,0x00};
void LEDData_Move(unsigned char *Data,unsigned char Len)
{static unsigned char j = 0;static unsigned char i = 0;static unsigned char Status = 1;static unsigned char TimeStatus = 1;static unsigned long GET_Time = 0;switch(TimeStatus){case 1:GET_Time = Get_TimeCount();				//獲取TimeCount的值TimeStatus = 2;case 2:if(Get_TimeCount() - GET_Time > 500)	//每隔500ms進行向Buff里面放入數據{GET_Time = Get_TimeCount();for (j = 0; j < 7; j++) 			//先移動{LEDBuffer[j] = LEDBuffer[j+1];}switch(Status){case 1:LEDBuffer[7] = Data[i+8];	//第一輪放入從Data[8]開始取出放入if(i == Len - 8)			{i = Len - 1;Status = 2;}break;case 2:							//第二輪放入從Data[0]開始取出放入LEDBuffer[7] = Data[i];	break;}i = (i + 1) % Len;  				//循環遍歷 i:0~31}break;}
}

②Dot_LED.h文件的代碼如下:

#ifndef __Dot_LED_H
#define __Dot_LED_H
#include <REGX52.H>	//包含51頭文件,里面全是寄存器地址sbit LED_SH = P2^0;
sbit LED_DS = P2^1;	
sbit LED_ST = P2^2;
sbit LED_OE = P2^3;extern unsigned char LEDBuffer[8];void HC595_Cascade_8x8LED(unsigned char LEDNode, unsigned char LEDCathode);
void Show_8X8Dot_ColumnScan(unsigned char *Data);
void LEDData_Move(unsigned char *Data,unsigned char Len);#endif

③main.c文件的代碼如下:

#include "Dot_LED.h"
#include "Timer.h"/* 顯示HELLO */
static unsigned char HELLO_Data[] = {0x00,0x00,0xFF,0x08,0x08,0xFF,0x00,0x00,0xFF,0x89,0x89,0x89,0x00,0x00,0xFF,0x01,0x01,0x01,0x00,0x00,0xFF,0x01,0x01,0x01,0x00,0x00,0x7E,0x81,0x81,0x7E,0x00,0x00	 
};//縱向,上為最高位(縱向取模)void main(void)
{		Time0_Intrrupt_Init();	//啟動定時器中斷while(1){LEDData_Move(HELLO_Data,32);Show_8X8Dot_ColumnScan(LEDBuffer);	//列掃描顯示}
}

QQ2025427-13511

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78685.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78685.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78685.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JAVA后端開發常用的LINUX命令總結

一、Linux常用命令大全&#xff08;2025年最新版&#xff09; 常用 Linux 命令 文件和目錄管理&#xff1a; cd&#xff1a;用于切換當前工作目錄&#xff0c;如cd /home/user。mkdir&#xff1a;創建新目錄&#xff0c;mkdir -p /home/user/mydir可遞歸創建多級目錄。pwd&am…

uniapp-商城-40-shop 購物車 選好了 進行訂單確認4 配送方式3 地址編輯

前面說了配送 和地址頁面 當地址頁面為空或需要添加地址時&#xff0c;需要添加地址。 我的地址頁面有個按鈕 就是添加地址 點擊 添加地址 按鈕 后&#xff0c;就會跳轉到地址添加的頁面 1、添加地址頁面 2、添加地址文件夾以及文件的創建 3、添加地址的代碼 <template…

現場問題排查-postgresql某表索引損壞導致指定數據無法更新影響卷宗材料上傳

問題現象 今天突然被拉進一個群&#xff0c;說某地區友商推送編目結果報錯&#xff0c;在我們自己的卷宗系統上傳材料也一直轉圈&#xff0c;也刪除不了案件卷宗&#xff0c;重置模板也沒用&#xff0c;只有個別案件有問題。雖然這事兒不屬于我負責&#xff0c;但還是抽時間給…

Redis01-基礎-入門

零、文章目錄 Redis01-基礎-入門 1、認識 NoSQL NoSQL 知識請參考&#xff1a;https://blog.csdn.net/liyou123456789/article/details/132612444 2、認識 Redis &#xff08;1&#xff09;簡介 Redis&#xff08;Remote Dictionary Server&#xff0c;遠程字典服務&…

【嘉立創EDA】如何在更新或轉換原理圖到PCB時,保留已有布局器件

文章路標?? :one: 文章解決問題:two: 主題內容:three: 參考方法be end..1?? 文章解決問題 操作環境:嘉立創EDA專業版 V2.2.37 本文使用嘉立創EDA,描述在更新或轉換原理圖到PCB時,保留已有布局器件的方法。本文將此過程記錄,以供有需要的讀者參考。 2?? 主題內容 …

03 APQC PROCESS CLASSIFICATION FRAMEWORK (PCF)

APQC流程分類框架&#xff08;APQC Process Classification Framework, PCF&#xff09;最初由美國生產力與質量中心&#xff08;American Productivity & Quality Center, APQC&#xff09;開發&#xff0c;旨在用于跨組織的流程性能基準比較。現在&#xff0c;它也常被用…

分析型數據庫入門指南:如何選擇適合你的實時分析工具?

一、什么是分析型數據庫&#xff1f;為什么需要它&#xff1f; 據Gartner最新報告顯示&#xff0c;超過75%的企業現已在關鍵業務部門部署了專門的分析型數據庫&#xff0c;這一比例還在持續增長。 隨著數據量呈指數級增長&#xff0c;傳統數據庫已無法滿足復雜分析場景的需求…

body Param Query 三個 不同的入參 分別是什么意思 在前端 要怎么傳 這三種不同的參數

在 NestJS 中&#xff0c;Body()、Param() 和 Query() 用于處理不同類型的請求參數。以下是它們的含義及前端傳遞方式&#xff1a; Body()&#xff1a;請求體參數 ? 含義&#xff1a;用于獲取請求體中的數據&#xff08;如 POST/PUT 請求中提交的 JSON、表單數據等&#xff09…

神經網絡(自己記錄)

一、神經網絡基礎 5分鐘-通俗易懂 - 神經網絡 反向傳播算法&#xff08;手算&#xff09;_嗶哩嗶哩_bilibili 二、GAT

Redis Slot 槽位分片具體案例

?鍵值槽位分配案例? 當執行 SET {kaigejava}k1 v1 時&#xff0c;Redis 會提取 {} 內的有效部分 kaigejava&#xff0c;通過 CRC16 算法計算哈希值&#xff0c;再對 16384 取余得到槽位。例如&#xff1a; 若計算結果為 1495&#xff0c;則該鍵會被分配到槽位 1495 對應的節…

【多模態模型】跨模態智能的核心技術與應用實踐

目錄 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比 二、實戰演示環境配置要求核心代碼實現&#xff08;CLIP圖像-文本檢索&#xff09;運行結果驗證 三、性能對比測試方法論量化數據對比結果…

final static 中是什么final static聯合使用呢

final static 聯合使用詳解 final 和 static 在 Java 中經常一起使用&#xff0c;主要用來定義類級別的常量。這種組合具有兩者的特性&#xff1a; 基本用法 public class Constants {// 典型的 final static 常量定義public static final double PI 3.141592653589793;pub…

1.1 道路結構特征

1.1 道路結構特征 1.城市道路分類 道路網的地位、交通功能、沿線的服務功能。快速路 15 30主干路 15 30次干路 15 20支路 10 20 10(20)瀝青路面、水泥混凝土路面、砌塊路面瀝青路面:瀝青混凝土、瀝青貫入式、瀝青表面處治。瀝青混凝土各種等級、瀝青貫入式和瀝青表面處治支路…

C++如何使用調試器(如GDB、LLDB)進行程序調試保姆級教程(2萬字長文)

C++作為一門高性能、接近底層的編程語言,其復雜性和靈活性為開發者提供了強大的能力,同時也帶來了更高的調試難度。與一些高級語言不同,C++程序往往直接操作內存,涉及指針、引用、多線程等特性,這些都可能成為錯誤的溫床。例如,一個未初始化的指針可能導致程序崩潰,而一…

vite+vue構建的網站項目localhost:5173打不開

原因&#xff1a;關掉了cmd命令提示符&#xff0c;那個端口就沒有被配置上&#xff0c;打開就是這樣的。 解決方法&#xff1a;重新在工作目錄下打開cmd&#xff0c;輸入npm run dev重新啟動項目。 重新出現這樣的界面說明已經成功啟動項目&#xff0c;再次在瀏覽器中刷新并輸入…

自主可控鴻道Intewell工業實時操作系統

鴻道Intewell工業實時操作系統是東土科技旗下科東軟件自主研發的新一代智能工業操作系統&#xff0c;以下是相關介紹&#xff1a; 系統架構 -Intewell-C全實時構型&#xff1a;設備上只運行自研RTOS的全實時系統&#xff0c;適用于有功能安全認證需求的實時控制場景&#xf…

將大語言模型(LLM)應用于自動駕駛(ADAS)中的幾個方向,及相關論文示例

主要方法集中在如何利用LLM的強大推理能力和語言理解能力來增強自動駕駛系統的感知、決策和規劃能力。以下是幾種典型的方法和思路&#xff1a; 1. 基于LLM的駕駛決策與規劃 方法&#xff1a;將LLM作為駕駛決策的核心模塊&#xff0c;利用其強大的推理能力生成駕駛行為或軌跡…

rt-linux下的D狀態的堆棧抓取及TASK_RTLOCK_WAIT狀態

一、背景 在之前的博客 缺頁異常導致的iowait打印出相關文件的絕對路徑-CSDN博客 里的 2.1 一節里的代碼&#xff0c;我們已經有了一個比較強大的抓取D狀態和等IO狀態超過閾值的waker和wakee的堆棧狀態的內核模塊。在之前的博客 增加等IO狀態的喚醒堆棧打印及缺頁異常導致iowa…

【Redis】zset類型

目錄 1、介紹2、底層實現【1】壓縮列表【2】跳躍表哈希表 3、常用命令 1、介紹 有序集合結合了集合和有序列表的特性&#xff0c;每個元素都會關聯一個分數&#xff0c;Redis正是通過這個分數來為集合中的成員進行排序。 2、底層實現 【1】壓縮列表 適用條件 1、元素數量 ≤…

ZeroGrasp:零樣本形狀重建助力機器人抓取

25年4月來自CMU、TRI 和 豐田子公司 Woven 的論文“ZeroGrasp: Zero-Shot Shape Reconstruction Enabled Robotic Grasping”。 機器人抓取是具身系統的核心能力。許多方法直接基于部分信息輸出抓取結果&#xff0c;而沒有對場景的幾何形狀進行建模&#xff0c;導致運動效果不…