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.rhkb.cn/news/377156.html

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

相关文章

k8s NetworkPolicy

Namespace 隔离 默认情况下&#xff0c;所有 Pod 之间是全通的。每个 Namespace 可以配置独立的网络策略&#xff0c;来 隔离 Pod 之间的流量。 v1.7 版本通过创建匹配所有 Pod 的 Network Policy 来作为默认的网络策略 默认拒绝所有 Pod 之间 Ingress 通信 apiVersion: …

【线程安全】关于死锁问题

文章目录 死锁的基本概念死锁的四个必要条件避免死锁避免死锁的算法死锁检测算法 死锁的基本概念 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。当然&#xff0c;线程之间同样也有死…

OpenCV中使用Canny算法在图像中查找边缘

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 算法描述 Canny算法是一种广泛应用于计算机视觉和图像处理领域中的边缘检测算法。它由John F. Canny在1986年提出&#xff0c;旨在寻找给定噪声条件下的最佳边…

部署大语言模型并对话

随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;因其强大的语言理解和生成能力而备受关注。OpenWebUI &#xff0c;原名 Ollama WebUI &#xff0c;是一款专为大语言模型&#xff08;LLM&#xff09;设计的先进 Web 交互…

Facebook的未来蓝图:从元宇宙到虚拟现实的跨越

随着科技的不断演进和社会的数字化转型&#xff0c;虚拟现实&#xff08;VR&#xff09;和增强现实&#xff08;AR&#xff09;作为下一代计算平台正逐渐走进人们的视野。作为全球领先的科技公司之一&#xff0c;Facebook正在积极探索并推动这一领域的发展&#xff0c;以实现其…

【Superset】dashboard 自定义URL

URL设置 在发布仪表盘&#xff08;dashboard&#xff09;后&#xff0c;可以通过修改看板属性中的SLUG等&#xff0c;生成url 举例&#xff1a; http://localhost:8090/superset/dashboard/test/ 参数设置 以下 URL 参数可用于修改仪表板的呈现方式&#xff1a;此处参考了官…

论文翻译 | LEAST-TO-MOST: 从最少到最多的提示使大型语言模型中的复杂推理成为可能

摘要 思维链提示&#xff08;Chain-of-thought prompting&#xff09;在多种自然语言推理任务上展现了卓越的性能。然而&#xff0c;在需要解决的问题比提示中展示的示例更难的任务上&#xff0c;它的表现往往不佳。为了克服从简单到困难的泛化挑战&#xff0c;我们提出了一种新…

请你谈谈:BeanDefinition类作为Spring Bean的建模对象,与BeanFactoryPostProcessor之间的羁绊

那么&#xff0c;我们如何理解Spring Bean的建模对象呢&#xff1f;简而言之&#xff0c;它是指用于描述和配置Bean实例化过程的模型对象。有人可能会提出疑问&#xff0c;既然只需要Class&#xff08;类&#xff09;就可以实例化一个对象&#xff0c;Class作为类的元数据&…

电气工程VR虚拟仿真实训平台以趣味化方式增强吸引力

在工业4.0时代和教育信息化的双重推动下&#xff0c;我们致力于推动实训课件的跨界合作与共创。VR实训课件不仅促进了不同领域、不同行业之间的紧密合作&#xff0c;更让学习变得生动直观。我们凭借3D技术生动、直观、形象的特点&#xff0c;开发了大量配套3D教材&#xff0c;让…

CSS 【实用教程】(2024最新版)

CSS 简介 CSS 是层叠样式表( Cascading Style Sheets ) 的简写&#xff0c;用于精确控制 HTML 页面的样式&#xff0c;以便更好地展示图文信息或产生炫酷/友好的交互体验。 没有必要让所有浏览器都显示得一模一样的&#xff0c;好的浏览器有更好的显示&#xff0c;糟糕的浏览器…

C\C++ 终端输出带有颜色的字符

终端显示带有颜色的字符 终端显示带有颜色的字符 终端显示带有颜色的字符背景&#xff1a;测试机器&#xff0c;win10系统&#xff0c; VS2022编写字体设置不同的颜色背景色光标移动 &#xff08;这个用的估计不是很多&#xff09;字体设置动态显示C cout 也可以测试代码准确的…

【C++】继承(二)

目录 5、继承与友元 6、继承与静态成员 7、复杂的菱形继承和菱形虚拟继承 8、继承的总结与反思 5、继承与友元 友元关系不能继承&#xff0c;也就是说父类的友元不能访问子类的私有或保护的成员 class Student; class Person { public:friend void Display(const Person&a…

.net C# 使用网易163邮箱搭建smtp服务,实现发送邮件功能

功能描述&#xff1a;使用邮箱验证实现用户注册激活和找回密码。邮箱选择网易163作为smtp服务器。 真实测试情况&#xff1a;第一种&#xff1a;大部分服务器运行商的25端口默认是封禁的&#xff0c;可以联系运营商进行25端口解封&#xff0c;解封之后可以使用25端口。第二种&…

【Pytorch】Conda环境下载慢换源/删源/恢复默认源

文章目录 背景临时换源永久换源打开conda配置condarc换源执行配置 命令行修改源添加源查看源 删源恢复默认源使用示范 背景 随着实验增多&#xff0c;需要分割创建环境的情况时有出现&#xff0c;在此情况下使用conda create --name xx python3.10 pytorch torchvision pytorc…

文件读写操作之c语言、c++、windows、MFC、Qt

目录 一、前言 二、c语言文件读写 1.写文件 2.读文件 三、c文件读写 1.写文件 2.读文件 四、windows api文件读写 1.写文件 2.读文件 五、MFC文件读写 1.写文件 2.读文件 六、Qt文件读写 1.写文件 2.读文件 七、总结 一、前言 我们在学习过程中&#xff0c…

OpenCV解决验证码(数字和字母)识别(Python)

文章目录 前言一、准备验证码图片 前言 OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库。它支持Windows、Linux、Mac OS、Android和iOS等多个操作系统&#xff0c;提供了丰富的图像处理和计算机视觉功能&#xff0c;包括但…

链路追踪系列-01.mac m1 安装zipkin

下载地址&#xff1a;https://hub.docker.com/r/openzipkin/zipkin jelexjelexxudeMacBook-Pro zipkin-server % pwd /Users/jelex/Documents/work/zipkin-server 先启动Es: 可能需要先删除 /Users/jelex/dockerV/es/plugins 目录下的.DS_Store 当端口占用时再次启动&#x…

Qt+ESP32+SQLite 智能大棚

环境简介 硬件环境 ESP32、光照传感器、温湿度传感器、继电器、蜂鸣器 基本工作流程 上位机先运行&#xff0c;下位机启动后尝试连接上位机连接成功后定时上报传感器数据到上位机&#xff0c;上位机将信息进行处理展示判断下位机传感器数据&#xff0c;如果超过设置的阈值&a…

【Wamp】局域网设备访问WampServer | 使用域名访问Wamp | Wamp配置HTTPS

局域网设备访问WampServer 参考&#xff1a;https://www.jianshu.com/p/d431a845e5cb 修改Apache的httpd.conf文件 D:\Academic\Wamp\program\bin\apache\apache2.4.54.2\conf\httpd.conf 搜索 Require local 和Require all denied&#xff0c;改为Require all granted <…

【排序算法】计数排序

目录 一.基本思想 二.缺陷及优化 三.代码实现 四.特性总结 1.可以排序负数 2.适合范围集中的整数 3.时间复杂度&#xff1a;O(Nrange) 4.空间复杂度&#xff1a;O(range) 5.稳定性&#xff1a;稳定 一.基本思想 根据待排序数组a创建一个新的数组count&#xff0c;该数组…