select设置option宽度_LCD原理详解及裸机程序分析——第006节_LCD设置编程

42d25829aa68b12e33de88e9e0d66bcf.png

来源:韦东山嵌入式专栏_ARM裸机加强版维基教程

作者:韦东山

本文字数:2959,阅读时长:2.5分钟

前面编写了s3c2440_lcd_controller.c,以后我们只需往里面传入参数即可控制LCD控制器,对于我们的4.3寸LCD,配合LCD手册时序的介绍,相关的设置如下:

71aee1c2f162a543538c525a45dbd6ba.png
#define LCD_FB_BASE 0x33c00000lcd_params lcd_4_3_params = {    .name = "lcd_4.3"    .pins_polarity = {        .de    = NORMAL,    /* normal: 高电平时可以传输数据 */        .pwren = NORMAL,    /* normal: 高电平有效 */        .vclk  = NORMAL,    /* normal: 在下降沿获取数据 */        .rgb   = NORMAL,    /* normal: 高电平表示1 */        .hsync = INVERT,    /* normal: 高脉冲 */        .vsync = INVERT,    /* normal: 高脉冲 */    },    .time_sequence = {        /* 垂直方向 */        .tvp=   10, /* vysnc脉冲宽度 */        .tvb=   2,  /* 上边黑框, Vertical Back porch */        .tvf=   2,  /* 下边黑框, Vertical Front porch */        /* 水平方向 */        .thp=   41, /* hsync脉冲宽度 */        .thb=   2,  /* 左边黑框, Horizontal Back porch */        .thf=   2,  /* 右边黑框, Horizontal Front porch */        .vclk=  9,  /* MHz */    },    .xres = 480,    .yres = 272,    .bpp  = 16,    .fb_base = LCD_FB_BASE,};

完成了lcd控制器和参数的代码,现在还需要一个管理的中间层将两者连在一起。

我们用lcd_controller.c管理s3c2440_lcd_controller.c,它向上接受传入的LCD参数,向下传给对应的LCD控制器。lcd_controller.c管理下级的控制器的思路如下:

  • a. 用数组保存下面各种lcd_controller;
  • b. 提供register_lcd_controller给下面的代码设置数组;
  • c. 提供select_lcd_controller(name)给上面的代码选择某个lcd_controller;

lcd_controller.c代码如下:

#define LCD_CONTROLLER_NUM 10static p_lcd_controller p_array_lcd_controller[LCD_CONTROLLER_NUM];static p_lcd_controller g_p_lcd_controller_selected;int register_lcd_controller(p_lcd_controller plcdcon){    int i;    for (i = 0; i < LCD_CONTROLLER_NUM; i++)    {        if (!p_array_lcd_controller[i])        {            p_array_lcd_controller[i] = plcdcon;            return i;        }    }    return -1;      }int select_lcd_controller(char *name){    int i;    for (i = 0; i < LCD_CONTROLLER_NUM; i++)    {        if (p_array_lcd_controller[i] && !strcmp(p_array_lcd_controller[i]->name, name))        {            g_p_lcd_controller_selected = p_array_lcd_controller[i];            return i;        }    }    return -1;      }/* 向上: 接收不同LCD的参数 * 向下: 使用这些参数设置对应的LCD控制器 */int lcd_controller_init(p_lcd_params plcdparams){    /* 调用所选择的LCD控制器的初始化函数 */    if (g_p_lcd_controller_selected)    {        g_p_lcd_controller_selected->init(plcdparams);        return 0;    }    return -1;}void lcd_contoller_add(void){    s3c2440_lcd_contoller_add();}同时,在s3c2440_lcd_controller.c里注册控制器:void s3c2440_lcd_contoller_add(void){    register_lcd_controller(&s3c2440_lcd_controller);}

这样,s3c2440_lcd_controller.c里的register_lcd_controller()将自己放在p_array_lcd_controller[]这个数组,然后上层的lcd_controller.c调用select_lcd_controller()传入要选择的LCD控制器,然后在数组里面找到名字名字匹配的LCD控制器进行相应的初始化。

同理,也通过lcd.c去管理lcd_4.3.c,思路如下:

  • a. 有一个数组存放各类lcd的参数;
  • b. 有一个register_led给下面的lcd程序来设置数组;
  • c. 有一个select_lcd,供上层选择某款LCD;

参考前面的lcd_controller.c编辑lcd_controller.c如下:

#define LCD_NUM 10static p_lcd_params p_array_lcd[LCD_NUM];static p_lcd_params g_p_lcd_selected;int register_lcd(p_lcd_params plcd){    int i;    for (i = 0; i < LCD_NUM; i++)    {        if (!p_array_lcd[i])        {            p_array_lcd[i] = plcd;            return i;        }    }    return -1;      }int select_lcd(char *name){    int i;    for (i = 0; i < LCD_NUM; i++)    {        if (p_array_lcd[i] && !strcmp(p_array_lcd[i]->name, name))        {            g_p_lcd_selected = p_array_lcd[i];            return i;        }    }    return -1;      }

在lcd_4.3.c里面把lcd参数注册进去:

void lcd_4_3_add(void){register_lcd(&lcd_4_3_params);}

以后只需要在lcd.c里面选择某款lcd和某款lcd控制器即可,底层的只管添加种类即可。

在lcd.c里面添加初始化函数如下:

int lcd_init(void){    /* 注册LCD */    lcd_4_3_add();    /* 注册LCD控制器 */    lcd_contoller_add();    /* 选择某款LCD */    select_lcd("lcd_4.3");    /* 选择某款LCD控制器 */    select_lcd_controller("s3c2440");    /* 使用LCD的参数, 初始化LCD控制器 */    lcd_controller_init(g_p_lcd_selected);}

上一篇:LCD原理详解及裸机程序分析——第005节_LCD控制器编程

下一篇:LCD原理详解及裸机程序分析——第007节_LCD编程简单测试

点击”了解更多“阅读更多相关文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值