液晶显示屏

LCD编程_使用调色板

梦想的初衷 提交于 2019-11-27 18:33:14
在前面的博客中,使用的像素格式都是16bpp,24bpp(24bpp实际实际上就是32bpp)?如果想使用8bpp时,就需要使用调色板。 在以前的博客中,曾经说过,在framebuffer中如果每个像素用8bpp表示,这8bpp怎么转换成lcd需要的16bpp的数据,需要引入一个调色板。 2的8次方,为256。即调色板中有256项,0-255。需要在调色板所对应的内存里面,填入16bpp的数据(这些数据就是真正的颜色值)。把lcd控制器设置为8bpp时,它会从framebuffer中取出一个像素的数据(8位),使用这8位数据作为一个索引,在调色板中取出真正的颜色,从而就得到了16位的数据。最终将这16位的数据发给lcd。 需要修改s3c2440_lcd_controller.c lcd_controller.c中的代码: 1 #include "lcd.h" 2 #include "lcd_controller.h" 3 #include "../s3c2440_soc.h" 4 5 #define HCLK 100 6 7 void jz2440_lcd_pin_init(void) 8 { 9 /* 初始化引脚 : 背光引脚 */ 10 GPBCON &= ~0x3; 11 GPBCON |= 0x01; 12 13 /* LCD专用引脚 */ 14 GPCCON =

LCD编程_画点线圆

。_饼干妹妹 提交于 2019-11-27 17:57:41
上篇博客中进行了lcd的简单测试,这篇博客将进行更加复杂的测试——画点、画线、画圆。画线和画圆是在画点的基础上实现的,因此本篇博客重点实现画点操作。 先抛出这样的一个问题,已知: (x,y)的坐标; bpp; xres; yres; 那么,如何在framebuffer中获得像素的地址呢? (x,y)像素的起始地址 = fb_base +(xres * bpp /8)* y +x * bpp/8 (xres * bpp /8)表示一行占据多少个字节,乘以y表示y行共占据多少个像素 2)在framebuffer.c中实现画点操作 1 #include "lcd.h" 2 3 /* 实现画点 */ 4 5 /* 获得LCD参数 */ 6 static unsigned int fb_base; 7 static int xres, yres, bpp; 8 9 void fb_get_lcd_params(void) 10 { 11 get_lcd_params(&fb_base, &xres, &yres, &bpp); 12 } 13 14 /* rgb: 0x00RRGGBB */ 15 unsigned short convert32bppto16bpp(unsigned int rgb) 16 { 17 int r = (rgb >> 16)& 0xff; /*将红色的值拿到*

LCD编程_简单测试

大憨熊 提交于 2019-11-27 17:49:35
首先,需要编写一个led_test.c的文件,依据代码框架,在led_test.c中我们能够看到的只是led.c。我们是看不到led_controller.c的。比如说,在led_test.c中,需要使用led_controller.c中的函数,需要在led.c中对led_controller.c中的函数进行封装。 怎样去使用lcd呢,框图如下: 秉承上述的思想,于是就有了下面的代码。 led_test.c 1 void lcd_test(void) 2 { 3 unsigned int fb_base; 4 int xres, yres, bpp; 5 int x, y; 6 unsigned short *p; 7 unsigned int *p2; 8 9 /* 初始化LCD */ 10 lcd_init(); 11 12 /* 使能LCD */ 13 lcd_enable(); 14 15 /* 获得LCD的参数: fb_base, xres, yres, bpp */ 16 get_lcd_params(&fb_base, &xres, &yres, &bpp); 17 18 /* 往framebuffer中写数据 */ 19 if (bpp == 16) 20 { 21 /* 让LCD输出整屏的红色 */ 22 23 /* 565: 0xf800 */ 24 25 p

STM32L475 硬件SPI+软件SPI驱动ST7789V2

纵然是瞬间 提交于 2019-11-27 17:04:42
前言 最近购买了IoT Board 潘多拉开发板来研究,学习使用STM32CubeMX工具配置SPI,然后驱动了TFTLCD。潘多拉开发板的TFTLCD驱动IC是ST7789V2,结合原子哥的TFTLCD代码,分享自己的硬件SPI+软件SPI驱动ST7789V2+中文显示。关于STM32CubeMX的使用可以参考 微雪课堂STM32CubeMX系列教程 。 STM32L475 硬件SPI+软件SPI驱动ST7789V2代码: /* 如果使用软件SPI,只需把硬件SPI的宏开关去掉即可 */ //#define __LCD_HW_SPI_DRIVE__ #define __LCD_SW_SPI_DRIVE__ /* LCD_PWR:PB7 LCD_RST:PB6 LCD_WR: PB4 LCD_CS: PD7 */ #define LCD_PWR(n) (n ? HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)) #define LCD_RST(n) (n ? HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET) : HAL_GPIO_WritePin(GPIOB, GPIO

LCD编程_LCD控制器

自闭症网瘾萝莉.ら 提交于 2019-11-26 23:50:20
CLKVAL : VCLK = HCLK / [(CLKVAL+1) x 2]--------> CLKVAL = HCLK/VCLK/2-1 在这个地方HCLK=100M,那么VLCK等于多少呢?需要打开lcd的芯片手册 从中可以看出,5<= vclk<=12,正常情况是取9. 当VCLK =9 时,CLKVAL = 4.5 。取一个整数为5。当CLKVAL取为5时,再判断一下,VCLK是否在5到12之间。 PNRMODE :取11 = TFT LCD panel BPPMODE :只支持8bpp/16bpp/24bpp ENVID :LCD video output and the logic enable/disable. 用来使能LCD控制器本身,是否输出信号。在这个地方暂不设置,后面初始化函数中再进行设置。 将上一篇博客中led.h文件中的time_sequence增加一个数据成员vclk。 因此就有了下面这样的代码: 2、垂直方向和水平方向上一些参数的设置 垂直: 水平: 从上面的图可以看出: 垂直: VBPD+1 = tvb -------->VBPD = tvb - 1 VFPD+1 = tvf --------->VFPD = tvf - 1 VSPW+1 = tvp --------->VSPW = tvp - 1 LINEVAL+1 = line -----

编程——抽象出重要的结构体

别说谁变了你拦得住时间么 提交于 2019-11-26 22:48:43
根据上篇博客中的框架,需要编写这些文件: 首先看一下led.h中,都有什么? 1 #ifndef _LCD_H 2 #define _LCD_H 3 4 5 enum { 6 NORMAL = 0, 7 INVERT = 1, 8 }; 9 10 /* NORMAL : 正常极性 11 * INVERT : 反转极性 12 */ 13 typedef struct pins_polarity { 14 int vclk; /* normal: 在下降沿获取数据 */ 15 int rgb; /* normal: 高电平表示1 */ 16 int hsync; /* normal: 高脉冲 */ 17 int vsync; /* normal: 高脉冲 */ 18 }pins_polarity, *p_pins_polarity; 19 20 typedef struct time_sequence { 21 /* 垂直方向 */ 22 int tvp; /* vysnc脉冲宽度 */ 23 int tvb; /* 上边黑框, Vertical Back porch */ 24 int tvf; /* 下边黑框, Vertical Front porch */ 25 26 /* 水平方向 */ 27 int thp; /* hsync脉冲宽度 */ 28 int thb; /*

LCD裸板编程_框架

我的未来我决定 提交于 2019-11-26 21:02:40
lcd程序框架: 为了让程序更好的扩展,介绍面向对象编程: 比如抽象出lcd_3.5和lcd_4.3的共同点: 当我想使用3.5寸的lcd时,只需让lo指向lcd_3.5_opr即可。同样,当我想使用4.3寸的lcd时,只需让lo指向lcd_4.3_opr. 还可以进一步封装 使用者可以不接触lcd_3.5.c和lcd_4.3.c中的函数,可以直接调用lcd.c中的函数,进而操作lcd。 将lcd_3.5_opr和lcd_4.4_opr这些结构体注册到lcd.c这个文件中,将结构体放入某个数组(其实驱动程序中很多都是这么搞的),以后可以根据name来选择使用哪款lcd。 同样对于lcd控制器,我们也可以利用这种面向对象以及分层的思想。 当我想使用s3c2440的控制器的时,只需让lc指向lco_2440即可。同样,当我想使用ti的控制器时,只需让lc指向lco_ti即可. 使用者可以不接触S3C2440_lcd_controller.c和ti_lcd_controller.c中的函数,可以直接调用lcd_controller.c中的函数,进而操作lcd控制器。 将lco_2440和lco_ti这些结构体注册到lcd_controller.c这个文件中,将结构体放入某个数组(其实驱动程序中很多都是这么搞的),以后可以根据name来选择使用哪款lcd控制器。 来源: https:/

S3C2440_LCD控制器

落花浮王杯 提交于 2019-11-26 20:46:49
1、LCD控制器主要有两方面的功能: 1)从framebuffer中取出某个像素的数据; 2)配合其他信号,一起将这个数据发送给LCD 不管是2440,还是其他型号的ARM芯片。它们的LCD控制器的功能都是一样的,只不过存储器的操作稍有区别。 LCDDMA:会从内存中把数据取出来,发送给LCD。 DMA:不需要cpu的参与,只需要把数据填好,它就会自动的取数据,发送给LCD。 怎样去设置极性、时序呢? 需要设置REGBANK,通过这些寄存器控制LCD控制器,让其发出合适的时序。 2、 使用8bpp时,会涉及到一个调色板。 为什么会涉及一个调色板的概念。 可以在framebuffer中,每个像素使用8bit来表示。 问:8bit的数据怎样得到16bit的数据,中间肯定得引入一个东西,这个东西就是调色板。 调色板中有多少项,8bit就得有2的8次方项,即256项。 这样,LCD控制器怎样去显示呢? 当设置为8bit时,LCD控制器会从framebuffer中得到8位的数据,这8位的数据不是直接发给lcd的,它是使用这8位的数据在这个调色板中作为索引,取出16位数据,再把这16位数据发给lcd。 8bpp:在framebuffer中存的是伪彩色 16bpp/24bpp:在framebuffer中存的是真彩色。 调色板就是一块特殊的内存,也许它就是放在lcd控制器里面,以后使用8bpp时

12232 LCM Driver

大兔子大兔子 提交于 2019-11-26 15:16:46
自己写的12232LCM模块的驱动代码,实现了基本的功能。 1 // ============================================================== 2 // 12232.h 3 // ============================================================== 4 #ifndef __12232Driver_H 5 #define __12232Driver_H 6 void LCD_Init( void ); 7 void LCD_Reset( void ); 8 void LCD_FillAll( void ); 9 void LCD_ClearAll( void ); 10 void LCD_WriteCmd(unsigned char cmd); 11 void LCD_WriteCmd1(unsigned char cmd); 12 void LCD_WriteCmd2(unsigned char cmd); 13 void LCD_SetColumn(unsigned char column); 14 void LCD_SetColumn1(unsigned char column); 15 void LCD_SetColumn2(unsigned char column);