02- 模块化编程-003 LCD1602液晶显示时间与日期

news2024/11/23 6:51:32

1、液晶显示电路


2、电路原理简介

1. 电路组件与功能

  • PIC单片机(PIC16F887)

    • 主控制器,负责处理输入输出。
  • LCD显示屏(LM061)

    • 驱动数码管显示器,以显示时间和日期信息。
      支持多个段显示,简化了与单片机的连接。
  • 数码管(MAX7219)

    • 驱动多个数码管,简化与数码管的连接和控制。通过串行接口与PIC单片机通信,显示日期和时间信息。

    DS1302(实时时钟芯片)

  •    用于记录当前的日期和时间。

    通过 SPI 接口与单片机连接,传输时间数据。

  • 电阻排(RP1)

    • 作为限流电阻,确保LCD和数码管的正常工作,保护电路不受过流影响。
  • 电源(B1)

    • 为DS1302后备电源,通常为3V至5V(如 CR2032)以备份时间,即使在断电情况下也能保持计时。。
  • 晶体振荡器(X2)

    • 连接在 DS1302 上,提供稳定的时钟信号(通常为 32.768 kHz)以确保时间准确计时。
  • 数码管(LEDMPX):

  • 用于显示时钟信息,例如小时、分钟、秒和日期。
    通过 MAX7219 进行控制和数据显示。

    2. 连接说明

  • PIC单片机与LCD的连接

    • RS、RW和E引脚连接至PIC的相应引脚。
    • 数据引脚D0至D7连接,进行数据传输。
  • PIC单片机与MAX7219的连接

    • 控制引脚(如DIN、LOAD和CLK)连接至单片机的相应端口,以实现对数码管的控制。
  • 单片机与DS1302的连接

    • SCL、SDA引脚连接至单片机的对应引脚,实现I2C通信。
  • RP1与显示模块的连接

    • 限流电阻连接在LCD和数码管的适当位置,以保护组件。

3. 工作原理

  • 时间显示

    • DS1302通过晶体振荡器提供的时钟信号来保持当前时间,并定期更新数码管的显示。
  • 日期显示

    • DS1302维护当前日期,由PIC单片机通过LCD和数码管显示。
  • 数据传输

    • PIC与MAX7219通信,通过串行数据将数字信息发送至数码管进行显示,从而简化多位数码管的控制。
  • 控制逻辑

    • 程序在PIC中运行,周期性更新LCD和数码管显示,确保时间和日期的准确性。

3、软件代码

3.1 lcd1602.c

/*********************************************************************
 * 模块名称: Lcd1602.hc
 * 模块名:LCD1602 控制模块
 * 功能描述: 该模块定义了与1602 LCD屏幕交互所需的宏和函数原型
 * 创 建 人:bianjingyuan 
 * 日期:2024-10-30
 * 编译环境:Windows XP + MPLAB IDE 8.83 + Picc 9.60
 * 版本号:1.0
 * 修改记录:
 *********************************************************************/
#include "Lcd1602.h"
#include "PIC16F887_Delay.h"
// LCD控制命令定义
#define Clear_Display          		0x01       // 清除显示命令
#define Display_On            		0x0C        // 打开显示命令
#define Bit8_Line2_Display    		0x38        // 设置8位数据线和2行显示模式
#define LCD_Entry_Mode_Set    	0x06        // 设置输入模式命令
#define Shift_Function        		0x14        // 显示或光标位移命令
#define Set_CGRAM00           	0x00        // 第一行起始地址
#define Set_CGRAM40           	0x40        // 第二行起始地址
#define uchar      unsigned char 			   // 无符号字符类型定义
// 第一行和第二行要显示的数据
const uchar Data_1[16] = "0123456789012345";  
const uchar Data_2[16] = "abcdefghABCDEFGH";  
const uchar code_Data[] = "Hello World !";  
const uchar code_Data2[] = "Good Good Study, Day Day Up !";
const uchar Y_Data_0[] = {0x0f, 0x12, 0x0f, 0x0a, 0x1f, 0x02, 0x02, 0x02};  // 汉字 年 的字模
const uchar M_Data_1[] = {0x0f, 0x09, 0x0f, 0x09, 0x0f, 0x09, 0x0b, 0x11};  // 汉字 月 的字模    
const uchar D_Data_2[] = {0x1f, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x1f, 0x00};  // 汉字 日 的字模

/*********************************************************************
 * 函 数 名: Lcd1602_Check_Busy
 * 功能描述: 检查 LCD1602 是否忙碌
 * 调用函数: 无
 * 全局变量:
 *   Lcd1602_Data: 报告 LCD 状态
 *   Lcd1602_RS: 选择指令或数据
 *   Lcd1602_RW: 读写选择
 *   Lcd1602_E: 使能信号
 * 输    入: 无
 * 返    回: 无
 * 设 计 者:bianjingyuan                         日期:2024-10-30
 * 版    本: 1.0
 * 函数说明: 此函数用于检查 LCD 是否处于忙碌状态。
 *          通过设置相应的控制信号,读取 LCD 的状态。
 * 注意事项: 确保在调用此函数之前已正确配置相关的控制引脚。
 *********************************************************************/
void Lcd1602_Check_Busy()
{
    unsigned char temp;  // 使用完整类型名

    Lcd1602_Data = 0xff;  // 设置数据引脚为全高,准备读取状态
    Lcd1602_RS = 0;       // 设置为指令模式
    Lcd1602_RW = 1;       // 设置为读取模式

    do {
        Lcd1602_E = 1;    // 拉高使能信号
        temp = Lcd1602_Data;  // 将 LCD 状态保存在 temp 中,用于判断忙碌状态
        Lcd1602_E = 0;    // 使能信号下拉
    } while(temp & 0x80); // 如果高位为 1,表示 LCD 忙碌,继续循环;为 0 时不忙可以继续操作
}

/*********************************************************************
 * 函 数 名: Lcd1602_Init
 * 功能描述: 初始化 LCD1602 显示屏
 * 调用函数: Lcd1602_Write_Cmd()
 * 全局变量: 无
 * 输    入: 无
 * 返    回: 无
 * 设 计 者:bianjingyuan                         日期:2024-10-30
 * 版    本: 1.0
 * 注意事项: 在调用此函数之前,确保 LCD 硬件连接正常。
 *********************************************************************/
void Lcd1602_Init()
{
    Lcd1602_Write_Cmd(Clear_Display);           // 指令1 ?? 清屏
    Lcd1602_Write_Cmd(LCD_Entry_Mode_Set);      // 指令2 ?? 设置输入模式,AC加1,画面不动
    Lcd1602_Write_Cmd(Display_On);               // 指令3 ?? 打开显示,光标关闭,闪烁关闭
    Lcd1602_Write_Cmd(Bit8_Line2_Display);      // 指令4 ?? 8位数据接口,两行显示,5x7点阵
    Lcd1602_Write_Cmd(0x80);                     // 指令5 ?? 设置光标位置,从第一行第一列开始显示
}

/*********************************************************************
 * 函 数 名: Lcd1602_Write_Cmd
 * 功能描述: 向 LCD1602 写入指令
 * 调用函数: Lcd1602_Check_Busy(), delayms()
 * 全局变量: 
 *   Lcd1602_RS: 选择指令或数据模式
 *   Lcd1602_RW: 读写选择
 *   Lcd1602_E: 使能信号
 *   Lcd1602_Data: 用于发送指令的数据信号
 * 输    入: uchar Cmd - 要写入的指令
 * 返    回: 无
 * 设 计 者:bianjingyuan                         日期:2024-10-30
 * 版    本: 1.0
 * 注意事项: 确保在调用此函数之前已正确配置控制引脚,并且 LCD 硬件连接正常。
 *********************************************************************/
void Lcd1602_Write_Cmd(uchar Cmd)  
{
    Lcd1602_Check_Busy();  // 判忙,确保 LCD 不忙碌
    Lcd1602_RS = 0;  // 选择指令模式
    Lcd1602_RW = 0;  // 选择写模式
    Lcd1602_E = 0;   // 使能信号低
    Lcd1602_Data = Cmd;  // 发送指令
    delayms(2);       // 等待,确保指令处理完毕
    Lcd1602_E = 1;   // 拉高使能信号
    delayms(5);      // 等待以确保指令被执行
    Lcd1602_E = 0;   // 将使能信号设为低
}
/*********************************************************************
 * 函 数 名: Lcd1602_Write_Data
 * 功能描述: 向 LCD1602 写入数据
 * 调用函数: Lcd1602_Check_Busy(), delayms()
 * 全局变量: 
 *   Lcd1602_RS: 选择指令或数据模式
 *   Lcd1602_RW: 读写选择
 *   Lcd1602_E: 使能信号
 *   Lcd1602_Data: 用于发送数据的数据信号
 * 输    入: uchar Data - 要写入的数据
 * 返    回: 无
 * 设 计 者:bianjingyuan                         日期:2024-10-30
 * 版    本: 1.0
 * 注意事项: 确保在调用此函数之前已正确配置控制引脚,并且 LCD 硬件连接正常。
 *********************************************************************/
void Lcd1602_Write_Data(uchar Data) 
{
    Lcd1602_Check_Busy();  // 判忙,确保 LCD 不忙碌
    Lcd1602_RS = 1;        // 选择数据模式
    Lcd1602_RW = 0;        // 选择写模式
    Lcd1602_E = 0;         // 使能信号低
    Lcd1602_Data = Data;   // 发送数据
    delayms(2);            // 等待,确保数据处理完毕
    Lcd1602_E = 1;         // 拉高使能信号
    delayms(10);           // 等待以确保数据被执行
    Lcd1602_E = 0;         // 将使能信号设为低
}
/*********************************************************************
 * 函 数 名: Lcd1602_SetCursor
 * 功能描述: 设置 LCD1602 的光标位置
 * 调用函数: Lcd1602_Write_Cmd()
 * 全局变量: 无
 * 输    入: uchar row - 行号 (0 或 1)
 *           uchar col - 列号 (0 至 15)
 * 返    回: 无
 * 设 计 者:bianjingyuan                         日期:2024-10-30
 * 版    本: 1.0
 * 注意事项: 请确保 row 参数在有效范围内(0 和 1),col 参数应在 0 至 15 之间。
 *********************************************************************/
void Lcd1602_SetCursor(uchar row, uchar col)
{
    uchar address; // 光标地址变量
    if (row == 0) 
    {
        address = 0x00 + 0x80 + col;  // 计算第一行的地址
    } 
    else if (row == 1) 
    {
        address = 0x40 + 0x80 + col;  // 计算第二行的地址
    }
    Lcd1602_Write_Cmd(address);  // 发送命令以设置光标位置
}
/*********************************************************************
 * 函 数 名: Show_String
 * 功能描述: 在 LCD1602 上显示字符串
 * 调用函数: Lcd1602_Write_Data()
 * 全局变量: 无
 * 输    入: const uchar* line - 指向要显示的字符串的指针
 * 返    回: 无
 * 设 计 者:bianjingyuan                         日期:2024-10-30
 * 版    本: 1.0
 * 函数说明: 此函数循环遍历字符串中的每个字符,调用写数据函数将其显示在 LCD1602 上。
 * 注意事项: 确保输入字符串以 '\0' 结尾,以正确识别字符串结束。
 *********************************************************************/
void Show_String(const uchar* line) 
{
    uchar i = 0;  // 字符索引
    while (line[i] != '\0') 
    {             
        Lcd1602_Write_Data(line[i++]);     // 显示当前字符并移动到下一个字符
    }
}
/*********************************************************************
 * 函 数 名: Show_String_From_Row
 * 功能描述: 从指定行开始在 LCD1602 上显示字符串
 * 调用函数: Lcd1602_SetCursor(), Show_String()
 * 全局变量: 无
 * 输    入: const uchar* line - 指向要显示的字符串的指针
 *           uchar row - 行号(0 或 1)
 * 返    回: 无
 * 设 计 者:bianjingyuan                         日期:2024-10-30
 * 版    本: 1.0
 * 函数说明: 此函数将光标设置到指定的行,然后显示传入的字符串。
 * 注意事项: 确保 row 参数在有效范围内(0 和 1),并且传入的字符串以 '\0' 结束。
 *********************************************************************/
void Show_String_From_Row(const uchar* line, uchar row) 
{
    // 设置光标位置
    Lcd1602_SetCursor(row, 0); // 光标设置到指定行的起始列
    
    // 显示字符串
    Show_String(line);          // 调用已定义的显示字符串函数
}

/*********************************************************************
 * 函 数 名: Lcd1602_Write_Number_At
 * 功能描述: 在指定位置的 LCD1602 上显示数字
 * 调用函数: Lcd1602_SetCursor(), Lcd1602_Write_Data()
 * 全局变量: 无
 * 输    入: uchar row - 行号(0 或 1)
 *           uchar col - 列号(0 至 15)
 *           uchar number - 要显示的数字(范围在 0 到 9 )
 * 返    回: 无
 * 设 计 者:bianjingyuan                         日期:2024-10-30
 * 版    本: 1.0
 * 函数说明: 此函数将光标移动到指定的行和列,并将给定的数字显示在 LCD1602 上。
 * 注意事项: 确保 number 参数在有效范围内(0 到 9),以避免显示错误。
 *********************************************************************/
void Lcd1602_Write_Number_At(uchar row, uchar col, uchar number)
{   
    uchar character; // 存储转换后的字符
    // 设置光标到指定的行和列
    Lcd1602_SetCursor(row, col);
    
    // 将数字转换为字符 (假设数字范围在0到9)
    character = number + '0'; // 将数字转换为对应的字符
    
    // 写入数据到 LCD
    Lcd1602_Write_Data(character);
}
/*********************************************************************
 * 函 数 名: Lcd1602_Write_String_At
 * 功能描述: 在指定位置的 LCD1602 上显示字符串
 * 调用函数: Lcd1602_SetCursor(), Lcd1602_Write_Data()
 * 全局变量: 无
 * 输    入: uchar row - 行号(0 或 1)
 *           uchar col - 列号(0 至 15)
 *           const char* text - 指向要显示的字符串的指针
 * 返    回: 无
 * 设 计 者:bianjingyuan                         日期:2024-10-30
 * 版    本: 1.0
 * 函数说明: 此函数将光标移动到指定的行和列,并将给定的字符串显示在 LCD1602 上。
 * 注意事项: 确保传入的字符串以 '\0' 结尾,以保证正确识别字符串结束。
 *********************************************************************/
void Lcd1602_Write_String_At(uchar row, uchar col, const char* text)
{
    // 设置光标到指定的行和列
    Lcd1602_SetCursor(row, col);

    // 遍历字符串并逐个写入每个字符到 LCD
    while (*text) // 当当前字符不为 '\0' 时
    {
        // 写入数据到 LCD
        Lcd1602_Write_Data(*text);
        text++; // 移动到下一个字符
    }
}

3.2 main.c

//********************************************************************
//* 文件名: B002_887_1602.c
//* 文件描述: PIC16F887A,用于子程序实现实时时钟DS1302的驱动及1602显示
//* 编译环境:Windows XP + MPLAB IDE 8.83 + Picc 9.60
//* 编程者:bianjingyuan
//* 编程日期:2024年10月30日
//* 版本号:1.0
//* 修改记录:
//*******************************************************************/
//*  硬件资源分配表:
//*   din              RD5
//*   clk_1           RD7=1
//*   clk_0           RD7=0  
//*   load_1          RD6=1
//*   load_0          RD6=0  
//*   ds1302_clk      RE0    // DS1302时钟线引脚
//*   ds1302_io       RE1    // DS1302数据线引脚
//*   ds1302_rst      RE2    // DS1302复位线引脚

// 包含单片机内部资源预定义头文件
#include "pic.h"
#include "DS1302.h"
#include "max7219.h"
#include "PIC16F887_Delay.h"
#include "Lcd1602.h"

// 定义数据类型
#define uchar unsigned char 
#define uint  unsigned int
#define ulong unsigned long

// 定义单片机指令
#define nop    asm("NOP")      // 执行空操作指令
#define sleep  asm("sleep")    // 进入睡眠模式

// 定义DS1302引脚连接PIC16F887A
#define ds1302_clk  RD1        // 实时时钟时钟线引脚 
#define ds1302_io   RD0        // 实时时钟数据线引脚 
#define ds1302_rst  RD2        // 实时时钟复位线引脚 

// 定义数码管引脚连接 max7219 
#define din   RD5              // 数据输入引脚
#define clk_1 RD7=1            // 时钟高电平
#define clk_0 RD7=0            // 时钟低电平
#define load_1 RD6=1           // 锁存高电平
#define load_0 RD6=0           // 锁存低电平

// 定义芯片工作时的配置位和ID
__CONFIG (0x3F32); // 设置配置字
// __IDLOC (1974); // 设置ID位

// 定义变量
uchar m, k, i, l, add, dat, c0; // 临时变量
uchar add8, add7, add6, add5, add4, add3, add2, add1; // 显示位数据
uchar timerbcd[7];  // 存放从DS1302读回的时间数据(BCD码)
uchar timerint[7]; // 存放将BCD码转换成十进制后的时间数据

/*********************************************************************
 *
 * 函 数 名: initial
 * 功能描述: 系统初始化,包括配置寄存器和端口。
 * 输入参数: 无
 * 输出参数: 无
 * 设 计 者: bianjingyuan                          日期: 2024年10月30日
 *
 *********************************************************************/
void initial(void)
{
    // 配置 OPTION 寄存器
    OPTION = 0b11000010; // 设置看门狗定时器、定时器0预分频器等

    // 配置 I/O 口
    TRISA = 0b101111;   // RA4 配置为输出,其他位为输入
    TRISB = 0b000000;   // RB0 和 RB1 配置为输入
    TRISC = 0b000000;   // RC3 和 RC5 配置为输入
    TRISD = 0b000000;   // RD0 和 RD1 配置为输入
    TRISE = 0b00001000; // RE0、RE1 和 RE2 配置为输出

    // 关闭所有中断
    INTCON = 0b00000000; // 关闭所有中断

    // 初始化端口
    PORTA = 0b00000000; // PORTA 初始化为 0
    PORTB = 0b00000001; // PORTB 初始化为 1
    PORTC = 0b00000000; // PORTC 初始化为 0
    PORTD = 0b00000000; // PORTD 初始化为 0
    PORTE = 0b00000000; // PORTE 初始化为 0

    // 配置 ADC 相关寄存器
    ADCON0 = 0b10000000; // 设置 A/D 转换通道为 AN0,并使能 A/D 转换
    ADCON1 = 0b00001001; // 设置 A/D 转换参考电压为 VDD 和 VSS
    ANSEL = 0b00001111;  // 设置 RA0 为模拟输入,RA2 和 RA3 为模拟模块的 VREF- 和 VREF+
    ANSELH = 0b00000000; // 设置所有 PORTB 和 PORTC 引脚为数字 I/O
    ADRESH = 0b00000000; // 清空 A/D 转换结果高8位
    ADRESL = 0b00000000; // 清空 A/D 转换结果低8位

    // 初始化变量
    add1 = add2 = add3 = 0b00000000; // 将变量 add1、add2 和 add3 初始化为 0

    // 配置中断
    GIE = 0b00000000;    // 关闭总中断
    PEIE = 0b00000000;   // 关闭外围设备中断
    T0IE = 0b00000001;   // 开启定时器 0 中断
    T0IF = 0b00000000;   // 清除定时器 0 中断标志
    INTF = 0b00000000;   // 清除外部中断标志

    // 初始化定时器 BCD 值
    timerbcd[0] = 0b00000000; // 将定时器 BCD 数组的第一个元素初始化为 0
}

/*********************************************************************
 *
 * 函 数 名: main
 * 功能描述: 主程序,负责DS1302时钟模块读取和显示。
 * 输入参数: 无
 * 输出参数: 无
 * 设 计 者: bianjingyuan                          日期: 2024年10月30日
 *
 *********************************************************************/
void main()
{
    initial(); // 系统初始化
    // 初始化DS1302引脚
    ds1302_clk = 0; // 设置时钟线低电平
    ds1302_io = 0;  // 设置数据线低电平
    ds1302_rst = 0; // 设置复位线低电平
    max7219_int();  // 测试数码管芯片
    ds1302_Open();  // 打开DS1302
    
   
    Lcd1602_Init();  // LCD1602 初始化 

redo: 
    nop; // 空操作
    ds1302_read_time(); // 读取DS1302时间
    ds1302_write(0x8e, 0x80); // 禁止写入DS1302
    
    // 将BCD码转换为十进制
    for (i = 7; i > 0; i--)
    {
        timerint[7 - i] = timerbcd[7 - i] & 0x0f; // 取个位数据
        k = timerbcd[7 - i] >> 4; // 取十位数据
        timerint[7 - i] = (10 * (k & 7)) + (timerint[7 - i]); // 转换为十进制
    }

    // 将时间数据分别存入显示数据数组
    c0 = timerint[0]; // 秒
    add7 = c0 / 10;   // 秒的十位
    add8 = c0 % 10;   // 秒的个位
    c0 = timerint[1]; // 分
    add5 = c0 / 10;   // 分的十位
    add6 = c0 % 10;   // 分的个位
    c0 = timerint[2]; // 时
    add3 = c0 / 10;   // 时的十位
    add4 = c0 % 10;   // 时的个位
    c0 = timerint[3]; // 日
    add1 = c0 / 10;   // 日的十位
    add2 = c0 % 10;   // 日的个位
    Show_String_From_Row("date: 2024-11-03 ", 0);
    Show_String_From_Row("time:  ", 1);
    Lcd1602_Write_Number_At(1, 6, add3);
    Lcd1602_Write_Number_At(1, 7, add4);
    Lcd1602_Write_String_At(1, 8, ": ");
    Lcd1602_Write_Number_At(1, 9, add5);
    Lcd1602_Write_Number_At(1, 10, add6);
    Lcd1602_Write_String_At(1, 11, ": ");
    Lcd1602_Write_Number_At(1, 12, add7);
    Lcd1602_Write_Number_At(1, 13, add8);

    // 发送显示数据到数码管芯片
    send(0x01, add1); delayms(5); // 显示日期
    send(0x02, add2); delayms(5);
    send(0x03, add3); delayms(5); // 显示小时
    send(0x04, add4); delayms(5);
    send(0x05, add5); delayms(5); // 显示分钟
    send(0x06, add6); delayms(5);
    send(0x07, add7); delayms(5); // 显示秒
    send(0x08, add8); delayms(5);
    delayms(10); // 确保显示完成
    goto redo; // 循环显示
}


4、代码解析

4.1 lcd1602

        该程序的主要功能是控制LCD1602显示模块进行字符和数字的显示。具体功能包括:

  1. 初始化LCD1602显示屏,设置显示模式、清屏和光标位置。
  2. 向LCD1602写入指令和数据,实现对屏幕的控制和显示。
  3. 设置光标位置,以便在特定的位置进行显示。
  4. 显示字符串、数字在指定的行列位置。
  5. 提供对LCD1602忙碌状态的检测功能,以确保显示操作的顺利进行。

4.2 main

        该程序实现了使用PIC16F887A单片机驱动实时时钟模块DS1302,并通过LCD1602和数码管显示时间和日期。主要功能如下:

  1. 配置PIC16F887A的端口和寄存器,初始化硬件设备。
  2. 从DS1302读取实时时间数据,以BCD码格式存储。
  3. 将BCD码转换为十进制,并将时间(小时、分钟、秒)及日期(天)在LCD1602和数码管显示。
  4. 使用LCD1602显示时间和日期,实时更新。
  5. 通过Max7219控制器驱动数码管显示实时时间。


5、硬件资源分配表

序号引脚类别方向功能定义功能内容
1RD1数字IO输出ds1302_clk实时时钟时钟线
2RD0数字IO双向ds1302_io实时时钟数据线
3RD2数字IO输出ds1302_rst实时时钟复位线
4RD5数字IO输出MAX7219_din数据输入引脚
5RD6数字IO输出MAX7219_load锁存控制引脚
6RD7数字IO输出MAX7219_clk时钟控制引脚
7RE0数字IO输出Lcd1602_RW指令/数据选择
8RE1数字IO输出Lcd1602_RS读写选择
9RE2数字IO输出Lcd1602_E数据锁存
10PORTC数据总线输出Lcd1602_Data数据指令传递

         基于上述硬件资源分配表,该程序实现了以下主要功能:

  1. 通过I/O引脚与DS1302进行通信,实现实时时钟时间的读取和显示。
  2. 将BCD码转换为十进制,再通过数码管显示。
  3. 通过LCD1602显示实时时钟的时间和日期。
  4. 提供完整的初始化和配置,以支持实时显示任务的执行。


6、软件流程图


7、仿真运行结果

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

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

相关文章

conda下jupyterlab安装问题以及交互绘图问题记录

安装 1. 直接conda install jupyterlab就好,只要在base环境下安装就行,可以在任意环境下执行jupyter lab启动。 2. 打开jupyter lab后显示Could not determine jupyterlab build status without nodejs,可以执行conda install nodejs安装no…

华为OD机试 - 预订酒店(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

LM Head weights;ChatGPT-3词汇量:175,000;llama7b 词汇量,词嵌入维度:4096

目录 LM Head weights ChatGPT-3词汇量:175,000 llama7b 词汇量 词汇量:32000 max_position_embeddings: 4096 LM Head weights ChatGPT-3词汇量:175,000 ChatGPT-4 确切的词向量种类数量公开信息。但可以根据一些语言模型的相关知识进行推测分析。 一般来说,语言模…

极简实现酷炫动效:Flutter隐式动画指南第二篇之一些酷炫的隐式动画效果

目录 前言 1.弹性放大按钮效果 2.旋转和缩放组合动画 3.颜色渐变背景动画 4.缩放进出效果 前言 在上一篇文章中,我们介绍了Flutter中的隐式动画的一些相关知识,在这篇文章中,我们可以结合多个隐式动画 Widget 在 Flutter 中创建一些酷炫的视觉效果&…

【ONLYOFFICE 文档 8.2 版本深度测评】功能革新与用户体验的双重飞跃

引言 在数字化办公的浪潮中,ONLYOFFICE 文档以其强大的在线协作功能和全面的办公套件解决方案,赢得了全球用户的青睐。随着 8.2 版本的发布,ONLYOFFICE 再次证明了其在办公软件领域的创新能力和技术实力。 一.协作编辑 PDF:团队合…

高频电子线路---倍频器与振荡器

目录 倍频电路原理 丙类倍频器原理电路 问题: 提升滤波方法: 导通角 振荡器 振荡器基本工作原理 首先是怎么维持 那么如何振荡呢? 思考题: 组成要素 振荡器的起振条件 平衡条件 要点提示 稳定条件 振幅平衡 硬激励起振时: 稳定条件 相位平衡 倍频电路原理 简单原理 : …

自杀一句话木马(访问后自动删除)

在做安全测试时&#xff0c;例如文件上传时就要上传可以解析的脚本文件解析证明存在漏洞&#xff0c;这个时候就需要(访问后自动删除文件的一句话木马) PHP <?php echo md5(1);unlink(__FILE__); ?> 访问后自动删除

Windows配置Nodejs及nmp简明教程(2024可用)

一、下载及安装Nodejs 下载 Node.js 中文网 (nodejs.com.cn)在此下载windows长期维护版本的.msi安装包&#xff0c;64位 安装&#xff1a; 双节安装包一直点击Next下一步&#xff0c;注意安装路径选择C盘默认路径&#xff08;C:\Program Files\nodejs\&#xff09;即可&#x…

使用ffmpeg和mediamtx模拟多通道rtsp相机

首先下载ffmpeg&#xff0c;在windows系统上直接下载可执行文件&#xff0c;并配置环境变量即可在命令行当中调用执行。 下载地址&#xff1a; https://ffmpeg.org/再在github上下载mediamtx搭建rtsp服务器&#xff0c;使用ffmpeg将码流推流到rtsp服务器。 下载地址&#xff1…

Unreal5从入门到精通之如何在VR中使用3DUI

文章目录 前言创建3DUI1.新建控件蓝图2.添加控件到画布上3.新建Actor蓝图MyUIActor4.添加控件组件Widget5.设置控件类和画布大小6.创建MyUIActor实例到场景中3DUI和VR射线交互1.添加按钮的点击事件2.设置MyUIActor碰撞响应3.VRPawn添加控件交互组件4.添加手柄Trigger点击事件绑…

ai数字人分身123口播克隆数字人小程序源码_博纳软云

功能配置 一、用户 用户管理小黑屋用户反馈登录设置短信参数 二、作品 视频作品背景音乐库背景音乐分类 三、形象分身 上传记录视频要求参数配置 四、声音克隆 克隆记录参数配置声音要求文案示例 五、AI文案 生成记录创作模型模型分类Al配置 六、充值 充值订单积分套…

活动回顾丨艾体宝《开源软件供应链安全的最佳实践》线下研讨会圆满落幕!

10月&#xff0c;艾体宝联合Mend成功举办了一场主题为“开源软件供应链安全最佳实践”的研讨会。此次活动吸引了众多业内专家、技术领袖和企业代表参与&#xff0c;共同探讨在当今数字化转型浪潮中&#xff0c;企业如何应对开源软件供应链安全的挑战。会议围绕三大核心议题展开…

java项目之校园周边美食探索及分享平台(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园周边美食探索及分享平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 校园周边美食…

esp32cam+Arduino IDE在编译时提示找不到 esp_camera.h 的解决办法

多半是因为你的ESP32库升级了&#xff0c;不再是 1.02版本&#xff0c;或者根本就没有 ESp32 库。如果被升级了&#xff0c;还原为1.02版本就可以了。如果没有&#xff0c;按照下述方法添加&#xff1a; 首先&#xff0c;在"文件"->"首选项"->"…

Rust 力扣 - 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 长度为k的二进制子串所有取值的集合为[0, sum(k)]&#xff0c;其中sum(k)为1 2 4 … 1 << (k - 1) 我们只需要创建一个长度为sum(k) 1的数组 f &#xff0c;其中下标为 i 的元素用来标记字符串中子串…

Edit Data. Create Cell Editors. Validate User Input 编辑数据。创建 Cell Editors。验证用户输入

Goto Data Grid 数据网格 Edit Data. Create Cell Editors. Validate User Input 编辑数据。创建 Cell Editors。验证用户输入 Get and Modify Cell Values in Code 在代码中获取和修改单元格值 仅当 Grid 及其列已完全初始化时&#xff0c;才使用以下方法。如果需要在表单仍…

网络:ARP的具体过程和ARP欺骗

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言ARP具体过程ARP欺骗原理总结 前言 本文仅作为ARP具体过程和ARP欺骗的知识总结 硬件类型 &#xff1a;指定发送和接受ARP包的硬件类型&am…

一:Linux学习笔记(第一阶段)-- 安装软件 vmware workstation 虚拟机软件 centos系统

目录 学习计划&#xff1a; 资源准备 虚拟机软件&#xff1a;就别自己找了 现在换网站了 下载比较费劲 Centos8&#xff1a; 阿里云镜像地址下载&#xff08;下载比较版 但是有不同版本&#xff09;&#xff1a;centos安装包下载_开源镜像站-阿里云 百度网盘地址&#xff…

在Ubuntu上安装TensorFlow与Keras

文章目录 1. 查看系统和Python版本信息1.1 查看Ubuntu版本信息1.2 查看Python版本信息 2. 安装pip2.1 下载get-pip.py2.2 运行get-pip.py2.3 查看pip版本 3. 安装Jupyter Notebook3.1 安装Jupyter Notebook3.2 运行Jupyter Notebook3.3 安装jupyter-core3.4 配置Jupyter Notebo…

江协科技STM32学习- P30 FlyMCU串口下载STLink Utility

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…