51單片機嵌入式開發:9、 STC89C52RC 操作LCD1602技巧

STC89C52RC 操作LCD1602技巧

  • 1 代碼工程
  • 2 LCD1602使用
    • 2.1 LCD1602字庫
    • 2.2 巧妙使用sprintf
    • 2.3 光標顯示
    • 2.4 寫固定長度的字符
    • 2.5 所以引入固定長度寫入方式:
  • 3 LCD1602操作總結


在這里插入圖片描述

1 代碼工程

承接上文,在原有工程基礎上,新建關于lcd1602的c和h文件,并在includes.h中引用,并添加頭文件:

#include<intrins.h> //匯編指令
#include<stdio.h> 	//標準輸入輸出

整體工程如下:

在這里插入圖片描述

各個文件代碼如下:

//main.c文件

#include "includes.h"/******************************************************************/
/*                    微秒延時函數                                */
/******************************************************************/
void delay_us(unsigned int us)//delay us
{while(us--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
}/******************************************************************/
/*                    微秒延時函數                                */
/******************************************************************/
void delay_ms(unsigned int Ms)//delay us
{while(--Ms){delay_us(1000);}
}/*------------------------------------------------延時子程序
------------------------------------------------*/
void delay(unsigned int cnt) 
{while(--cnt);
}/*------------------------------------------------主函數
------------------------------------------------*/
void main (void)
{EA=0;//初始化定時器0sys_timer0_init();//初始化定時器1sys_timer1_init();//初始化定時器2sys_timer2_init();sys_wdog_init();//外部中斷初始化sys_exit_init();LCD_init();//8個指示燈的操作sys_led();sys_led_test();sys_led_test1();sys_ledtube_on1();sys_ledtube_on2();//主循環中添加其他需要一直工作的程序sys_keynum_ledon(sys_key_single());sys_keynum_ledon(sys_key_board());EA=1;P1=0x55;       //P1口初始值,預設指示燈狀態,測試引腳sys_lcd1602_test1();sys_lcd1602_test2();sys_lcd1602_test3();while (1){clr_wdg();}
}

//c51_gpio.c文件

#include "includes.h"void sys_led(void)
{P1 = 0xFF;		//P1口全部為高電平,對應的LED燈全滅掉,ff換算成二進制是 1111 1111P1 = 0x00;		//P1口全部為低電平,對應的LED燈全亮起,ff換算成二進制是 0000 0000}/********************************************************
函數名稱:sys_led_test
函數功能:IO口高低電平測試
入口參數:
出口參數:
修    改:
內    容:
********************************************************/
void sys_led_test(void)
{	bit tmp = 0;//中間變量用于獲取io口狀態//控制4個引腳輸出P10 = 1;P11 = 0;P12 = 0;P13 = 1;//用另外四個IO口獲取狀態并測試(指示燈顯示)tmp = P10;P14 = tmp;tmp = P11;P15 = tmp;tmp = P12;P16 = tmp;tmp = P13;P17 = tmp;}/********************************************************
函數名稱:sys_led_test
函數功能:led流水燈
入口參數:
出口參數:
修    改:
內    容:
********************************************************/
void sys_led_test1(void)
{
//	delay(30000);//延時程序P1<<=1;      //左移一位 該語句等效于 P1=P1<<1P1|=0x01;    //最后一位補1,該語句等效于 P1=P1|0x01 符號"|"表示"或"if(P1==0xFF) //檢測是否移到最左端?"=="表示檢測符號2端的值是否相等{ 
//		delay(30000);P1=0xfe; //重新賦值}
}

//c51_ledtube.c文件

#include "includes.h"// 顯示段碼值01234567,可對應原理圖查看顯示不同圖形對應的引腳高點電平配置狀態
unsigned char const EL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,\0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F/********************************************************
函數名稱:sys_ledtube_on1
函數功能:點亮一個數碼管全為亮起來
入口參數:
出口參數:
修    改:
內    容:
********************************************************/
void sys_ledtube_on1(void)
{//根據原理圖,將P0口全部輸出高電平,P2選擇0號數碼管P0=0xFF;//取顯示數據,段碼P2=0;  	//取位碼
}/********************************************************
函數名稱:sys_ledtube_on2
函數功能:顯示一組數據
入口參數:
出口參數:
修    改:
內    容:
********************************************************/
static unsigned char ledtube_cnt = 0;
void sys_ledtube_on2(void)
{ledtube_cnt++;if(ledtube_cnt>7){ledtube_cnt = 0;}P0 = 0x00;				//防止切換數碼管瞬間有虛影出現P2 = 0x00;P0 = EL[ledtube_cnt];	//取顯示數據,段碼P2 = ledtube_cnt;  		//取位碼//根據人眼適應虛影緩沖時間為50ms左右//我們調整delay在500以下可以看到明顯的看起來是一串數據一起顯示delay(100); 			
}/********************************************************
函數名稱:sys_keynum_ledon
函數功能:顯示按鍵數值
入口參數:按鍵數值
出口參數:
修    改:
內    容:
********************************************************/
void sys_keynum_ledon(unsigned char num)
{//根據原理圖,將P0口全部輸出高電平,P2選擇0號數碼管P0=EL[num];//取顯示數據,段碼P2=0;  	//取位碼
}

//c51_key.c文件

#include "includes.h"bit key1=0;   //定義按鍵位置
bit key2=0;
bit key3=0;
bit key4=0;/********************************************************
函數名稱:sys_key_single
函數功能:按鍵檢測,帶有消抖策略
入口參數:
出口參數:按鍵數值
修    改:
內    容:
********************************************************/
static unsigned char key1_history = 0;//緩存上一次按鍵的結果
unsigned char sys_key_single(void)
{key1=P30;   //定義按鍵位置key2=P31;key3=P32;key4=P33;if(!key1)  //按下相應的按鍵,數碼管顯示相應的碼值{delay(1000);if(!key1){key1_history = 1;return 1;}else{return key1_history;}}else if(!key2){delay(1000);if(!key2){key1_history = 2;return 2;}else{return key1_history;}}else if(!key3){delay(1000);if(!key3){key1_history = 3;return 3;}else{return key1_history;}}else if(!key4){delay(1000);if(!key4){key1_history = 4;return 4;}else{return key1_history;}}else{return key1_history;}}unsigned char sys_key_board(void)
{unsigned char key = 0x00;unsigned char num = 0x00;key=keyscan();  //調用鍵盤掃描if(key == 0xFF){num = key1_history;}else{switch(key){case 0xee:num = 0x0;break;//0按下相應的鍵顯示相對應的碼值case 0xde:num = 0x1;break;//1 按下相應的鍵顯示相對應的碼值 case 0xbe:num = 0x2;break;//2case 0x7e:num = 0x3;break;//3case 0xed:num = 0x4;break;//4case 0xdd:num = 0x5;break;//5case 0xbd:num = 0x6;break;//6case 0x7d:num = 0x7;break;//7case 0xeb:num = 0x8;break;//8case 0xdb:num = 0x9;break;//9case 0xbb:num = 0xA;break;//acase 0x7b:num = 0xB;break;//bcase 0xe7:num = 0xC;break;//ccase 0xd7:num = 0xD;break;//dcase 0xb7:num = 0xE;break;//ecase 0x77:num = 0xF;break;//fdefault:num = key1_history; break;}key1_history = num;}return num;
}/*------------------------------------------------鍵盤掃描程序
------------------------------------------------*/
unsigned char keyscan(void)  //鍵盤掃描函數,使用行列反轉掃描法
{unsigned char cord_h,cord_l;//行列值中間變量P3=0x0f;            //行線輸出全為0cord_h=P3&0x0f;     //讀入列線值if(cord_h!=0x0f)    //先檢測有無按鍵按下{delay(100);        //去抖if(cord_h!=0x0f){cord_h=P3&0x0f;  //讀入列線值P3=cord_h|0xf0;  //輸出當前列線值cord_l=P3&0xf0;  //讀入行線值return(cord_h+cord_l);//鍵盤最后組合碼值}}return(0xff);     //返回該值
}

//c51_timer.c文件

#include "includes.h"/*------------------------------------------------定時器初始化子程序
------------------------------------------------*/
void sys_timer0_init(void)
{TMOD |= 0x01;	  //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響		     TH0=0x00;	      //給定初值,這里使用定時器最大值從0開始計數一直到65535溢出TL0=0x00;//EA=1;            //總中斷打開 等最后一個中斷打開//ET0=1;           //定時器中斷打開TR0=1;           //定時器開關打開
}/*------------------------------------------------定時器初始化子程序
------------------------------------------------*/
void sys_timer1_init(void)
{TMOD |= 0x20;	  //使用模式2,	     TH1=0x05;	      //給定初值,這里使用定時器最大值從5開始計數一直到255溢出TL1=0x00;//EA=1;            //總中斷打開//ET1=1;           //定時器中斷打開TR1=1;           //定時器開關打開
}/*------------------------------------------------定時器初始化子程序
------------------------------------------------*/
void sys_timer2_init(void)
{RCAP2H = 0/256;//RCAP2L = 0/256;//ET2=1;                     //打開定時器中斷//EA=1;                      //打開總中斷TR2=1;                     //打開定時器開關
}void sys_wdog_init(void)
{ //WDT_CONTR = 0x35;
}void clr_wdg(void)
{//WDT_CONTR = 0x35;
}/*------------------------------------------------定時器中斷子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{TH0=0x00;		  //重新賦值TL0=0x00;//sys_led_test1(); //流水燈操作
}/*------------------------------------------------定時器中斷子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{//sys_led_test1(); //流水燈操作}	/*------------------------------------------------定時器中斷子程序
------------------------------------------------*/
void Timer2_isr(void) interrupt 5//定時器2中斷
{TF2=0;//sys_led_test1(); //流水燈操作
}

//c51_exit.c文件

#include "includes.h"void sys_exit_init(void)
{EX0=1;         //外部中斷0開//IT0=0;         //電平觸發IT0=1;         //邊沿觸發EX1=1;         //外部中斷1開//IT1=0;         //電平觸發IT1=1;         //邊沿觸發,IT1=0表示電平觸發
}/*------------------------------------------------外部中斷程序
------------------------------------------------*/
void Exit0_isr(void) interrupt 0
{//在此處可以添加去抖動程序,防止按鍵抖動造成錯誤//P1=~P1;         
}/*------------------------------------------------外部中斷程序
------------------------------------------------*/
void Exit1_isr(void) interrupt 2
{//在此處可以添加去抖動程序,防止按鍵抖動造成錯誤//P1=~P1;
}

//c51_lcd1602.c文件

#include "includes.h"#include <string.h>/******************************************************************/
/*                   寫入命令函數                                 */
/******************************************************************/
void LCD_write_com(unsigned char com) 
{  RS_CLR; RW_CLR; EN_SET; P0 = com; delay_us(5); EN_CLR;
}/******************************************************************/
/*                   寫入數據函數                                 */
/******************************************************************/
void LCD_write_Data(unsigned char Data) 
{ RS_SET; RW_CLR; EN_SET; P0 = Data; delay_us(5); EN_CLR;
}
/******************************************************************/
/*                   清屏函數                                     */
/******************************************************************/
void LCD_clear(void) 
{ LCD_write_com(0x01); delay_ms(5);
}/******************************************************************/
/*                   初始化函數                                   */
/******************************************************************/
void LCD_init(void) 
{LCD_write_com(0x38);    /*顯示模式設置*/ delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38); delay_ms(5); LCD_write_com(0x38);  LCD_write_com(0x08);    /*顯示關閉*/ LCD_write_com(0x01);    /*顯示清屏*/ LCD_write_com(0x06);    /*顯示光標移動設置*/ delay_ms(5); LCD_write_com(0x0C);    /*顯示開及光標設置*/
}/******************************************************************/
/*                   寫入字符串函數                                */
/*      X:第幾列 Y:第幾行  *s字符串為空時跳出                      */
/******************************************************************/
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) 
{     if (y == 0) {     LCD_write_com(0x80 + x);     }else {     LCD_write_com(0xC0 + x);     }        while (*s) {     LCD_write_Data( *s);     s ++;     }
}/******************************************************************/
/*                   寫入字符串函數                                */
/*      X:第幾列 Y:第幾行  *s字符串為空時跳出                      */
/******************************************************************/
void LCD_write_strl(unsigned char x,unsigned char y,unsigned char *s,unsigned length) 
{     unsigned char cnt = 0;if (y == 0) {     LCD_write_com(0x80 + x);     }else {     LCD_write_com(0xC0 + x);     }while(length--){     LCD_write_Data( *s);     s ++;cnt++;}while(cnt<5){LCD_write_Data(' ');cnt++;}
}/******************************************************************/
/*                   寫入字節函數                                  */
/*      X:第幾列 Y:第幾行  Data字符                               */
/******************************************************************/
void LCD_write_char(unsigned char x,unsigned char y,unsigned char Data) 
{     if (y == 0) {     LCD_write_com(0x80 + x);     }    else {     LCD_write_com(0xC0 + x);     }        LCD_write_Data( Data);  
}void sys_lcd1602_test1(void)
{LCD_clear();LCD_write_char(1,0,'E');LCD_write_str(2,0,"mail:");LCD_write_str(1,1,"xxxshow@163.com");}void sys_lcd1602_test2(void)
{char Test2[16]="";int i=8;float j=3.5;delay_ms(100);//LCD_clear();sprintf(Test2,"N:%d,float:%.2f ",i,j);LCD_write_str(1,1,Test2);delay_ms(100);j = 3.61;sprintf(Test2,"%.2f",j);LCD_write_str(12,1,Test2);}void sys_lcd1602_test3(void)
{unsigned char Test2[5]="";LCD_clear();sprintf(Test2,"A:");LCD_write_str(0,0,Test2);sprintf(Test2,"B:");LCD_write_str(8,0,Test2);sprintf(Test2,"C:");LCD_write_str(0,1,Test2);sprintf(Test2,"D:");LCD_write_str(8,1,Test2);delay_ms(100);sprintf(Test2,"12345");LCD_write_strl(2,0,Test2,strlen(Test2));sprintf(Test2,"54321");LCD_write_strl(10,0,Test2,strlen(Test2));sprintf(Test2,"QWERT");LCD_write_strl(2,1,Test2,strlen(Test2));sprintf(Test2,"TREWQ");LCD_write_strl(10,1,Test2,strlen(Test2));delay_ms(100);sprintf(Test2,"111");LCD_write_strl(2,0,Test2,strlen(Test2));sprintf(Test2,"55");LCD_write_strl(10,0,Test2,strlen(Test2));sprintf(Test2,"QW");LCD_write_strl(2,1,Test2,strlen(Test2));sprintf(Test2,"T");LCD_write_strl(10,1,Test2,strlen(Test2));delay_ms(100);
}

//includes.h文件

#ifndef __INCLUDES_H__
#define __INCLUDES_H__//#include<reg52.h> #include<intrins.h> //匯編指令
#include<stdio.h> 	//標準輸入輸出//包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include "STC89C5xRC_RDP.h"//應用層頭文件
#include "c51_gpio.h"
#include "c51_ledtube.h"
#include "c51_key.h"
#include "c51_timer.h"
#include "c51_exit.h"
#include "c51_lcd1602.h"extern void delay(unsigned int cnt);
extern void delay_us(unsigned int us);//delay us;
extern void delay_ms(unsigned int Ms);//delay Ms;#endif

//c51_ledtube.h文件

#ifndef __C51_LEDTUBE_H__
#define __C51_LEDTUBE_H__extern unsigned char const EL[];extern void sys_ledtube_on1(void);
extern void sys_ledtube_on2(void);extern void sys_keynum_ledon(unsigned char num);#endif

//c51_gpio.h文件

#ifndef __C51_GPIO_H__
#define __C51_GPIO_H__extern void sys_led(void);
extern void sys_led_test(void);
extern void sys_led_test1(void);#endif

//c51_key.h文件

#ifndef __C51_KEY_H__
#define __C51_KEY_H__extern bit key1;   //定義按鍵位置
extern bit key2;
extern bit key3;
extern bit key4;extern unsigned char sys_key_single(void);extern unsigned char sys_key_board(void);
extern unsigned char keyscan(void);  //鍵盤掃描函數,使用行列反轉掃描法#endif

//c51_timer.h文件

#ifndef __C51_TIMER_H__
#define __C51_TIMER_H__extern void sys_timer0_init(void);
extern void Timer0_isr(void);
extern void sys_timer1_init(void);
extern void Timer1_isr(void);
extern void sys_timer2_init(void);
extern void Timer2_isr(void);extern void sys_wdog_init(void);
extern void clr_wdg(void);#endif

//c51_exit.h文件

#ifndef __C51_EXIT_H__
#define __C51_EXIT_H__extern void sys_exit_init(void);
extern void Exit0_isr(void);
extern void Exit1_isr(void);#endif

//c51_lcd1602.h文件

#ifndef __C51_LCD1602_H__
#define __C51_LCD1602_H__#include "STC89C5xRC_RDP.h"//定義宏定義sbit RS = P2^4;   //定義端口 
sbit RW = P2^5;
sbit EN = P2^6;#define RS_CLR RS=0 
#define RS_SET RS=1
#define RW_CLR RW=0 
#define RW_SET RW=1 
#define EN_CLR EN=0
#define EN_SET EN=1extern void LCD_write_com(unsigned char com) ;
extern void LCD_write_Data(unsigned char Data) ;
extern void LCD_clear(void) ;
extern void LCD_init(void) ;
extern void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) ;
extern void LCD_write_strl(unsigned char x,unsigned char y,unsigned char *s,unsigned length) ;extern void LCD_write_char(unsigned char x,unsigned char y,unsigned char Data) ;
extern void sys_lcd1602_test1(void);
extern void sys_lcd1602_test2(void);
extern void sys_lcd1602_test3(void);#endif

2 LCD1602使用

2.1 LCD1602字庫

表所示是字符庫的內容、字符碼和字形的對應關系。例如“A”的字符碼 為 41(HEX),“B”的字符碼這 42(HEX)。列項是高四位,橫向是低四位。根據表中可知,前125個字符為ASCII碼表中的字符。剩余的其他字符我們不經常使用。
在使用125個ASCII碼時,直接寫入字符即可。

在這里插入圖片描述

2.2 巧妙使用sprintf

sprintf 是一個格式化字符串的函數,它可以將格式化的數據輸出到一個字符串中。它的用法類似于其他編程語言中的 printf 函數。
以下是 sprintf 的基本用法:
c
復制

int sprintf(char *str, const char *format, ...);

? str 是一個字符數組(字符串),用于接收格式化后的輸出結果。
? format 是一個格式化字符串,用于指定輸出的格式。
? … 是可變參數,用于提供要格式化的數據。根據 format 中的格式說明符,將可變參數的值格式化并插入到輸出字符串中。
下面是一個簡單的示例,演示了 sprintf 的用法:
c
復制

#include <stdio.h>int main() {char str[100];int num = 10;float f = 3.14;sprintf(str, "Number: %d, Float: %.2f", num, f);printf("Formatted string: %s\n", str);return 0;
}

輸出結果:
復制

Formatted string: Number: 10, Float: 3.14

在上面的示例中,我們將整數 num 和浮點數 f 格式化并插入到字符串 str 中,使用 %d 和 %.2f 分別表示整數和帶兩位小數的浮點數。
sprintf 還支持其他格式說明符,例如 %s 表示字符串,%c 表示字符, %x 表示十六進制數等。你可以根據需要使用適當的格式說明符進行格式化。請注意,在使用 sprintf 時要確保目標字符串 str 能夠容納足夠的空間,以避免溢出。

2.3 光標顯示

在使用光標閃爍顯示時,我們將

	LCD_write_com(0x0C);    /*顯示開及光標設置*/
改為LCD_write_com(0x0);    /*顯示開及光標設置*/

注意事項,不能寫滿16個字符,因為,LCD1602最寬是16個字符,光標配置成自動加1的方式,無法在屏幕上顯示出來光標,但是一般也不用光標進行顯示;

2.4 寫固定長度的字符

因為,LCD1602寫入相同的位置可以覆蓋歷史,但是如果上一次數據與本次數據占用屏幕上的位置不同,就會導致上一次的顯示無法覆蓋,結果就會顯示混亂的情況。

第一次顯示:

void sys_lcd1602_test1(void)
{LCD_clear();LCD_write_char(1,0,'E');LCD_write_str(2,0,"mail:");LCD_write_str(1,1,"xxxshow@163.com");}

第二次顯示:

void sys_lcd1602_test2(void)
{char Test2[16]="";int i=8;float j=3.5;delay_ms(100);//LCD_clear();sprintf(Test2,"N:%d,%.2f",i,j);LCD_write_str(1,1,Test2);
}

顯示結果

在這里插入圖片描述

2.5 所以引入固定長度寫入方式:

(1)注意代碼陷阱:

/******************************************************************/
/*                   寫入字符串函數                                */
/*      X:第幾列 Y:第幾行  *s字符串為空時跳出                      */
/******************************************************************/
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) 
{     if (y == 0) {     LCD_write_com(0x80 + x);     }else {     LCD_write_com(0xC0 + x);     }        while (*s) //注意:會打印出來最后一個空字符,導致后邊的數據有問題分塊的時候,注意此處。{     LCD_write_Data( *s);     s ++;     }
}

(2)固定長度寫入方式代碼:

/******************************************************************/
/*                   寫入字符串函數                                */
/*      X:第幾列 Y:第幾行  *s字符串為空時跳出                      */
/******************************************************************/
void LCD_write_strl(unsigned char x,unsigned char y,unsigned char *s,unsigned length) 
{     unsigned char cnt = 0;if (y == 0) {     LCD_write_com(0x80 + x);     }else {     LCD_write_com(0xC0 + x);     }while(length--){     LCD_write_Data( *s);     s ++;cnt++;}while(cnt<5){LCD_write_Data(' ');cnt++;}
}

使用情況:

void sys_lcd1602_test3(void)
{unsigned char Test2[5]="";LCD_clear();sprintf(Test2,"A:");LCD_write_str(0,0,Test2);sprintf(Test2,"B:");LCD_write_str(8,0,Test2);sprintf(Test2,"C:");LCD_write_str(0,1,Test2);sprintf(Test2,"D:");LCD_write_str(8,1,Test2);delay_ms(100);sprintf(Test2,"12345");LCD_write_strl(2,0,Test2,strlen(Test2));sprintf(Test2,"54321");LCD_write_strl(10,0,Test2,strlen(Test2));sprintf(Test2,"QWERT");LCD_write_strl(2,1,Test2,strlen(Test2));sprintf(Test2,"TREWQ");LCD_write_strl(10,1,Test2,strlen(Test2));delay_ms(100);sprintf(Test2,"111");LCD_write_strl(2,0,Test2,strlen(Test2));sprintf(Test2,"55");LCD_write_strl(10,0,Test2,strlen(Test2));sprintf(Test2,"QW");LCD_write_strl(2,1,Test2,strlen(Test2));sprintf(Test2,"T");LCD_write_strl(10,1,Test2,strlen(Test2));delay_ms(100);
}

最終顯示結果如下,空白處不會被覆蓋。

在這里插入圖片描述

3 LCD1602操作總結

這些是 LCD1602 操作的一些常見技巧。具體的操作步驟和函數會因你使用的具體驅動程序、編程語言和平臺而有所不同。因此,在使用 LCD1602 時,請參考相關文檔或教程,了解你所使用的具體庫和函數的使用方法。

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

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

相關文章

linux中如何設置多個redis進程并且設置獨立密碼?

在Linux中設置多個Redis進程&#xff08;實例&#xff09;并為每個實例設置獨立密碼&#xff0c;你需要為每個Redis實例配置不同的配置文件&#xff0c;并在這些配置文件中指定不同的端口、數據目錄、密碼等。Redis本身并不直接支持在配置文件中設置“密碼”來阻止未授權訪問&a…

ArduPilot開源飛控之AP_Mount_Backend_Serial

ArduPilot開源飛控之AP_Mount_Backend_Serial 1. 源由2. 框架設計2.1 類定義2.2 構造函數2.3 init 方法2.4 受保護成員 3. 重要方法4. 總結5. 參考資料 1. 源由 AP_Mount_Backend_Serial是AP_Mount_Backend基于串口的通信的一個擴展模版。 2. 框架設計 繼承自 AP_Mount_Back…

Sentieon應用教程:本地使用-Quick_start

1、準備工作&#xff1a; License下載鏈接&#xff1a;http://www.sentieon.com/eula/b703e839c8c7c5b8fa73238277fd5da23a0276be54712edb46ee8f4d4f3d873fbf 軟件下載地址&#xff1a; https://insvast-download.oss-cn-shanghai.aliyuncs.com/Sentieon/release/sentieon-gen…

11-《風信子》

風信子 風信子&#xff08;學名&#xff1a;Hyacinthus orientalis L.&#xff09;&#xff1a;是多年草本球根類植物&#xff0c;鱗莖卵形&#xff0c;有膜質外皮&#xff0c;皮膜顏色與花色成正相關&#xff0c;未開花時形如大蒜&#xff0c;原產地中海沿岸及小亞細亞一帶&am…

【Vue】vue-element-admin組件化功能

1. 組件的封裝 在vue-element-admin中&#xff0c;每個功能區域或UI元素都被封裝成一個或多個Vue組件。這些組件可以是簡單的按鈕、輸入框&#xff0c;也可以是復雜的表格、表單或頁面布局。每個組件都包含了其模板&#xff08;HTML結構&#xff09;、邏輯&#xff08;JavaScr…

【論文精讀】Exploring the Causality of End-to-End Autonomous Driving

背景信息 團隊&#xff1a;百度 代碼&#xff1a;https://github.com/bdvisl/DriveInsight 論文思想簡述&#xff1a;這篇論文并不是提出SOTA模型&#xff0c;而是提出了一些評估模型的方法。 目前已有的分析方法 大語言模型。VAQ來提供解釋性&#xff0c;比如DriveVLM&…

C++基礎(二)

目錄 1.類和對象 1.1類的定義 1.2訪問限定符 1.3類域 2.實例化 2.1實例化概念 2.2對象大小 3.this指針 4.類的默認成員函數 4.1構造函數 4.2析構函數 4.5運算符重載 1.類和對象 1.1類的定義 類的定義格式 class為定義類的關鍵字&#xff0c;Stack為類的名字&…

7月11日學習打卡,數據結構棧

大家好呀&#xff0c;本博客目的在于記錄暑假學習打卡&#xff0c;后續會整理成一個專欄&#xff0c;主要打算在暑假學習完數據結構&#xff0c;因此會發一些相關的數據結構實現的博客和一些刷的題&#xff0c;個人學習使用&#xff0c;也希望大家多多支持&#xff0c;有不足之…

dataX入門

下載dataX https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz 然后 下載后解壓至本地某個目錄&#xff0c;進入bin目錄&#xff0c;即可運行同步作業&#xff1a; $ cd {YOUR_DATAX_HOME}/bin $ python datax.py {YOUR_JOB.json} 要求你有python…

vue-grid-layout詳解

vue-grid-layout 教程 vue-grid-layout 是一個用于 Vue.js 的響應式拖放網格布局組件&#xff0c;允許開發者創建可調整大小、可拖放的布局&#xff0c;廣泛用于儀表板、管理面板等復雜布局需求。本教程將介紹如何安裝、配置和使用 vue-grid-layout。 目錄 安裝基本使用 布局…

怎樣在 C 語言中進行類型轉換?

&#x1f345;關注博主&#x1f397;? 帶你暢游技術世界&#xff0c;不錯過每一次成長機會&#xff01; &#x1f4d9;C 語言百萬年薪修煉課程 通俗易懂&#xff0c;深入淺出&#xff0c;匠心打磨&#xff0c;死磕細節&#xff0c;6年迭代&#xff0c;看過的人都說好。 文章目…

暑假自律日記九

7.10 &#xff08;半小時日記打卡之——暑假第九天&#xff09; 前言&#xff1a;或許是累了&#xff0c;今天的效率和進度可以說是歷史最低了&#xff0c;調休了一天&#xff0c;算是歇會 日程 八點二十起床&#xff0c;在床上賴了一會 九點二十抵達逸夫樓&#xff0c;開始補…

kafka發送消息流程

配置props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, RoundRobinPartitioner.class); public Map<String,Object> producerConfigs(){Map<String,Object> props new HashMap<>();props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,bootstrapServers…

Spring Boot中的安全配置與實現

Spring Boot中的安全配置與實現 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將深入探討Spring Boot中的安全配置與實現&#xff0c;看看如何保護你的…

在表格中把tab換成enter鍵------ivx

為了方便用戶輸入&#xff0c;把tab鍵替換成enter回車 方法如下&#xff1a; 添加一個fx函數 document.addEventListener(‘keydown’, function(event) { if (event.key ‘Enter’ && !event.shiftKey) { event.preventDefault(); var focusableElements document.q…

昇思25天打卡營-mindspore-ML- Day22-應用實踐-自然語言處理-LSTM+CRF序列標注

昇思25天打卡營-mindspore-ML- Day22-應用實踐-自然語言處理-LSTMCRF序列標注 今天學習了 LSTMCRF 序列標注方法&#xff0c;它是一種結合了循環神經網絡&#xff08;RNN&#xff09;和條件隨機場&#xff08;CRF&#xff09;的強大模型&#xff0c;用于處理序列標注問題&#…

【C++BFS】690. 員工的重要性

本文涉及知識點 CBFS算法 LeetCode690. 員工的重要性 你有一個保存員工信息的數據結構&#xff0c;它包含了員工唯一的 id &#xff0c;重要度和直系下屬的 id 。 給定一個員工數組 employees&#xff0c;其中&#xff1a; employees[i].id 是第 i 個員工的 ID。 employees[…

RabbitMQ 高級功能

RabbitMQ 是一個廣泛使用的開源消息代理&#xff0c;它支持多種消息傳遞協議&#xff0c;可以在分布式系統中用于可靠的消息傳遞。除了基本的消息隊列功能外&#xff0c;RabbitMQ 還提供了一些高級功能&#xff0c;增強了其在高可用性、擴展性和靈活性方面的能力。以下是一些主…

軟件架構之嵌入式系統設計(2)

軟件架構之嵌入式系統設計&#xff08;2&#xff09; 12.4 嵌入式網絡系統12.4.1 現場總線網12.4.2 家庭信息網11.4.3 無線數據通信網12.4.4 嵌入式 Internet 12.5 嵌入式數據庫管理系統12.5.1 使用環境的特點12.5.2 系統組成與關鍵技術 12.6 實時系統與嵌入式操作系統12.6.1 嵌…

MyBatis(38)MyBatis 如何與 Spring Boot 集成,有哪些實踐技巧

集成MyBatis與Spring Boot可以極大地提升開發效率&#xff0c;簡化配置&#xff0c;并利用Spring Boot的自動配置特性優化項目結構和性能。下面我們將詳細探討如何實現這一集成&#xff0c;并分享一些實踐技巧。 1. 添加依賴 首先&#xff0c;在pom.xml中添加MyBatis和Spring…