17_LCD
文章目录
1、LCD硬件原理
参考文章
时序图:
LCD显示:
LCD的连接引脚:
LCD时序图:
调色板:
2、编程
2.1、框架
整体框架:
lcd框架:
lcd_controller框架:
2.2、各模块(文件)思路
2.2.1、mian.c
1、执行打印信息;
2、调用函数lcd_test();
3、死循环while(1);
2.2.2、lcd_test.c
1、此文件中只要测试lcd的功能,调用其他函数进行测试。
2、初始化lcd:lcd_init();
3、使能LCD:lcd_enable();
4、获得LCD的参数:
get_lcd_params(&fb_base, &xres, &yres, &bpp);
fb_get_lcd_params();
font_init();
5、往framebuffer中写数据:
if(bpp == 16)
else if (bpp == 32)
6、画圆:draw_circle(xres/2, yres/2, (xres + yres)/8, BLUE
7、输出文字:fb_print_string(10, 10, “www.hdu.edu.cn\n\rwww.wxc.edu.cn”, BLUE);
2.2.3、geometry.c geometry.h font.c font.h font_8x16.c
1、geometry.c中实现画圆画线函数:
画圆函数。参数:圆心,半径,颜色:
void draw_circle(int x, int y, int r, int color)
画线。参数:起始坐标,终点坐标,颜色:
void draw_line(int x1,int y1,int x2,int y2,int color)
2、geometry.h中声明geometry.c的函数
3、font.c中实现在lcd上描写文字函数:
获得lcd的参数:
void font_init(void) {
get_lcd_params(&fb_base, &xres, &yres, &bpp);
}
根据字母的点阵在LCD上画点
void fb_print_char(int x, int y, char c ,unsigned int color)
调用fb_print_char()描写文字:
void fb_print_string(int x, int y, char* str, unsigned int color)
4、font.h中声名font.c中的函数
5、font_8x16.c中定义一些字母等信息,提供给font.c中的fb_print_char()函数调用
#define FONTDATAMAX 4096
const unsigned char fontdata_8x16[FONTDATAMAX] = {
。。。
。。。
}
2.2.4、framebuffer.c framebuffer.h
1、framebuffer.c将参数存起来,给font.c中的fb_print_char()函数使用实现画点。
2、framebuffer.h中声名framebuffer.c中的函数
2.2.5、lcd.c lcd.h
1、lcd.h中定义了lcd的参数结构体,和声明lcd.c中的函数
极性标号:
enum {
NORMAL = 0,
INVERT = 1,
};
引脚极性:
typedef struct pins_polarity {
int de; /* normal: 高电平可以传输数据 */
int pwren; /* normal: 高电平有效 */
int vclk; /* normal: 在下降沿获取数据 */
int rgb; /* normal: 高电平表示1 */
int hsync; /* normal: 高脉冲 */
int vsync; /* normal: 高脉冲 */
}pins_polarity, *p_pins_polarity;
相关时序:
typedef struct time_sequence {
/* 垂直方向 */
int tvp; /* vysnc脉冲宽度 */
int tvb; /* 上边黑框, Vertical Back porch */
int tvf; /* 下边黑框, Vertical Front porch */
/* 水平方向 */
int thp; /* hsync脉冲宽度 */
int thb; /* 左边黑框, Horizontal Back porch */
int thf; /* 右边黑框, Horizontal Front porch */
int vclk;
}time_sequence, *p_time_sequence;
lcd参数:
typedef struct lcd_params {
/* 名字 */
char *name;
/* 引脚极性 */
pins_polarity pins_pol;
/* 时序 */
time_sequence time_seq;
/* 分辨率, bpp */
int xres;
int yres;
int bpp;
/* framebuffer的地址 */
unsigned int fb_base;
}lcd_params, *p_lcd_params;
lcd.c中的函数声明void get_lcd_params(unsigned int *fb_base, int *xres, int *yres, int *bpp);
2、lcd.c中完成注册一款lcd(4.3寸)、注册一款lcd控制器(s3c2440)、选择一款lcd(4,3寸)、选择一款lcd控制器(s3c2440)、使用被选中的lcd的参数来初始化被选中的lcd控制器:
注册lcd函数:
int register_lcd(p_lcd_params plcd)
选择lcd函数:
int select_lcd(char *name)
获得lcd参数函数:
void get_lcd_params(unsigned int *fb_base, int *xres, int *yres, int *bpp)
lcd使能函数:
void lcd_enable(void)
lcd失能函数:
void lcd_disable(void)
lcd初始化函数:
void lcd_init(void)
{
/* 注册LCD */
lcd_4_3_add();
/* 注册LCD控制器 */
lcd_controller_add();
/* 选择某款LCD */
select_lcd("lcd_4.3");
/* 选择某款LCD控制器 */
select_lcd_controller("s3c2440");
/* 使用LCD的参数, 初始化LCD控制器 */
lcd_controller_init(g_p_lcd_selected);
}
2.2.6、lcd_4.3.c lcd_3.5.c
1、lcd_4.3.c中定义了4.3寸lcd的相关参数,提供给模块使用:
参数结构体:
lcd_params lcd_4_3_params = {
.name = "lcd_4.3",
.pins_pol = {
.de = NORMAL, /* normal: 高电平可以传输数据 */
.pwren = NORMAL, /* normal: 高电平有效 */
.vclk = NORMAL, /* normal: 在下降沿获取数据 */
.rgb = NORMAL, /* normal: 高电平表示1 */
.hsync = INVERT, /* invert: 低脉冲 */
.vsync = INVERT, /* invert: 低脉冲 */
},
.time_seq = {
/* 垂直方向 */
.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, /* 9MHz */
},
.xres = 480,
.yres = 272,
.bpp = 32, /* 16bpp or 32bpp ,no 24bpp */
.fb_base = LCD_FB_BASE, /* #define LCD_FB_BASE 0x33c00000 */
};
调用lcd.c中的注册函数,把用到的4.3寸lcd的参数注册到上层数组中保存以供其他模块使用:
void lcd_4_3_add(void)
{
register_lcd(&lcd_4_3_params);
}
2.2.7、lcd_controller.c lcd_controller.h
1、lcd_controller.h中定义了lcd控制器的结构体、声明lcd_controller.c中的函数:
lcd_controller控制结构体,定义了一些函数指针:
typedef struct lcd_controller {
char *name;
void (*init)(p_lcd_params plcdparams);
void (*enable)(void);
void (*disable)(void);
}lcd_controller, *p_lcd_controller;
2、lcd_controller.c中提供了lcd控制器的注册函数、lcd控制器的选择函数、lcd控制器的初始化函数、lcd控制器的使能函数、lcd控制器的失能函数;添加一款lcd控制器函数:
lcd控制器的注册函数:
int register_lcd_controller(p_lcd_controller plcdcon)
lcd控制器的选择函数:
int select_lcd_controller(char *name)
lcd控制器的初始化函数:
int lcd_controller_init(p_lcd_params plcdparams)
lcd控制器的使能函数:
void lcd_controller_enable(void)
lcd控制器的失能函数:
void lcd_controller_disable(void)
添加一款lcd控制器函数:
void lcd_controller_add(void)
2.2.8、s3c2440_lcd_controller.c ti_lcd_controller.c
1、s3c2440_lcd_controller.c中提供了要用到的2440的引脚配置函数、2440的lcd控制器初始化函数、2440的lcd控制器使能函数、2440的lcd控制器失能函数、2440要用到的lcd参数结构体、提供给上层的注册2440的lcd控制器函数:
2440的引脚配置函数:
void jz2440_lcd_pin_init(void)
2440的lcd控制器初始化函数:
void s3c2440_lcd_controller_init(p_lcd_params plcdparams)
2440的lcd控制器使能函数:
void s3c2440_lcd_controller_enable(void)
2440的lcd控制器失能函数:
void s3c2440_lcd_controller_disable(void)
2440要用到的lcd参数结构体:
struct lcd_controller s3c2440_lcd_controller = {
.name = "s3c2440",
.init = s3c2440_lcd_controller_init,
.enable = s3c2440_lcd_controller_enable,
.disable = s3c2440_lcd_controller_disable,
};
提供给上层的注册2440的lcd控制器函数:
void s3c2440_lcd_controller_add(void)