17_LCD

17_LCD

文章目录

1、LCD硬件原理

参考文章
17_LCD
时序图:
17_LCD
LCD显示:
17_LCD
LCD的连接引脚:
17_LCD
17_LCD
LCD时序图:
17_LCD
调色板:
17_LCD

2、编程

2.1、框架

整体框架:
17_LCD
lcd框架:
17_LCD
lcd_controller框架:
17_LCD

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)

3、程序运行流程图

17_LCD

上一篇:51单片机 第五节 模块化编程与LCD调试工具


下一篇:嵌入式Linux系统下LCD控制台关闭