精华内容
下载资源
问答
  • LCD关闭

    2008-06-15 00:46:57
    众所周知,液晶显示屏的显示方式与CRT不一样,采用屏保程序不仅不会保护液晶屏,反而会降低液晶屏使用寿命,即使使用“空白”屏保也是一样,液晶屏的灯管仍然没有关闭。使用下面这个小工具就可以真正做到关闭液晶屏...
  • vc写的关闭显示器的小程序关闭显示器有利于节约用电,保护显示器
  • LCD驱动程序编写

    千次阅读 2019-01-10 16:12:00
    学习目标:编写LCD驱动程序,熟悉根据芯片手册分析时序图,配置寄存器,并测试LCD程序。 一、LCD驱动程序编写 步骤: 1)分配fb_info结构体 2)设置fb_info结构体  a. 固定参数  b. 可变参数  c. 操作函数...

    学习目标:编写LCD驱动程序,熟悉根据芯片手册分析时序图,配置寄存器,并测试LCD程序。

    一、LCD驱动程序编写

    步骤:

    1)分配fb_info结构体

    2)设置fb_info结构体

      a. 固定参数

      b. 可变参数

      c. 操作函数

       --设置调色板

      d. fb_info的其它成员

       --设置显存

    3)硬件相关的操作

      --配置GPIO用于用于LCD

      --根据手册设置LCD控制器寄存器

         --分配显存,并把地址告诉LCD控制器

    4)  注册fb_info结构体

    二、源码:

      1 #include <linux/module.h>
      2 #include <linux/kernel.h>
      3 #include <linux/errno.h>
      4 #include <linux/string.h>
      5 #include <linux/mm.h>
      6 #include <linux/slab.h>
      7 #include <linux/delay.h>
      8 #include <linux/fb.h>
      9 #include <linux/init.h>
     10 #include <linux/dma-mapping.h>
     11 #include <linux/interrupt.h>
     12 #include <linux/workqueue.h>
     13 #include <linux/wait.h>
     14 #include <linux/platform_device.h>
     15 #include <linux/clk.h>
     16 #include <asm/io.h>
     17 #include <asm/uaccess.h>
     18 #include <asm/div64.h>
     19 #include <asm/mach/map.h>
     20 #include <asm/arch/regs-lcd.h>
     21 #include <asm/arch/regs-gpio.h>
     22 #include <asm/arch/fb.h>
     23 
     24 //调色板
     25 static int s3c_lcdfb_setcolreg(unsigned int regno, unsigned int red,
     26                  unsigned int green, unsigned int blue,
     27                  unsigned int transp, struct fb_info *info);
     28 
     29 //lcd寄存器
     30 struct lcd_regs {
     31     unsigned long    lcdcon1;
     32     unsigned long    lcdcon2;
     33     unsigned long    lcdcon3;
     34     unsigned long    lcdcon4;
     35     unsigned long    lcdcon5;
     36     unsigned long    lcdsaddr1;
     37     unsigned long    lcdsaddr2;
     38     unsigned long    lcdsaddr3;
     39     unsigned long    redlut;
     40     unsigned long    greenlut;
     41     unsigned long    bluelut;
     42     unsigned long    reserved[9];
     43     unsigned long    dithmode;
     44     unsigned long    tpal;
     45     unsigned long    lcdintpnd;
     46     unsigned long    lcdsrcpnd;
     47     unsigned long    lcdintmsk;
     48     unsigned long    lpcsel;
     49 };
     50 
     51 static struct fb_ops s3c_lcdfb_ops = {
     52     .owner          = THIS_MODULE,
     53     .fb_setcolreg   = s3c_lcdfb_setcolreg, //设置调色板
     54     .fb_fillrect    = cfb_fillrect,
     55     .fb_copyarea    = cfb_copyarea,
     56     .fb_imageblit   = cfb_imageblit,
     57 };
     58 
     59 static struct fb_info *s3c_lcd;
     60 static volatile unsigned long *gpbcon;
     61 static volatile unsigned long *gpbdat;
     62 static volatile unsigned long *gpccon;
     63 static volatile unsigned long *gpdcon;
     64 static volatile unsigned long *gpgcon;
     65 static volatile struct lcd_regs* lcd_regs;
     66 static u32 pseudo_palette[16];
     67 
     68 /* from pxafb.c */
     69 static inline unsigned int chan_to_field(unsigned int chan, struct fb_bitfield *bf)
     70 {
     71     chan &= 0xffff;
     72     chan >>= 16 - bf->length;
     73     return chan << bf->offset;
     74 }
     75 
     76 //设置调色板,供内核使用
     77 static int s3c_lcdfb_setcolreg(unsigned int regno, unsigned int red,
     78                  unsigned int green, unsigned int blue,
     79                  unsigned int transp, struct fb_info *info)
     80 {
     81     unsigned int val;
     82     
     83     if (regno > 16)
     84         return 1;
     85 
     86     /* 用red,green,blue三原色构造出val,根据info结构体中设置的偏移,val最终是16位象素 */
     87     val  = chan_to_field(red,    &info->var.red);
     88     val |= chan_to_field(green, &info->var.green);
     89     val |= chan_to_field(blue,    &info->var.blue);
     90     
     91     //((u32 *)(info->pseudo_palette))[regno] = val;
     92     pseudo_palette[regno] = val;                     //val放到调色板数组中
     93     return 0;
     94 }
     95 
     96 static int lcd_init(void)
     97 {
     98     /* 1. 分配一个fb_info */
     99     s3c_lcd = framebuffer_alloc(0, NULL);
    100 
    101     /* 2. 设置 */
    102     /* 2.1 设置固定的参数 */
    103     strcpy(s3c_lcd->fix.id, "mylcd");
    104     s3c_lcd->fix.smem_len = 240*320*16/8;                 //显存的长度=分辨率*每象素字节数  每个像素用16位表示(5:6:5);
    105     s3c_lcd->fix.type     = FB_TYPE_PACKED_PIXELS;     //默认  
    106     s3c_lcd->fix.visual   = FB_VISUAL_TRUECOLOR; /* TFT 真彩色*/
    107     s3c_lcd->fix.line_length = 240*2;  //每行的长度,以字节为单位 
    108     
    109     /* 2.2 设置可变的参数 */
    110     s3c_lcd->var.xres           = 240;
    111     s3c_lcd->var.yres           = 320;
    112     s3c_lcd->var.xres_virtual   = 240;
    113     s3c_lcd->var.yres_virtual   = 320;
    114     s3c_lcd->var.bits_per_pixel = 16;  //每个象素使用多少位 16bit
    115 
    116     /* RGB:565 */
    117     s3c_lcd->var.red.offset     = 11;
    118     s3c_lcd->var.red.length     = 5;
    119     
    120     s3c_lcd->var.green.offset   = 5;
    121     s3c_lcd->var.green.length   = 6;
    122 
    123     s3c_lcd->var.blue.offset    = 0;
    124     s3c_lcd->var.blue.length    = 5;
    125 
    126     s3c_lcd->var.activate       = FB_ACTIVATE_NOW;//使设置的值立即生效
    127     
    128     
    129     /* 2.3 设置操作函数 */
    130     s3c_lcd->fbops              = &s3c_lcdfb_ops;
    131     
    132     /* 2.4 其他的设置 */
    133     s3c_lcd->pseudo_palette = pseudo_palette;//存放调色板所调颜色的数组
    134     //s3c_lcd->screen_base  = ;  /* 显存的虚拟地址 */ 
    135     s3c_lcd->screen_size   = 240*324*16/8;//显存的大小
    136 
    137     /* 3. 硬件相关的操作 */
    138     /* 3.1 配置GPIO用于LCD */
    139     gpbcon = ioremap(0x56000010, 8);
    140     gpbdat = gpbcon+1;
    141     gpccon = ioremap(0x56000020, 4);
    142     gpdcon = ioremap(0x56000030, 4);
    143     gpgcon = ioremap(0x56000060, 4);
    144 
    145     *gpccon  = 0xaaaaaaaa;   /* GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND */
    146     *gpdcon  = 0xaaaaaaaa;   /* GPIO管脚用于VD[23:8] */
    147     
    148     *gpbcon &= ~(3);  /* GPB0设置为输出引脚 */
    149     *gpbcon |= 1;
    150     *gpbdat &= ~1;     /* 输出低电平,关闭背光* */
    151 
    152     *gpgcon |= (3<<8); /* GPG4用作LCD_PWREN信号*/
    153     
    154     /* 3.2 根据LCD手册设置LCD控制器, 比如VCLK的频率等 */
    155     lcd_regs = ioremap(0x4D000000, sizeof(struct lcd_regs));
    156 
    157     /* bit[17:8]: VCLK = HCLK / [(CLKVAL+1) x 2], LCD手册P14
    158      *            10MHz(100ns) = 100MHz / [(CLKVAL+1) x 2]
    159      *            CLKVAL = 4
    160      * bit[6:5]: 0b11, TFT LCD
    161      * bit[4:1]: 0b1100, 16 bpp for TFT
    162      * bit[0]  : 0 = Disable the video output and the LCD control signal.
    163      */
    164     lcd_regs->lcdcon1  = (4<<8) | (3<<5) | (0x0c<<1);
    165 
    166 #if 1
    167     /* 垂直方向的时间参数
    168      * bit[31:24]: VBPD, VSYNC之后再过多长时间才能发出第1行数据
    169      *             LCD手册 T0-T2-T1=4
    170      *             VBPD=3
    171      * bit[23:14]: 多少行, 320, 所以LINEVAL=320-1=319
    172      * bit[13:6] : VFPD, 发出最后一行数据之后,再过多长时间才发出VSYNC
    173      *             LCD手册T2-T5=322-320=2, 所以VFPD=2-1=1
    174      * bit[5:0]  : VSPW, VSYNC信号的脉冲宽度, LCD手册T1=1, 所以VSPW=1-1=0
    175      */
    176     lcd_regs->lcdcon2  = (3<<24) | (319<<14) | (1<<6) | (0<<0);
    177 
    178 
    179     /* 水平方向的时间参数
    180      * bit[25:19]: HBPD, VSYNC之后再过多长时间才能发出第1行数据
    181      *             LCD手册 T6-T7-T8=17
    182      *             HBPD=16
    183      * bit[18:8]: 多少列, 240, 所以HOZVAL=240-1=239
    184      * bit[7:0] : HFPD, 发出最后一行里最后一个象素数据之后,再过多长时间才发出HSYNC
    185      *             LCD手册T8-T11=251-240=11, 所以HFPD=11-1=10
    186      */
    187     lcd_regs->lcdcon3 = (16<<19) | (239<<8) | (10<<0);
    188 
    189     /* 水平方向的同步信号
    190      * bit[7:0]    : HSPW, HSYNC信号的脉冲宽度, LCD手册T7=5, 所以HSPW=5-1=4
    191      */    
    192     lcd_regs->lcdcon4 = 4;
    193 //lcd寄存器配置的另一种写法
    194 #else 
    195 lcd_regs->lcdcon2 =    S3C2410_LCDCON2_VBPD(5) | \
    196         S3C2410_LCDCON2_LINEVAL(319) | \
    197         S3C2410_LCDCON2_VFPD(3) | \
    198         S3C2410_LCDCON2_VSPW(1);
    199 
    200 lcd_regs->lcdcon3 =    S3C2410_LCDCON3_HBPD(10) | \
    201         S3C2410_LCDCON3_HOZVAL(239) | \
    202         S3C2410_LCDCON3_HFPD(1);
    203 
    204 lcd_regs->lcdcon4 =    S3C2410_LCDCON4_MVAL(13) | \
    205         S3C2410_LCDCON4_HSPW(0);
    206 
    207 #endif
    208     /* 信号的极性 
    209      * bit[11]: 1=565 format
    210      * bit[10]: 0 = The video data is fetched at VCLK falling edge
    211      * bit[9] : 1 = HSYNC信号要反转,即低电平有效 
    212      * bit[8] : 1 = VSYNC信号要反转,即低电平有效 
    213      * bit[6] : 0 = VDEN不用反转
    214      * bit[3] : 0 = PWREN输出0
    215      * bit[1] : 0 = BSWP
    216      * bit[0] : 1 = HWSWP 2440手册P413
    217      */
    218     lcd_regs->lcdcon5 = (1<<11) | (0<<10) | (1<<9) | (1<<8) | (1<<0);
    219     
    220     /* 3.3 分配显存(framebuffer), 并把地址告诉LCD控制器 */
    221     s3c_lcd->screen_base = dma_alloc_writecombine(NULL, s3c_lcd->fix.smem_len, &s3c_lcd->fix.smem_start, GFP_KERNEL);
    222     
    223     lcd_regs->lcdsaddr1  = (s3c_lcd->fix.smem_start >> 1) & ~(3<<30);  //对应内存起始地址的 A[30:1] ,则起始地址右移1位,&0x3fffffff 共30位
    224     lcd_regs->lcdsaddr2  = ((s3c_lcd->fix.smem_start + s3c_lcd->fix.smem_len) >> 1) & 0x1fffff;
    225     lcd_regs->lcdsaddr3  = (240*16/16);  /* 一行的长度(单位: 2字节) */    
    226     
    227     //s3c_lcd->fix.smem_start = xxx;  /* 显存的物理地址 */
    228     /* 启动LCD */
    229     lcd_regs->lcdcon1 |= (1<<0); /* 使能LCD控制器 */
    230     lcd_regs->lcdcon5 |= (1<<3); /* 使能LCD本身 */
    231     *gpbdat |= 1;     /* 输出高电平, 使能背光 */        
    232 
    233     /* 4. 注册 */
    234     register_framebuffer(s3c_lcd);    
    235     return 0;
    236 }
    237 static void lcd_exit(void)
    238 {
    239     unregister_framebuffer(s3c_lcd);
    240     lcd_regs->lcdcon1 &= ~(1<<0); /* 关闭LCD本身 */
    241     *gpbdat &= ~1;     /* 关闭背光 */
    242     dma_free_writecombine(NULL, s3c_lcd->fix.smem_len, s3c_lcd->screen_base, s3c_lcd->fix.smem_start);//3为虚拟地址
    243     iounmap(lcd_regs);
    244     iounmap(gpbcon);
    245     iounmap(gpccon);
    246     iounmap(gpdcon);
    247     iounmap(gpgcon);
    248     framebuffer_release(s3c_lcd);
    249 }
    250 module_init(lcd_init);
    251 module_exit(lcd_exit);
    252 MODULE_LICENSE("GPL");

    LCD寄存器配置分析:

    1、lcdcon1 寄存器配置

    1  /* bit[17:8]: VCLK = HCLK / [(CLKVAL+1) x 2], LCD手册P14
    2   *            10MHz(100ns) = 100MHz / [(CLKVAL+1) x 2]
    3   *            CLKVAL = 4
    4   * bit[6:5]: 0b11, TFT LCD
    5   * bit[4:1]: 0b1100, 16 bpp for TFT
    6   * bit[0]  : 0 = Disable the video output and the LCD control signal.
    7   */
    8  lcd_regs->lcdcon1  = (4<<8) | (3<<5) | (0x0c<<1);

    查看2440说明书,找到lcdcon1 寄存器,确定每一位的取值:

    1)bit[17:8]  VCLK = HCLK / [(CLKVAL+1) x 2]计算CLKVAL的值,首先使用# dmesg命令查看内核打印信息,获取HCLK为100MHz。

    查看液晶屏的芯片手册Clock cycle time 可知:VCLK = 100ns ==> 10MHz,从而可知 10=100/[(CLKVAL+1) x 2]==> CLKVAL=4   bit[17:8]就是4;

    2)bit[6:5]: 0b11, TFT LCD;

    3)bit[0]  : 0  LCD信号输出使能位禁止。

    2、lcdcon2 

     1    /* 垂直方向的时间参数
     2       * bit[31:24]: VBPD, VSYNC之后再过多长时间才能发出第1行数据
     3       *             LCD手册 T0-T2-T1=4
     4       *             VBPD=3
     5       * bit[23:14]: 多少行, 320, 所以LINEVAL=320-1=319
     6       * bit[13:6] : VFPD, 发出最后一行数据之后,再过多长时间才发出VSYNC
     7       *             LCD手册T2-T5=322-320=2, 所以VFPD=2-1=1
     8       * bit[5:0]  : VSPW, VSYNC信号的脉冲宽度, LCD手册T1=1, 所以VSPW=1-1=0
     9 */
    10      lcd_regs->lcdcon2  = (3<<24) | (319<<14) | (1<<6) | (0<<0);

    lcdcon2 寄存器,确定每一位的取值:

    1) * bit[31:24]: 垂直方向的时间参数 VBPD, 即VSYNC之后再过多长时间才能发出第1行数据。

    查看2440 LCD控制器的手册:

     根据LCD的芯片手册:
     时间表:

    由上图可知:
    VSPW+1=T1 ;  VBPD+1=T0-T2-T1;  则VSPW=0,VBPD=3;
    2) bit[23:14]: 多少行, 320, 所以LINEVAL=320-1=319
    3) bit[13:6] : VFPD, 发出最后一行数据之后,再过多长时间才发出VSYNC
                        VFPD+1=T2-T5=322-320, VFPD=1
    4) bit[5:0]  : VSPW, VSYNC信号的脉冲宽度, VSPW=0。
     
    3、lcdcon3
     /* 水平方向的时间参数
    寄存器lcdcon3:
    时序图:
     
    LCD芯片手册时序图:
     
    1) bit[25:19]: HBPD, VSYNC之后再过多长时间才能发出第1行数据
      HSPW+1=T7;则HSPW=4;
      HBPD+1= T6-T7-T8=17,HBPD=16;
    2)  bit[18:8]: 多少列, 240, 所以HOZVAL=240-1=239
    3)  bit[7:0] : HFPD, 发出最后一行里最后一个象素数据之后,再过多长时间才发出HSYNC
      HFPD+1=T8-T11=251-240=11, 所以HFPD=10
    4、lcdcon4
    寄存器:
      /* 水平方向的同步信号
      * bit[7:0] : HSPW, HSYNC信号的脉冲宽度,HSPW+1=T7,HSPW=4
      */ 

     三、编译测试

     第一种方法:

    1) make menuconfig去掉原来的驱动程序

      -->Device Drivers

           -->Graphics support

             <M>S3C2410 LCD framebuffer support

     2) 编译内核和模块 

        # make uImage

        # make modules //把用到的程序编译成模块运行

    3)编译lcd驱动为模块,将生成的lcd.ko和driver/video目录下用到的cfbcopyarea.ko、cfbfillrect.ko、 cfbimgblt.ko (lcd驱动程序中的fb_ops会用到)拷贝到/work/nfs_root/first_fs/lcd_test目录下。

    4) 烧写uImage并启动开发板,并加载模块:

    # nfs 30000000 10.70.12.103:/work/nfs_root/uImage_nolcd  

    # bootm 30000000
    挂载:
    (# ifconfig eth0 10.70.12.168 配置网卡eth0的ip)
    # mount -t nfs -o nolock,vers=2 10.70.12.103:/work/nfs_root/ /mnt
    # cd /mnt/first_fs/lcd_test/
    加载驱动: 

    # insmod cfbcopyarea.ko 

    # insmod cfbfillrect.ko

    # insmod cfbimgblt.ko

    # insmod lcd.ko

    使用# ls /dev/fb* ,可以看到设备节点:/dev/fb0.

    5) echo hello > /dev/tty1  // 可以在LCD上看见hello

        cat lcd.ko > /dev/fb0   // 花屏 

    第二种测试方法:

    1)修改/etc/inittab (添加:tty1::askfirst:-/bin/sh) 输出到tty1(对应为显示屏)//将/bin/sh信息输出到tty1中;

    类似于:s3c2410_serial0::askfirst:-/bin/sh 输出到串口。

    用新内核重启开发板

    insmod cfbcopyarea.ko

    insmod cfbfillrect.ko

    insmod cfbimgblt.ko

    insmod lcd.ko

    insmod buttons.ko

    可以看到Please。。。。。。。。。等一行字符

    接着,将以前的USB键盘驱动,加载:# insmod ../usb_keyboard.ko

     插上键盘后,可以在LCD显示终端控制信息:

    转载于:https://www.cnblogs.com/lxl-lennie/p/10250623.html

    展开全文
  • Lcd驱动程序

    2013-10-03 16:45:50
    Lcd驱动程序 怎么写LCD驱动程序? 1. 分配一个fb_info结构体: framebuffer_alloc 2. 设置 3. 注册: register_framebuffer 4. 硬件相关的操作 #include #include ..................................... ...

                                                       Lcd驱动程序

    怎么写LCD驱动程序?
    1. 分配一个fb_info结构体: framebuffer_alloc
    2. 设置
    3. 注册: register_framebuffer
    4. 硬件相关的操作

    #include <linux/module.h>
    #include <linux/kernel.h>

    .....................................


    struct lcd_regs {

    unsigned long lcdcon1;
    unsigned long lcdcon2;
    unsigned long lcdcon3;
    unsigned long lcdcon4;
    unsigned long lcdcon5;
        unsigned long lcdsaddr1;
        unsigned long lcdsaddr2;
        unsigned long lcdsaddr3;
        unsigned long redlut;
        unsigned long greenlut;
        unsigned long bluelut;
        unsigned long reserved[9];
        unsigned long dithmode;
        unsigned long tpal;
        unsigned long lcdintpnd;
        unsigned long lcdsrcpnd;
        unsigned long lcdintmsk;
        unsigned long lpcsel;

    };

    static struct fb_info *s3c_lcd;
    static volatile unsigned long *gpbcon;
    static volatile unsigned long *gpbdat;
    static volatile unsigned long *gpccon;
    static volatile unsigned long *gpdcon;
    static volatile unsigned long *gpgcon;
    static volatile struct lcd_regs* lcd_regs;
    static u32 pseudo_palette[16];

    /* from pxafb.c */
    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 s3c_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 s3c_lcdfb_ops = {
    .owner = THIS_MODULE,
    .fb_setcolreg = s3c_lcdfb_setcolreg,
    .fb_fillrect = cfb_fillrect,
    .fb_copyarea = cfb_copyarea,
    .fb_imageblit = cfb_imageblit,
    };

    static int lcd_init(void)
    {
    /* 1. 分配一个fb_info */
    s3c_lcd = framebuffer_alloc(0, NULL);

    /* 2. 设置 */
    /* 2.1 设置固定的参数 */
    strcpy(s3c_lcd->fix.id, "mylcd");
    s3c_lcd->fix.smem_len = 480*272*16/8;
    s3c_lcd->fix.type     = FB_TYPE_PACKED_PIXELS;
    s3c_lcd->fix.visual   = FB_VISUAL_TRUECOLOR; /* TFT */
    s3c_lcd->fix.line_length = 480*2;

    /* 2.2 设置可变的参数 */
    s3c_lcd->var.xres           = 480;
    s3c_lcd->var.yres           = 272;
    s3c_lcd->var.xres_virtual   = 480;
    s3c_lcd->var.yres_virtual   = 272;
    s3c_lcd->var.bits_per_pixel = 16;

    /* RGB:565 */
    s3c_lcd->var.red.offset     = 11;
    s3c_lcd->var.red.length     = 5;

    s3c_lcd->var.green.offset   = 5;
    s3c_lcd->var.green.length   = 6;

    s3c_lcd->var.blue.offset    = 0;
    s3c_lcd->var.blue.length    = 5;

    s3c_lcd->var.activate       = FB_ACTIVATE_NOW;

    /* 2.3 设置操作函数 */
    s3c_lcd->fbops              = &s3c_lcdfb_ops;

    /* 2.4 其他的设置 */
    s3c_lcd->pseudo_palette = pseudo_palette;
    //s3c_lcd->screen_base  = ;  /* 显存的虚拟地址 */ 
    s3c_lcd->screen_size   = 480*272*16/8;


    /* 3. 硬件相关的操作 */
    /* 3.1 配置GPIO用于LCD */
    gpbcon = ioremap(0x56000010, 8);
    gpbdat = gpbcon+1;
    gpccon = ioremap(0x56000020, 4);
    gpdcon = ioremap(0x56000030, 4);
    gpgcon = ioremap(0x56000060, 4);

        *gpccon  = 0xaaaaaaaa;   /* GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND */
    *gpdcon  = 0xaaaaaaaa;   /* GPIO管脚用于VD[23:8] */

    *gpbcon &= ~(3);  /* GPB0设置为输出引脚 */
    *gpbcon |= 1;
    *gpbdat &= ~1;     /* 输出低电平 */

    *gpgcon |= (3<<8); /* GPG4用作LCD_PWREN */

    /* 3.2 根据LCD手册设置LCD控制器, 比如VCLK的频率等 */
    lcd_regs = ioremap(0x4D000000, sizeof(struct lcd_regs));

    /* bit[17:8]: VCLK = HCLK / [(CLKVAL+1) x 2], LCD手册P14
    *            10MHz(100ns) = 100MHz / [(CLKVAL+1) x 2]
    *            CLKVAL = 4
    * bit[6:5]: 0b11, TFT LCD
    * bit[4:1]: 0b1100, 16 bpp for TFT
    * bit[0]  : 0 = Disable the video output and the LCD control signal.
    */
    lcd_regs->lcdcon1  = (4<<8) | (3<<5) | (0x0c<<1);

    #if 1
    /* 垂直方向的时间参数
    * bit[31:24]: VBPD, VSYNC之后再过多长时间才能发出第1行数据
    *             LCD手册 T0-T2-T1=4
    *             VBPD=3
    * bit[23:14]: 多少行, 320, 所以LINEVAL=320-1=319
    * bit[13:6] : VFPD, 发出最后一行数据之后,再过多长时间才发出VSYNC
    *             LCD手册T2-T5=322-320=2, 所以VFPD=2-1=1
    * bit[5:0]  : VSPW, VSYNC信号的脉冲宽度, LCD手册T1=1, 所以VSPW=1-1=0
    */
    lcd_regs->lcdcon2  = (1<<24) | (271<<14) | (1<<6) | (9);

    /* 水平方向的时间参数
    * bit[25:19]: HBPD, VSYNC之后再过多长时间才能发出第1行数据
    *             LCD手册 T6-T7-T8=17
    *             HBPD=16
    * bit[18:8]: 多少列, 240, 所以HOZVAL=240-1=239
    * bit[7:0] : HFPD, 发出最后一行里最后一个象素数据之后,再过多长时间才发出HSYNC
    *             LCD手册T8-T11=251-240=11, 所以HFPD=11-1=10
    */
    lcd_regs->lcdcon3 = (1<<19) | (479<<8) | (1);

    /* 水平方向的同步信号
    * bit[7:0] : HSPW, HSYNC信号的脉冲宽度, LCD手册T7=5, 所以HSPW=5-1=4
    */
    lcd_regs->lcdcon4 = 40;

    #else
    lcd_regs->lcdcon2 = S3C2410_LCDCON2_VBPD(5) | \
    S3C2410_LCDCON2_LINEVAL(319) | \
    S3C2410_LCDCON2_VFPD(3) | \
    S3C2410_LCDCON2_VSPW(1);


    lcd_regs->lcdcon3 = S3C2410_LCDCON3_HBPD(10) | \
    S3C2410_LCDCON3_HOZVAL(239) | \
    S3C2410_LCDCON3_HFPD(1);

    lcd_regs->lcdcon4 = S3C2410_LCDCON4_MVAL(13) | \
    S3C2410_LCDCON4_HSPW(0);

    #endif
    /* 信号的极性 
    * bit[11]: 1=565 format
    * bit[10]: 0 = The video data is fetched at VCLK falling edge
    * bit[9] : 1 = HSYNC信号要反转,即低电平有效 
    * bit[8] : 1 = VSYNC信号要反转,即低电平有效 
    * bit[6] : 0 = VDEN不用反转
    * bit[3] : 0 = PWREN输出0
    * bit[1] : 0 = BSWP
    * bit[0] : 1 = HWSWP 2440手册P413
    */
    lcd_regs->lcdcon5 = (1<<11) | (0<<10) | (1<<9) | (1<<8) | (1<<0);

    /* 3.3 分配显存(framebuffer), 并把地址告诉LCD控制器 */
    s3c_lcd->screen_base = dma_alloc_writecombine(NULL, s3c_lcd->fix.smem_len, &s3c_lcd->fix.smem_start, GFP_KERNEL);

    lcd_regs->lcdsaddr1  = (s3c_lcd->fix.smem_start >> 1) & ~(3<<30);
    lcd_regs->lcdsaddr2  = ((s3c_lcd->fix.smem_start + s3c_lcd->fix.smem_len) >> 1) & 0x1fffff;
    lcd_regs->lcdsaddr3  = (480*16/16);  /* 一行的长度(单位: 2字节) */

    //s3c_lcd->fix.smem_start = xxx;  /* 显存的物理地址 */
    /* 启动LCD */
    lcd_regs->lcdcon1 |= (1<<0); /* 使能LCD控制器 */
    lcd_regs->lcdcon5 |= (1<<3); /* 使能LCD本身 */
    *gpbdat |= 1;     /* 输出高电平, 使能背光 */

    /* 4. 注册 */
    register_framebuffer(s3c_lcd);

    return 0;
    }

    static void lcd_exit(void)
    {
    unregister_framebuffer(s3c_lcd);
    lcd_regs->lcdcon1 &= ~(1<<0); /* 关闭LCD本身 */
    *gpbdat &= ~1;     /* 关闭背光 */
    dma_free_writecombine(NULL, s3c_lcd->fix.smem_len, s3c_lcd->screen_base, s3c_lcd->fix.smem_start);
    iounmap(lcd_regs);
    iounmap(gpbcon);
    iounmap(gpccon);
    iounmap(gpdcon);
    iounmap(gpgcon);
    framebuffer_release(s3c_lcd);
    }

    module_init(lcd_init);
    module_exit(lcd_exit);
    MODULE_LICENSE("GPL");

    测试:
    1. make menuconfig去掉原来的驱动程序
    -> Device Drivers
      -> Graphics support
    <M> S3C2410 LCD framebuffer support

    2. make uImage
       make modules  

    3. 使用新的uImage启动开发板:

    4. insmod cfbcopyarea.ko 
    insmod cfbfillrect.ko 
    insmod cfbimgblt.ko 
    insmod lcd.ko

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

    5. 修改 /etc/inittab\
    tty1::askfirst:-/bin/sh
    用新内核重启开发板

    insmod cfbcopyarea.ko 
    insmod cfbfillrect.ko 
    insmod cfbimgblt.ko 
    insmod lcd.ko
    insmod buttons.ko

    展开全文
  • LCD裸机驱动程序总结: LCD裸机驱动程序流程: 一、LCD初始化: 1、端口初始化:设置GPC和GPD为LCD输出端口模式 2、显示模式初始化: LCDCON1:选择BBP(位每像素)模式、选择显示模式、决定VLCK频率 LCDCON...

    LCD裸机驱动程序总结:

    LCD裸机驱动程序流程:
    一、LCD初始化:
       1、端口初始化:设置GPC和GPD为LCD输出端口模式
       2、显示模式初始化:
           LCDCON1:选择BBP(位每像素)模式、选择显示模式、决定VLCK频率
           LCDCON2:bit[31:24](1:VPBD)、bit[23:14](320-1:行数)、bit[13:6](5:VFPD)、bit[5:0](1:VSPW)
           LCDCON3:bit[25:19](36:HBPD);bit[18:8](240-1:列数);bit[7:0](19:HFPD)
           LCDCON4:bit[15:8](13:MVAL,只有当LCDCON1 bit[7]MMODE=1才有效);bit[7:0](5:HSPW)
           LCDCON5:bit[11](5:6:5 Format)
       3、帧缓初始化:设置帧缓冲器的起始地址、结束地址、虚拟屏
       4、LCD其他杂项设置:屏蔽中断、调色板、禁止LPC3600/LCC3600模式
       5、LCD开启和关闭:LCDCON1的第0位置1即可开启LCD
    二、LCD显示:由于一帧中有240*320个像素点,每个像素点都有一个值(0-255),那么把每个像素点的值送到帧缓冲器中,即可实现显示功能。 如果想显示图片的话,需要把一张图片转化成数据,然后在程序中把每一个像素点送到帧缓冲器即可。

    源程序:

    //Main.c

    /*************************************************
    实验环境:mini2440开发板
    完成时间:2011,4,15
    作者:阿龍
    实现功能:在LCD上进行显示
    遇到的问题:
    **************************************************/
    #define GLOBAL_CLK  1
    #include <stdlib.h>
    #include <string.h>
    #include "def.h"
    #include "option.h"
    #include "2440addr.h"
    #include "2440lib.h"
    #include "2440slib.h"
    #include "mmu.h"
    #include "profile.h"
    #include "memtest.h"

    #define CLKVAL 4
    #define LCD_LONG 320
    #define LCD_WIDTH 240

    #define LINEVAL LCD_LONG-1
    #define LCD_YSIZE LCD_LONG
    #define LCD_XSIZE LCD_WIDTH

    #define LCD_UPPER_MARGIN 1
    #define LCD_LOWER_MARGIN 5
    #define LCD_VSYNC_LEN 1

    #define LCD_RIGHT_MARGIN 39
    #define LCD_LEFT_MARGIN 16
    #define LCD_HSYNC_LEN 5

    #define SCR_XSIZE LCD_XSIZE
    #define SCR_YSIZE LCD_YSIZE
    volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];

    #define LCD_ADDR ((U32)LCD_BUFFER)
    #define M5D(n) ((n)&0x1fffff)

    #define PAGEWIDE LCD_WIDTH
    #define OFFSIZE 0

    #define LCD_RIGHT_MARGIN 39
    #define LCD_LEFT_MARGIN 16
    #define LCD_HSYNC_LEN 5
    #define ADC_FREQ 2500000
    extern unsigned char sunflower_240x320[];
    /**************************************************
    函数声明
    ***************************************************/
    void delay(int times);
    void LCD_init(void);
    void LCD_port_init(void);
    void DisM_init(void);
    void FraBuf_init(void);
    void MASK(void);
    static void Lcd_EnvidOnOff(int num);
    void TFT_LCD_Show(void);
    static void Lcd_ClearScr(U16 c);
    static void Pait_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp);
    void Set_Clk(void);
    static void cal_cpu_bus_clk(void);
    /**************************************************
    主函数
    ***************************************************/
    void Main(void)
    {
     /*时钟初始化*/
     Set_Clk();
     //MMU_Init();  //不能用MMU_Init()
     /*LCD初始化*/
     LCD_init();
     /*LCD显示*/
     TFT_LCD_Show();
     }
    void delay(int times)
    {
     int x,y;
     for(x=times;x>0;x--)
      for(y=400;y>0;y--);
    }
    /*********************************************************
    LCD初始化
    **********************************************************/
    void LCD_init(void)
    {
     /*LCD端口初始化*/
     LCD_port_init();
     /*显示模式初始化*/
     DisM_init();
     /*LCD帧缓冲初始化*/
     FraBuf_init();
     /*LCD其他杂项屏蔽和处理*/ 
     MASK();
     /*LCD开启和关闭*/
     Lcd_EnvidOnOff(1); 
    }
    /**************************************************
    LCD端口初始化
    ***************************************************/
    void LCD_port_init(void)
    {
     rGPCCON = 0xaaaa02a8;  //设置GPC为LCD模式
     rGPCUP = 0xffffffff;
     rGPDCON =0xaaaaaaa;
     rGPCUP =0xffffffff;
    }
    /*********************************************************
    LCD显示模式初始化
    **********************************************************/
    void DisM_init(void)
    {
     /*bit[17:8](4:CLKVAL);bit[6:5](11:TFT LCD panel);bit[4:1](1100:16 bpp for TFT)*/
     rLCDCON1 = (12<<1)|(3<<5)|(CLKVAL<<8);   //选择BBP(位每像素)模式、选择显示模式、决定VCLK频率
     /*bit[31:24](1:VBPD);bit[23:14](320-1:行数);bit[13:6](5:VFPD);bit[5:0](1:VSPW)*/
     rLCDCON2 = (LCD_UPPER_MARGIN<<24)|((LCD_YSIZE-1)<<14)|(LCD_LOWER_MARGIN<<6)|(LCD_VSYNC_LEN<<0);
     /*bit[25:19](36:HBPD);bit[18:8](240-1:列数);bit[7:0](19:HFPD)*/
     rLCDCON3 = (LCD_RIGHT_MARGIN <<19)|((LCD_XSIZE-1)<<8)|(LCD_LEFT_MARGIN<<0);
     /*bit[15:8](13:MVAL,只有当LCDCON1 bit[7]MMODE=1才有效);bit[7:0](5:HSPW)*/
     rLCDCON4 = (13<<8)|(LCD_HSYNC_LEN<<0);
     /*bit[11](5:6:5 Format);bit[9](VLINE/HSYNC polarity inverted);bit[8](VFRAME/VSYNC inverted)
      bit[3](Enalbe PWERN signal),bit[1](half-word swap control bit)*/
     rLCDCON5 = (1<<0)|(1<<3)|(1<<8)|(1<<9)|(1<<11); 
    }
    /*********************************************************
    LCD帧缓存寄存器初始化
    **********************************************************/
    void FraBuf_init(void)
    {
     /* LCDBANK: 视频帧缓冲区内存地址30-22位。     LCDBASEU: 视频帧缓冲区的开始地址21-1位

    LCDBASEL: 视频帧缓冲区的结束地址21-1位*/
     /*bit[29:21]:LCDBANK,bit[20:0]:LCDBASEU*/
     rLCDSADDR1 = ((LCD_ADDR>>22)<<21)|((M5D(LCD_ADDR>>1))<<0);
     /*bit[20:0]:LCDBASEL*/
     rLCDSADDR2 = M5D((LCD_ADDR+LCD_WIDTH * LCD_LONG * 2)>>1);
     /*PAGEWIDTH:虚拟屏幕一行的字节数,如果不使用虚拟屏幕,设置为实际屏幕的行字节数
       OFFSIZE:虚拟屏幕左侧偏移的字节数,如果不使用虚拟屏幕,设置为*/
     /*bit[21:11]:OFFSIZE; bit[10:0]:PAGEWIDTH*/
     rLCDSADDR3 = LCD_WIDTH;
    }
    /*********************************************************
    对LCD其他的一些屏蔽和处理
    **********************************************************/
    void MASK(void)
    {
     /*屏蔽中断*/
     rLCDINTMSK |= 3;
     rTCONSEL   &= (~7);
     
     /*disable调色板*/
     rTPAL = 0x0;
        
     /*禁止LPC3600/LCC3600模式*/
     rTCONSEL &= ~((1<<4) | 1);  
    }
    /*********************************************************
    LCD的开启与关闭函数
    **********************************************************/
    static void Lcd_EnvidOnOff(int onoff)
    {
     if(onoff==1)
        rLCDCON1|=1; // ENVID=ON
     else
        rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
    }
    /*********************************************************
    LCD显示函数
    **********************************************************/
    void TFT_LCD_Show(void)

        /*红(255:0:0);绿(0:255:0);蓝(0:0:255);黑(0:0:0);白(255,255,255)*/
         /*在屏幕上显示三基色*/
        Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00)  )  ;  //clear screen black
        delay(10000);
        Lcd_ClearScr((0x1f<<11) | (0x00<<5) | (0x00));   //red
        delay(10000);
         Lcd_ClearScr((0x00<<11) | (0x3f<<5) | (0x00));   //green
        delay(10000);
        Lcd_ClearScr((0x00<<11) | (0x00<<5) | (0x1f));   //blue
        delay(10000);

        Lcd_ClearScr( (0x1f<<11) | (0x3f<<5) | (0x1f)  )  ;  //clear screen white
        delay(10000);
        /*显示一副图片在屏幕上*/
        Pait_Bmp(0, 0, 240, 320, sunflower_240x320);
    }
    /*********************************************************
    LCD全屏填充颜色函数
    **********************************************************/
    static void Lcd_ClearScr(U16 c)
    {
     unsigned int x,y;
     for(y=0;y<SCR_YSIZE;y++)
     for(x=0;x<SCR_XSIZE;x++)
     {
       LCD_BUFFER[y][x]=c;    //把得到的值送到缓冲器中即可显示颜色
      }
    }
    /*在屏幕上显示图片*/
    static void Pait_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp)
    {
        int x,y;
        U32 c;
        int p = 0;
        for( y = 0 ; y < l ; y++ )
        {
         for( x = 0 ; x < h ; x++ )
         {
             c = bmp[p+1] | (bmp[p]<<8) ;

             if ( ( (x0+x) < SCR_XSIZE) && ( (y0+y) < SCR_YSIZE) )
             LCD_BUFFER[y0+y][x0+x] = c ;  

            p=p+2;   

    }
        }
    }
    /*************************************************
    时钟频率设置
    **************************************************/
    void Set_Clk(void)
    {
     int i;
     U8 key;
     U32 mpll_val = 0 ;
     i = 2 ;              //don't use 100M!
                       //boot_params.cpu_clk.val = 3;
     switch ( i ) {
     case 0: //200
      key = 12;
      mpll_val = (92<<12)|(4<<4)|(1);
      break;
     case 1: //300
      key = 13;
      mpll_val = (67<<12)|(1<<4)|(1);
      break;
     case 2: //400
      key = 14;
      mpll_val = (92<<12)|(1<<4)|(1);
      break;
     case 3: //440!!!
      key = 14;
      mpll_val = (102<<12)|(1<<4)|(1);
      break;
     default:
      key = 14;
      mpll_val = (92<<12)|(1<<4)|(1);
      break;
     }
      //init FCLK=400M, so change MPLL first
     ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);   //set the register--rMPLLCON
     ChangeClockDivider(key, 12);    //the result of rCLKDIVN [0:1:0:1] 3-0 bit
     cal_cpu_bus_clk();    //HCLK=100M   PCLK=50M
    }
    /*************************************************
    **************************************************/
    static void cal_cpu_bus_clk(void)
    {
     static U32 cpu_freq;
        static U32 UPLL;
      U32 val;
     U8 m, p, s;
      val = rMPLLCON;
     m = (val>>12)&0xff;
     p = (val>>4)&0x3f;
     s = val&3;

     //(m+8)*FIN*2 不要超出32位数!
     FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;     //FCLK=400M  FIN=12000000
     val = rCLKDIVN;
     m = (val>>1)&3;
     p = val&1; 
     val = rCAMDIVN;
     s = val>>8;
      switch (m) {
     case 0:
      HCLK = FCLK;
      break;
     case 1:
      HCLK = FCLK>>1;
      break;
     case 2:
      if(s&2)
       HCLK = FCLK>>3;
      else
       HCLK = FCLK>>2;
      break;
     case 3:
      if(s&1)
       HCLK = FCLK/6;
      else
       HCLK = FCLK/3;
      break;
     }
      if(p)
      PCLK = HCLK>>1;
     else
      PCLK = HCLK;
     if(s&0x10)
      cpu_freq = HCLK;
     else
      cpu_freq = FCLK;
     val = rUPLLCON;
     m = (val>>12)&0xff;
     p = (val>>4)&0x3f;
     s = val&3;
     UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
     UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
    }
      

    展开全文
  • LCD1602程序

    2016-09-15 22:40:54
    /******lcd.h*******/ #ifndef _LCD_H_ #define _LCD_H_ #include #include "../delay/delay.h" #define LCDPORT P0 #define LCD_WRITE_DATA 1 #define LCD_WRITE_COM 0 sbit RS = P2^4; sbit RW = P2^5; sbit
    #ifndef _LCD_H_
    #define _LCD_H_
    
    #include <reg52.h>
    #include "../delay/delay.h"
    
    #define LCDPORT P0
    #define LCD_WRITE_DATA 1
    #define LCD_WRITE_COM 0
    
    sbit RS = P2^4;
    sbit RW = P2^5;
    sbit E = P2^6;
    
    extern void lcd_write(unsigned char byte, unsigned char flag);
    extern void lcd_init();
    extern void lcd_dis_char(unsigned char x, unsigned char y, unsigned char byte);
    extern void lcd_dis_str(unsigned char x, unsigned char y, unsigned char *src);
    
    #endif
    
    
    
    
    #include "lcd.h"
    
    /*------------------------------------------------
                      LCD初始化函数
    ------------------------------------------------*/
    void lcd_init()
    {
        delay_ms(15);
    
    	lcd_write(0x38,LCD_WRITE_COM);		 //设置8位数据接口两行显示(5 * 7 点阵字符)
    	delay_ms(15);
    	lcd_write(0x38,LCD_WRITE_COM);
    	delay_ms(15);
    	lcd_write(0x38,LCD_WRITE_COM);
    	delay_ms(15);
    	lcd_write(0x38,LCD_WRITE_COM);
    	delay_ms(15);
    
    	lcd_write(0x08,LCD_WRITE_COM);		 //关闭显示,关闭光标和闪烁
        delay_ms(5);						 
    	lcd_write(0x01,LCD_WRITE_COM);		 //清屏
        delay_ms(5);
    	lcd_write(0x06,LCD_WRITE_COM);		 //设置指针方式,画面平移
        delay_ms(5);
    	lcd_write(0x0c,LCD_WRITE_COM);		 //设置指针方式,画面不平移
        delay_ms(5);
    }
    
    /*------------------------------------------------
                      写入命令函数
    ------------------------------------------------*/
    void lcd_write(unsigned char byte, unsigned char flag)
    {
        if(1 == flag)
    	{
            RS = LCD_WRITE_DATA;	  //选择输入数据为数据
    	}
    	else
    	{
    	    RS = LCD_WRITE_COM;	      //选择输入数据为指令
    	}
    				    
    	RW = 0;					      //写
    	E = 1;					      //选中LCD
    	LCDPORT = byte;			   
    	delay_us(5);			      //稳定性考虑
    	E = 0;					      //失能LCD
    }
    
    /*------------------------------------------------
                      显示一个字节
    ------------------------------------------------*/
    void lcd_dis_char(unsigned char x, unsigned char y, unsigned char byte)
    {
      	if(0 == y)//确定显示的列(0 - 1)
    	{
    	    lcd_write(0x80 + x - 1, LCD_WRITE_COM);
    		lcd_write(byte, LCD_WRITE_DATA);
    	}
    	else
    	{
           lcd_write(0x80 + 0x40 + x - 1, LCD_WRITE_COM);
    		lcd_write(byte, LCD_WRITE_DATA);
    	}
    }
    
    /*------------------------------------------------
                       显示字符串
    ------------------------------------------------*/
    void lcd_dis_str(unsigned char x, unsigned char y, unsigned char *src)
    {
    	if(y == 0)//确定显示的列(0 - 1)
    	{
    		lcd_write(x + 0x80,LCD_WRITE_COM);
    	}
    	else
    	{
    		lcd_write(x + 0x80 + 0x40,LCD_WRITE_COM);
    	}	
    	while(*src != '\0')
    	{
    		lcd_write(*src,LCD_WRITE_DATA);
    		src++;
    	}	
    }

    展开全文
  • LCD显示控制程序设计

    2013-09-28 11:01:07
    LCD1602液晶屏显示日期测试程序 1、程序说明: 该例程演示了LCD1602液晶屏显示日期测试程序, 2、实验操作 将拨码开关S7和S10全部置于关闭状态。即不拨到ON端。 否则将影响到实验效果。 将LCD1602液晶屏...
  • lcd驱动程序之显示图片

    万次阅读 2015-12-29 17:13:56
    以前没有写Lcd驱动程序,现在开始做项目了,才发现Lcd驱动程序必须认真学习。还是老规矩先上代码。 内核版本:linux-3.4.2 lcd:4.3 lcd.c文件如下: #include #include #include #include #include #include ...
  • HT66F0185 LCD程序

    千次阅读 2018-09-28 11:17:44
    #include “HT66F0185.h” //以HT66F0185为例设定驱动,...//3、设定与LCD共用的IO口为输出功能 //4、设定frame是0还是1 //5、根据波形图,设定PXn输出0还是输出1(比如COM0与PC2共用,则_pc2=0或1) //FRAME LCD...
  • 微型实用程序,用于关闭Windows计算机上的屏幕。 演示了一个非常简单的Win32 API调用和编译,没有Rust std库。 有关更多信息,请参阅。 二进制文件 由于使用link_args !,目前仅每晚编译一次。
  • closeLCD快速关闭电脑屏幕工具,可以让电脑立即关闭屏幕,但程序依然运行的效果。供大家下载
  • LCD驱动程序设计

    千次阅读 2014-05-14 10:54:01
    一、LCD简介 要说LCD,先需要了解什么是液晶。1888年,奥地利植物学家莱尼茨尔发现一些有机物融化后变成液体。随后一位德国专家发现这些液体具有某些晶体的特征,比如折射性,于是他就称呼这种液体叫“液态晶体”,...
  • 解决 Linux 一定时间后自动关闭LCD

    千次阅读 2013-07-05 09:46:36
    Linux启动之后,只要一段时间不动键盘(开发板上用IO扩展出来的键盘),LCD就会自动关闭(黑屏、显示慢慢消失之类),只要按下键盘就能恢复。   这个问题让我花了一天多的时间。其实如果是手持设备,这样也...
  • LCD 监视器开关程序源码。例程中延时1秒自动关闭显示器。对于笔记本电脑没有关闭显示器的按键的代替使用,十分方便。
  • LCD12864驱动显示程序

    万次阅读 2019-04-22 10:49:30
    这里是用的并行写法,后续会更新串行 。并行缺点就是太占用io口了,我...lcd12864.c #include"lcd12864.h" uchar code num[]={"0123456789 e:.-"}; sbit RS = P3^5; //命令/数据选择 sbit RW = P3^6; //读写...
  • lcd——51程序

    2016-09-14 21:45:40
    sbit RS = P2 ^ 4; sbit RW = P2 ^ 5; sbit E = P2 ^ 6; #define LCDPORT P0 ...#define LCD_WRITE_DATA 1 ...#define LCD_WRITE_COM 0 ...void lcd_write(unsigned char byte,unsigned char flag) { if(flag) {
  • LCD设备驱动程序

    千次阅读 2014-03-10 15:18:31
    Framebuffer 是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行操作   Framebuffer又叫帧缓冲,是L
  • C51单片机LCD1602驱动程序

    千次阅读 多人点赞 2020-09-01 10:43:24
    C51单片机LCD1602驱动程序LCD1602简介1602的引脚操作时序写操作时序时序参数LCD1602关键性操作一、初始化二、清屏指令二、进入模式设置指令三、显示开关控制指令四、功能设定指令RAM地址映射图 LCD1602简介 LCD1602...
  • lcd驱动详细程序

    千次阅读 2012-10-11 10:24:29
    这个程序来自于linux内核,加以自己改编,还是内核的程序好写一点 ...在操作系统没有lcd驱动的情况下加载,但是有驱动的情况下,就加载不上去了。 程序列表编译成功。加载上去使用不成功。成功的例程 可以去 /
  • LCD1602驱动程序

    2016-11-27 17:35:27
    LCD1602driver_inside.c /*本驱动依赖reg51.h头文件*/ #include /*根据实际电路连接修改宏定义和sbit语句*/ #define D0_D7 P3 //数据通讯总线,用于写或读指令、显示地址和显示数据 sbit
  • 内核中包含了LCD驱动程序S3c2410fb.c,通过platform平台驱动框架实现,参考其现在自己写。 字符设备驱动编写往往包括,那么LCD也不例外: (1)fbmem.c分析(内核写好的LCD驱动框架,里面实现一些接口,硬件平台...
  • Linux的帧缓冲设备帧 缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读 写操作。这种操作是抽象的,统一的。用户不必关心物理...
  • 【STM32】STM32驱动 LCD12864程序代码(串行方式)

    万次阅读 多人点赞 2019-07-30 19:37:34
    《STM32 LCD12864 串行通信模式 (从原理让你理解)》 下方代码的实现也是基于上一篇的讲解顺序来的 设备: STM32F407ZGT6 引脚接线: VSS——GND VDD——VCC(5V or 3.3V) V0 亮度调节...
  • 分类: linux内核移植/驱动2010-01-07 11:20 2093人阅读 评论(3) 收藏 举报 ...Linux启动之后,只要一段时间不动键盘(开发板上用IO扩展出来的键盘),LCD就会自动关闭(黑屏、显示慢慢消失之类
  • ok6410LCD测试程序

    千次阅读 2012-10-09 13:12:33
    #ifndef LCD_APP_H #define LCD_APP_H /*自定义结构体用来在用户空间里管理帧缓冲的信息*/ typedef struct fd_dev { int fd;//帧缓冲设备文件描述符 void *pfb;//指向帧缓冲映射到用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,359
精华内容 6,543
关键字:

关闭lcd程序