基于s5pv-210开发板 LCD驱动

2023-11-16

lcd硬件原理:

利用液晶制成的显示器称为 LCD,依据驱动方式可分为静态驱动、简单矩阵驱动以及主动矩阵驱动 3 种。其中,简单矩阵型又可再细分扭转向列型( TN)和超扭转式向列型( STN)两种,而主动矩阵型则以薄膜式晶体管型( TFT)为主流。
TFT 屏是目前嵌入式系统应用的主流,下图给出了 TFT 屏的典型时序。时序图中的VCLKHSYNC VSYNC 分别为像素时钟信号(用于锁存图像数据的像素时钟)、行同步信号和帧同步信号, VDEN 为数据有效标志信号, VD 为图像的数据信号。

作为帧同步信号的 VSYNC,每发出一个脉冲,都意味着新的一屏图像数据开始发送。而作为行同步信号的 HSYNC,每发出一个脉冲都表明新的一行图像资料开始发送。在帧同步以及行同步的头尾都必须留有回扫时间。这样的时序安排起源于 CRT 显示器电子枪偏转所需要的时间,但后来成为实际上的工业标准,因此 TFT 屏也包含了回扫时间。


怎么写LCD驱动程序?

1. 分配一个fb_info结构体: framebuffer_alloc

lcd_info = framebuffer_alloc(0, NULL); 

2. 设置

 /* 配置fb_info各成员*/  
    /* fix 固定参数*/  
    strcpy(lcd_info->fix.id, "s5pv210_lcd");  
    lcd_info->fix.smem_len = 800*480*4;  
    lcd_info->fix.type = FB_TYPE_PACKED_PIXELS;  
    lcd_info->fix.visual = FB_VISUAL_TRUECOLOR;  
    lcd_info->fix.line_length = 800*4;  
  
    /* var 可变参数*/  
    lcd_info->var.xres = 800;  
    lcd_info->var.yres = 480;  
    lcd_info->var.xres_virtual = 800;  
    lcd_info->var.yres_virtual = 480;  
    lcd_info->var.bits_per_pixel = 32;  
  
    lcd_info->var.red.offset = 16;  
    lcd_info->var.red.length = 8;  
    lcd_info->var.green.offset = 8;  
    lcd_info->var.green.length = 8;  
    lcd_info->var.blue.offset = 0;  
    lcd_info->var.blue.length = 8;  
    lcd_info->var.activate = FB_ACTIVATE_NOW;  
  
    lcd_info->screen_size = 800*480*4;  
    lcd_info->pseudo_palette = pseudo_palette;  
  
    lcd_info->fbops = &lcd_fbops;   //<span style="font-family: TimesNewRomanPSMT;">fbops <span style="font-family: SimSun;">为指向底层操作的函数的指针<br style="orphans: 2; text-align: -webkit-auto; widows: 2;" /></span></span>

3. 硬件相关的操作

根据原理图,映射相应寄存器:



 /* 配置硬件资源*/  
    /* 映射内存*/  
    display_control = ioremap(0xe0107008,4);  
    gpf0con      = ioremap(0xE0200120, 4);  
    gpf1con      = ioremap(0xE0200140, 4);  
    gpf2con      = ioremap(0xE0200160, 4);  
    gpf3con      = ioremap(0xE0200180, 4);  
      
    gpd0con      = ioremap(0xE02000A0, 4);  
    gpd0dat      = ioremap(0xE02000A4, 4);  
      
    vidcon0      = ioremap(0xF8000000, 4);  
    vidcon1      = ioremap(0xF8000004, 4);  
    vidtcon0     = ioremap(0xF8000010, 4);  
    vidtcon1     = ioremap(0xF8000014, 4);  
    vidtcon2     = ioremap(0xF8000018, 4);  
    wincon0      = ioremap(0xF8000020, 4);  
    vidosd0a     = ioremap(0xF8000040, 4);  
    vidosd0b     = ioremap(0xF8000044, 4);  
    vidosd0c     = ioremap(0xF8000048, 4);  
    vidw00add0b0 = ioremap(0xF80000A0, 4);  
    vidw00add1b0 = ioremap(0xF80000D0, 4);  
    shodowcon    = ioremap(0xF8000034, 4);  


查看芯片手册,配置gpio,例如:


 /* 配置GPIO*/  
    *gpf0con = 0x22222222;  
    *gpf1con = 0x22222222;  
    *gpf2con = 0x22222222;  
    *gpf3con = 0x22222222;  
    *gpd0con &= ~0xf;  
    *gpd0con |= 0x1;  
    *gpd0dat |= 1<<0;  
    *display_control = 2<<0;  


 /* 使能时钟*/  
    lcd_clk = clk_get(NULL, "lcd");  
    if (!lcd_clk || IS_ERR(lcd_clk)) {  
        printk(KERN_INFO "failed to get lcd clock source\n");  
    }  


根据芯片手册及原理图,配置相应寄存器:




时序图,如下:


 /* 配置LCD控制器*/   //VCLK = HCLK / (CLKVAL+1), where CLKVAL >= 1   HCLK=200MHz    VCLK=Clock Frequency=40MHz    CLKVAL=4
    *vidcon0 &= ~(0xff << 6 | 1 << 4);

    //data |= VIDCON0_CLKVAL_F(clkdiv-1) | VIDCON0_CLKDIR;
    *vidcon0 |= (3 << 6) | (1 << 4);   #define VIDCON0_CLKVAL_F(_x)			((_x) << 6)   CLKVAL=3;
   
    *vidcon0 |= (1 << 1) | (1 << 0);

    *vidcon1 = 0x04; 
     // writel(pd->vidcon1, vidcon1);
	//writel(0x04, vidcon1);

   /*data = VIDTCON0_VBPD(var->upper_margin - 1) |VIDTCON0_VFPD(var->lower_margin - 1) | VIDTCON0_VSPW(var->vsync_len - 1);

   writel(data, regs + sfb->variant.vidtcon);*/
  /*data = VIDTCON1_HBPD(var->left_margin - 1) |VIDTCON1_HFPD(var->right_margin - 1) |VIDTCON1_HSPW(var->hsync_len - 1);
		
   writel(data, regs + sfb->variant.vidtcon + 4);*/

  /*data = VIDTCON2_LINEVAL(var->yres - 1) | VIDTCON2_HOZVAL(var->xres - 1);
   writel(data, regs + sfb->variant.vidtcon + 8);*/


   	/*VBPD [23:16] Vertical back porch specifies the number of inactive lines at the
	start of a frame after vertical synchronization period. 0x00
	VFPD [15:8] Vertical front porch specifies the number of inactive lines at the end
	of a frame before vertical synchronization period. 0x00*/
    //tVBP = 22;
    /*tVFP = tVP - tVW - tVBP - tw
	   = 635 - 1 - 22 - 480 
	   =125*/
    *vidtcon0 = (22 << 16)|(125 << 8);  //*vidtcon0 = (31 << 16)|(31 << 8);  

    
	/*HBPD [23:16] Horizontal back porch specifies the number of VCLK periods
	between the falling edge of HSYNC and start of active data. 0x00
	HFPD [15:8] Horizontal front porch specifies the number of VCLK periods
	between the end of active data and rising edge of HSYNC. */
	
	//tHBP = 45;
	/*tHFP = tHP - tHW - tHBP - tHV
	       = 1056 - 1 - 45 - 800
	       = 210*/
    *vidtcon1 = (45 << 16)|(210 << 8); 	//*vidtcon1 = (63 << 16)|(63 << 8); 
    *vidtcon2 = (479 << 11)|(799 << 0);  //HOZVAL = (Horizontal display size) -1 ; LINEVAL = (Vertical display size) -1
  
    *wincon0 &= ~(0xf<<2);  
    *wincon0 |= (0xb<<2);  //select bpp
  
    *vidosd0a = (0<<11)|(0<<0);  //左上角坐标 
    *vidosd0b = (799<<11)|(479<<0);  //右下角坐标
    *vidosd0c = 480*800;   //指定的窗口大小
    //物理地址  
    lcd_info->screen_base = dma_alloc_writecombine(NULL,lcd_info->fix.smem_len, (dma_addr_t *)&(lcd_info->fix.smem_start), GFP_KERNEL);  
      
    *vidw00add0b0 = lcd_info->fix.smem_start;  
    *vidw00add1b0 = lcd_info->fix.smem_start + lcd_info->fix.smem_len;  
  
    *shodowcon = 0x1;  
  

4. 注册: register_framebuffer

ret = register_framebuffer(lcd_info);  



完整lcd驱动程序如下:

 #include <linux/module.h>  
#include <linux/fb.h>  
#include <linux/dma-mapping.h>  
#include <linux/clk.h>  
  
  
static struct fb_info *lcd_info;  
unsigned long pseudo_palette[16];  
  
unsigned long *display_control;  
  
volatile unsigned long* gpf0con;  
volatile unsigned long* gpf1con;  
volatile unsigned long* gpf2con;  
volatile unsigned long* gpf3con;  
volatile unsigned long* gpd0con;  
volatile unsigned long* gpd0dat;  
volatile unsigned long* vidcon0;  
volatile unsigned long* vidcon1;  
volatile unsigned long* vidtcon0;  
volatile unsigned long* vidtcon1;  
volatile unsigned long* vidtcon2;  
volatile unsigned long* wincon0;  
volatile unsigned long* vidosd0a;  
volatile unsigned long* vidosd0b;  
volatile unsigned long* vidosd0c;  
volatile unsigned long* vidw00add0b0;  
volatile unsigned long* vidw00add1b0;  
volatile unsigned long* shodowcon;  
  
struct clk *lcd_clk;  
  
  
static inline unsigned int chan_to_field(unsigned int chan, struct fb_bitfield *bf)  
{  
    chan &= 0xffff;  
    chan >>= 16 - bf->length;  
    return chan << bf->offset;  
}  
  
static int lcdfb_setcolreg(unsigned int regno, unsigned int red,  
                 unsigned int green, unsigned int blue,  
                 unsigned int transp, struct fb_info *info)  
{  
    unsigned int val;  
      
    if (regno > 16)  
        return 1;  
  
    /* 用red,green,blue三原色构造出val */  
    val  = chan_to_field(red,   &info->var.red);  
    val |= chan_to_field(green, &info->var.green);  
    val |= chan_to_field(blue,  &info->var.blue);  
      
    //((u32 *)(info->pseudo_palette))[regno] = val;  
    pseudo_palette[regno] = val;  
    return 0;  
}  
  
static struct fb_ops lcd_fbops = {  
    .owner      = THIS_MODULE,  
    .fb_setcolreg   = lcdfb_setcolreg,  
    .fb_fillrect    = cfb_fillrect,  
    .fb_copyarea    = cfb_copyarea,  
    .fb_imageblit   = cfb_imageblit,  
};  
  
static int lcd_init(void){  
    int ret;  
  
    /*分配fb_info */  
    lcd_info = framebuffer_alloc(0, NULL);  
    if(lcd_info == NULL){  
        printk(KERN_ERR "alloc framebuffer failed!\n");  
        return -ENOMEM;  
    }  
  
    /* 配置fb_info各成员*/  
    /* fix */  
    strcpy(lcd_info->fix.id, "s5pv210_lcd");  
    lcd_info->fix.smem_len = 800*480*4;  
    lcd_info->fix.type = FB_TYPE_PACKED_PIXELS;  
    lcd_info->fix.visual = FB_VISUAL_TRUECOLOR;  
    lcd_info->fix.line_length = 800*4;  
  
    /* var */  
    lcd_info->var.xres = 800;  
    lcd_info->var.yres = 480;  
    lcd_info->var.xres_virtual = 800;  
    lcd_info->var.yres_virtual = 480;  
    lcd_info->var.bits_per_pixel = 32;  
  
    lcd_info->var.red.offset = 16;  
    lcd_info->var.red.length = 8;  
    lcd_info->var.green.offset = 8;  
    lcd_info->var.green.length = 8;  
    lcd_info->var.blue.offset = 0;  
    lcd_info->var.blue.length = 8;  
    lcd_info->var.activate = FB_ACTIVATE_NOW;  
  
    lcd_info->screen_size = 800*480*4;  
    lcd_info->pseudo_palette = pseudo_palette;  
  
    lcd_info->fbops = &lcd_fbops;  
    /* 配置硬件资源*/  
    /* 映射内存*/  
    display_control = ioremap(0xe0107008,4);  
    gpf0con      = ioremap(0xE0200120, 4);  
    gpf1con      = ioremap(0xE0200140, 4);  
    gpf2con      = ioremap(0xE0200160, 4);  
    gpf3con      = ioremap(0xE0200180, 4);  
      
    gpd0con      = ioremap(0xE02000A0, 4);  
    gpd0dat      = ioremap(0xE02000A4, 4);  
      
    vidcon0      = ioremap(0xF8000000, 4);  
    vidcon1      = ioremap(0xF8000004, 4);  
    vidtcon0     = ioremap(0xF8000010, 4);  
    vidtcon1     = ioremap(0xF8000014, 4);  
    vidtcon2     = ioremap(0xF8000018, 4);  
    wincon0      = ioremap(0xF8000020, 4);  
    vidosd0a     = ioremap(0xF8000040, 4);  
    vidosd0b     = ioremap(0xF8000044, 4);  
    vidosd0c     = ioremap(0xF8000048, 4);  
    vidw00add0b0 = ioremap(0xF80000A0, 4);  
    vidw00add1b0 = ioremap(0xF80000D0, 4);  
    shodowcon    = ioremap(0xF8000034, 4);  
      
    /* 配置GPIO*/  
    *gpf0con = 0x22222222;  
    *gpf1con = 0x22222222;  
    *gpf2con = 0x22222222;  
    *gpf3con = 0x22222222;  
    *gpd0con &= ~0xf;  
    *gpd0con |= 0x1;  
    *gpd0dat |= 1<<0;  
    *display_control = 2<<0;  
    /* 使能时钟*/  
    lcd_clk = clk_get(NULL, "lcd");  
    if (!lcd_clk || IS_ERR(lcd_clk)) {  
        printk(KERN_INFO "failed to get lcd clock source\n");  
    }  
    clk_enable(lcd_clk);  
     /* 配置LCD控制器*/   //VCLK = HCLK / (CLKVAL+1), where CLKVAL >= 1   HCLK=200MHz    VCLK=Clock Frequency=40MHz    CLKVAL=4
    *vidcon0 &= ~(0xff << 6 | 1 << 4);

    //data |= VIDCON0_CLKVAL_F(clkdiv-1) | VIDCON0_CLKDIR;
    *vidcon0 |= (3 << 6) | (1 << 4);   #define VIDCON0_CLKVAL_F(_x)			((_x) << 6)   CLKVAL=3;
   
    *vidcon0 |= (1 << 1) | (1 << 0);

    *vidcon1 = 0x04; 
     // writel(pd->vidcon1, vidcon1);
	//writel(0x04, vidcon1);

   /*data = VIDTCON0_VBPD(var->upper_margin - 1) |VIDTCON0_VFPD(var->lower_margin - 1) | VIDTCON0_VSPW(var->vsync_len - 1);

   writel(data, regs + sfb->variant.vidtcon);*/
  /*data = VIDTCON1_HBPD(var->left_margin - 1) |VIDTCON1_HFPD(var->right_margin - 1) |VIDTCON1_HSPW(var->hsync_len - 1);
		
   writel(data, regs + sfb->variant.vidtcon + 4);*/

  /*data = VIDTCON2_LINEVAL(var->yres - 1) | VIDTCON2_HOZVAL(var->xres - 1);
   writel(data, regs + sfb->variant.vidtcon + 8);*/


   	/*VBPD [23:16] Vertical back porch specifies the number of inactive lines at the
	start of a frame after vertical synchronization period. 0x00
	VFPD [15:8] Vertical front porch specifies the number of inactive lines at the end
	of a frame before vertical synchronization period. 0x00*/
    //tVBP = 22;
    /*tVFP = tVP - tVW - tVBP - tw
	   = 635 - 1 - 22 - 480 
	   =125*/
    *vidtcon0 = (22 << 16)|(125 << 8);  //*vidtcon0 = (31 << 16)|(31 << 8);  

    
	/*HBPD [23:16] Horizontal back porch specifies the number of VCLK periods
	between the falling edge of HSYNC and start of active data. 0x00
	HFPD [15:8] Horizontal front porch specifies the number of VCLK periods
	between the end of active data and rising edge of HSYNC. */
	
	//tHBP = 45;
	/*tHFP = tHP - tHW - tHBP - tHV
	       = 1056 - 1 - 45 - 800
	       = 210*/
    *vidtcon1 = (45 << 16)|(210 << 8); 	//*vidtcon1 = (63 << 16)|(63 << 8); 
    *vidtcon2 = (479 << 11)|(799 << 0);  //HOZVAL = (Horizontal display size) -1 ; LINEVAL = (Vertical display size) -1
  
    *wincon0 &= ~(0xf<<2);  
    *wincon0 |= (0xb<<2);  //select bpp
  
    *vidosd0a = (0<<11)|(0<<0);  //左上角坐标 
    *vidosd0b = (799<<11)|(479<<0);  //右下角坐标
    *vidosd0c = 480*800;   //指定的窗口大小
    //物理地址  
    lcd_info->screen_base = dma_alloc_writecombine(NULL,lcd_info->fix.smem_len, (dma_addr_t *)&(lcd_info->fix.smem_start), GFP_KERNEL);  
      
    *vidw00add0b0 = lcd_info->fix.smem_start;  
    *vidw00add1b0 = lcd_info->fix.smem_start + lcd_info->fix.smem_len;  
  
    *shodowcon = 0x1;  
  
    //开启状态  
    *wincon0 |= 1;  
    *vidcon0 |= 3;  
    /* 注册fb_info */  
    ret = register_framebuffer(lcd_info);  
    return ret;  
}  
  
static void lcd_exit(void){  
    unregister_framebuffer(lcd_info);  
    dma_free_writecombine(NULL, lcd_info->fix.smem_len,   
        (void*)lcd_info->screen_base, (dma_addr_t)lcd_info->fix.smem_start);  
  
    iounmap(shodowcon);  
    iounmap(vidw00add1b0);  
    iounmap(vidw00add0b0);  
    iounmap(vidosd0c);  
    iounmap(vidosd0b);  
    iounmap(vidosd0a);  
    iounmap(wincon0);  
    iounmap(vidtcon2);  
    iounmap(vidtcon1);  
    iounmap(vidtcon0);  
    iounmap(vidcon1);  
    iounmap(vidcon0);  
    iounmap(gpd0dat);  
    iounmap(gpd0con);  
    iounmap(gpf3con);  
    iounmap(gpf2con);  
    iounmap(gpf1con);  
    iounmap(gpf0con);  
    framebuffer_release(lcd_info);  
}  
  
module_init(lcd_init);  
module_exit(lcd_exit);  
MODULE_LICENSE("GPL"); 

测试:

去掉原来的驱动,加载自己编译的驱动。

echo hello > /dev/tty1  // 可以在LCD上看见hello
cat lcd.ko > /dev/fb0   // 花屏



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于s5pv-210开发板 LCD驱动 的相关文章

  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • Composer 安装要求

    我正在尝试将 Composer 安装到 Laravel 项目中 当我做的时候sudo composer install在项目目录中它显示了两个错误 Problem 1 Installation request for simplesoftw
  • Linux 桌面快捷方式和安装图标

    我需要添加什么到我的 spec文件来创建桌面快捷方式并在安装过程中为快捷方式分配一个图标 rpm 如果需要脚本 一个示例将非常有帮助 您在 Linux 下使用 desktop 文件作为图标 图标放置的位置取决于您使用的发行版和桌面环境 由于
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络

随机推荐

  • Python期末考试答案

    文章目录 一 选择题 和 的区别 列表的操作 字典 字符串 运算 类的继承 程序阅读题 二 判断题 三 简答题 在python中 递归函数的特性是什么 阐释python是什么样的一门编程语言及应用场景 阐述类的三大特性是什么 你是如何理解的
  • 用Python的pandas读取excel文件中的数据

    一 前言 hello呀 各位铁子们大家好呀 今天呢来和大家聊一聊用Python的pandas读取excel文件中的数据 二 读取Excel文件 使用pandas的read excel 方法 可通过文件路径直接读取 注意到 在一个excel文
  • PyQt5 按钮Button 添加事件(信号/槽)

    本文基于PyQt5 按钮Buttons样式设计 针对按钮添加响应的点击事件触发 效果截图 PyQt 模型设计 PyQt 设计器截图 UI 源码
  • 乘积怎么表示_三个连续自然数的和等于它们的乘积,求这三个数

    咋一看题目 还是不难 结果全班45人 只有2人写出解答过程 什么题 答案都能凑得出来 写不了过程 我们一起来看看这道五年级数学题 若a b c为三个连续自然数 且满足a b c abc 这三个自然数分别是多少 请写出解题过程 分析 这道题目
  • 7-3 打印沙漏

    7 3 打印沙漏 本题要求你写个程序把给定的符号打印成沙漏的形状 例如给定17个 要求按下列格式打印 所谓 沙漏形状 是指每行输出奇数个符号 各行符号中心对齐 相邻两行符号数差2 符号数先从大到小顺序递减到1 再从小到大顺序递增 首尾符号数
  • mybatis是如何集成到spring的之SqlSessionFactoryBean

    文章目录 1 前言 1 1 集成spring前使用mybatis的方式 1 2 集成mybatis到spring的关键步骤 2 SqlSessionFactoryBean对象分析 2 1 buildSqlSessionFactory做了什么
  • cmake的-G 参数

    一 介绍 CMake默认根据平台选择一个生成器 通常 默认生成器足以让用户继续构建软件 用户可以使用 G选项覆盖默认生成器 cmake G Ninja cmake help的输出包括一个可供用户选择的生成器列表 注意 生成器名称是区分大小写
  • php mysql 开源中国_国内最常用的PHP+MySql免费CMS网站系统大全

    1 DEDE 这是一款国内开源的cms 作者是一个个人 能做出如此功能的cms 是相当不错的 2007版功能十分强大 希望能改善之前数据量一大 更新静态页就很慢的缺点 因为开源 有较多的玩家和拥护者 非常适合有一定编程基础的站长 2 php
  • 图解循环单链表(含C代码)

    目录 1什么是循环单链表 2好处是什么呢 3操作的差异 4代码 1什么是单向循环链表 单向循环链表对比单链表 其实只有一个地方的差异 那就是 尾结点的指针域不是指向空 而是指向了头结点 使其形成了一个环 2好处是什么呢 链表从链尾到链头很方
  • Windows内核面试题(持续更新,目前完成度30%约1.8万字)

    WINDOWS内核编程问题与答案 1 WDK和SDK的区别是什么 2 WDK全称叫做 3 如何创建WDK程序 4 WinDbg如何连接虚拟机 5 Windows内核符号表的作用 6 如何设置内核符号表与源文件 7 如何设置断点与源码调试 8
  • intel android haxm,使用Intel HAXM为Android模拟器加速,媲美真机

    Intel HAXM Hardware Accelerated Execution Manager 使用基于 Intel R Virtualization Technology VT 的硬件加速 因此需要 CPU 支持 VT 而且仅限于 I
  • 定位技术课程设计-微信小程序校园导游系统

    定位技术课程设计课程设计教学目的课程设计要求课程设计题目原题目拓展内容需求分析原理分析微信小程序API定位原理WIFI指纹定位原理路径规划算法调研详细设计总述主页面介绍学校简介页面介绍导引页面概述导引地图景点列表景点详细介绍页面搜索界面导航
  • 测试下几个网络相册

    1 百度相册外链分享 优点 国内站 速度快 可以批量上传 缺点 右下角会有水印 很是不爽 2 试下Photobucket 免费 无水印
  • 第一次CCF CSP认证体验

    今天是我第一次参加CCF CSP认证 虽然这已经是第十二次CCF认证了 感觉题目有点难欸 前面两道题暴力写完 然后看了第三题 哇 简直难写 第四题看了看 数据1e5条边 不会做 就写了一个暴力 希望能过点数据 第五题感觉像是一个动态规划 完
  • HTML(HBuilder)作业题10- 用户登录(jquery)

    问 简单的用户登录怎么弄 答 1 利用jquery 2 利用if 注释 用鼠标离开区域开始判断 可以自行尝试修改成click单击按钮 HBuilder
  • 【华为OD机试真题 Python】最多等和不相交连续子序

    前言 本专栏将持续更新互联网大厂机试真题 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于大厂机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun0
  • mmdetection常见报错以及解决方案汇总

    目录 1 MMCV 安装相关 1 MMCV 与 MMDetection 的兼容问题 ConvWS is already registered in conv layer AssertionError MMCV xxx is used but
  • MFC之AfxbeginThread 线程 创建、挂起、释放、结束、退出

    MFC之AfxbeginThread 线程 创建 挂起 释放 结束 退出 本文简单阐述了如何使用一个afxbeginthread创建一个线程 两种方法 使用默认设置 使用自主设置参数 以及一些如同 挂起 释放 边界锁等操作 h文件添加声明
  • 简单浅谈 电鱼机的脉宽、频率、占空比

    高频鱼机后级的脉宽 频率 占空比 以上三个参数很重要 它不仅是设计鱼机的主要参数 而且也是输出效果调整的最终目标 根据本人长时间玩高频机的一点点经验现向大家浅谈一下脉宽 频率 占空比与之高频鱼机的设计与最终输出效果的两者密切关系 首先说一下
  • 基于s5pv-210开发板 LCD驱动

    lcd硬件原理 利用液晶制成的显示器称为 LCD 依据驱动方式可分为静态驱动 简单矩阵驱动以及主动矩阵驱动 3 种 其中 简单矩阵型又可再细分扭转向列型 TN 和超扭转式向列型 STN 两种 而主动矩阵型则以薄膜式晶体管型 TFT 为主流