屏幕模块 - 笔记深圳市晶联讯电子 液晶模块 JLX19296G-915-BN

Posted 兴趣使然_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了屏幕模块 - 笔记深圳市晶联讯电子 液晶模块 JLX19296G-915-BN相关的知识,希望对你有一定的参考价值。

最近工作在用这款屏幕,折腾两星期后差不多摸透了,写下笔记给日后的自己,和有需要的人.

一、屏幕介绍

  • 型号 : JLX19296G-915-BN , 这个型号属于裸屏,焊接式 FPC,没有自带字库.尺寸为192*96 .
  • 特点 : 能串行也能并行通讯, 多种显示扫描方向,有单色和灰度,能亮和不亮背光.对比度设置.
  • 实现 : 我实现的是硬件串行; 扫描方向是自上到下,从左到右,低位在上; 单色;亮不亮背光取决于有没有给背光供电,有就亮,没有就不亮.
  • 相关 : 官网链接 http://www.jlxlcd.cn/html/zh-detail-877.html ; pdf 说明文档也在里面下载.
  • 注意 : 不同型号的引脚不太一样,初始化的部分参数不一样,其它差不多(虽然我没用过多款,但是对比pdf手册感觉是一样的 )

二、代码解析

不说废话,直接按着代码一步步解说 .

1. 单片机通讯引脚 的 初始化

  • 这部分主要是gpio的初始化,不同单片机平台的api接口不一样,自行测试更换.建议一开始拿着裸机的spi例程修改,事半功倍.
  • 只有两点需要 注意 的:
  1. 模块正常工作时,复位引脚接高电平,需要复位就拉低,保持,再拉高.如果悬空或没有接高电平,就不能使用,惨痛的教训!!!
  2. 串行通讯使用spi协议,感觉pdf的时序图,是在时钟线scl从低电平跳变高电平时读取sda的数据,从pdf自带例程的模拟通讯实现也能看出来.时钟线先保持低电平,改变数据线,时钟线跳变拉高读取数据; 在硬件spi设置中就是模式0 (CPOL=0; CPHA=0).波特率的设置根据单片机不同,可以自己算也可以自己试,我是从快到慢一个个试.

推荐笔记 : SPI总线传输的4种模式 https://www.cnblogs.com/gmpy/p/12461461.html


/*******************************************************************************
 * 局部宏定义
 ******************************************************************************/
#if 1   // 外部实现
#define lcd_cs1(x)     Spi_SetCS(M0P_SPI1, x);Gpio_WriteOutputIO(PORT_S3_SSEL, PIN_S3_SSEL, x) //CS 
#define lcd_reset(x)   ;//RST   lcd_reset(0)    lcd_reset(1) // 使用时不需要复位,就不接
#define lcd_sclk(x)    Gpio_WriteOutputIO(PORT_S3_SCLK, PIN_S3_SCLK, x) //串行时钟  lcd_sclk(0) lcd_sclk(1)
#define lcd_rs(x)      Gpio_WriteOutputIO(PORT_S3_MISO, PIN_S3_MISO, x) //RS        lcd_rs(0)   lcd_rs(1) 
#define lcd_sid(x)     Gpio_WriteOutputIO(PORT_S3_MOSI, PIN_S3_MOSI, x) //串行数据  lcd_sid(0)  lcd_sid(1)
#endif

/*******************************************************************************
 * 函数实现-全局(“外部”)和局部(“静态”)
 ******************************************************************************/

/**     // 外部实现
 *******************************************************************************
 ** \\brief  板级引脚初始化
 ** \\retval None
 ******************************************************************************/
static void gpio_bsp_init(void)

	// 具体实现略,不同单片机平台不一样,不赘述.
	
	// 初始化 gpio 引脚
	// 初始化 spi 外设 模式0,波特率自行测试
	
	// 注意 该屏幕的spi通讯并不需要输入, 
	// MISO 引脚被用作输出,输出高电平代表MOSI输出数据,输出低电平代表MOSI输出指令
	
	// 如果控模块电源引脚,别忘记打开;
	// 复位引脚必须接高电平


/**     // 外部实现
 *******************************************************************************
 ** \\brief  板级延时
 ** \\param  i           延时毫秒
 ** \\retval None
 ******************************************************************************/
static void lcd_jlx19296_delay_ms(int i)

    delay10us(i*10);


/**     // 外部实现
 *******************************************************************************
 ** \\brief  板级模块复位
 ** \\param  i           延时毫秒
 ** \\retval None
 ******************************************************************************/
static void lcd_jlx19296_reset(void)

	// 如果没有复位操作就将复位引脚接高电平,才能正常工作!!!!!
    lcd_reset(0);
    lcd_jlx19296_delay_ms(100);
    lcd_reset(1);
    lcd_jlx19296_delay_ms(100);


/**     // 外部实现
 *******************************************************************************
 ** \\brief  发送指令
 ** \\param  data1       8位/1字节的指令
 ** \\retval None
 ******************************************************************************/
static void lcd_jlx19296_cmd(uint32_t data1)

	lcd_cs1(0);
	lcd_rs(0);
	// 模拟spi的方法
	/*for(int i=0; i<8; i++) 
	
		lcd_sclk(0); // 时钟线先保持低电平
		if(data1&0x80) lcd_sid(1); // 改变数据线
		else lcd_sid(0);
		lcd_sclk(1); // 时钟线跳变拉高,读取数据线
		data1<<=1;
	*/
	// 硬件spi的方法
    while(Spi_GetStatus(M0P_SPI1, SpiTxe) == FALSE);    //发送缓冲器器空标志
    Spi_SendData(M0P_SPI1, data1);
    
	lcd_cs1(1);


/**     // 外部实现
 *******************************************************************************
 ** \\brief  发送数据
 ** \\param  data1       8位/1字节的数据
 ** \\retval None
 ******************************************************************************/
static void lcd_jlx19296_data(uint32_t data1)

	lcd_cs1(0);
	lcd_rs(1) ;
	// 模拟spi的方法
	/*for(int i=0; i<8; i++)
	
		lcd_sclk(0); // 时钟线先保持低电平
		if(data1&0x80) lcd_sid(1); // 改变数据线
		else lcd_sid(0);
		lcd_sclk(1); // 时钟线跳变拉高,读取数据线
		data1<<=1;
	*/
	// 硬件spi的方法
    while(Spi_GetStatus(M0P_SPI1, SpiTxe) == FALSE);    //发送缓冲器器空标志
    Spi_SendData(M0P_SPI1, data1);
    
	lcd_cs1(1);

2. 屏幕模块 的 初始化

  • 这部分就是拷贝pdf例程的内容的了,我对比多个型号的pdf例程,和指令表内容, 发现模块初始化这部分内容,不同型号的例程存在坑爹的赋值粘贴嫌疑 ,也就是有部分注释没改或没有用的多余内容,但不影响使用.

  • 可以屏幕说明pdf有附带中文指令表说明,网上也有 ST75256 (屏幕内嵌的主控芯片) 说明手册的中文版,可以对照查看.

  • 这部分我无聊的将每个指令都化作宏定义,查看手册表明注释和分类.如下.最后总结需要重点关注的内容:

  1. 数据扫描方向 Data_Scan_Direction_0 : 决定了扫描方向 自上到下,从左到右.
  2. 数据格式选择 Data_Format_Select : 决定了 低位在上.
  3. 显示模式 Display_Mode_0 : 决定了单色模式.
  4. 设置对比度 Set_Vop_0 : 决定屏幕整体显示偏黑还是偏透明.
  5. 显示控制 Display_Control_0 : (重点) 我起初将这个误以为是对比度,修改后导致显示坐标发生整体偏移,所以这部分内容不要修改,直接拷贝例程最好.
  • 如果你初始化成功会看到屏幕是"雪花屏"的效果,之后调用清屏即可.如果你初始化后屏幕没有任何显示,代表初始化失败了,可能没成功通讯,检查通讯引脚,模块电源,还有复位引脚有没有接高电平.
/*******************************************************************************
 * 全局宏定义    // https://max.book118.com/html/2017/1025/137875607.shtm
 ******************************************************************************/
// 1. 设置扩展指令
#define Extension_Command(EXT1, EXT0)   ((0x30)|(((EXT1)&0x1)<<3)|(((EXT0)&0x1)<<0)) 	
// ======================= 指令 1 =======================
// 2. 显示开/关 设置LCD显示器 DSP=0;显示关闭 DSP=1;显示打开
#define Display_ON_OFF(DSP)  	    ((0xAE)|(((DSP)&0x1)<<0))	
// 3. 反转显示 设置反向显示 INV=0;正常显示 INV=1;反向显示
#define Inverse_Display(INV)  	    ((0xA6)|(((INV)&0x1)<<0))	
// 4. 所有像素开/关 设置所有像素模式 AP=0;全像素关闭模式 AP=1;全像素开启模式
#define All_Pixel_ON_OFF(AP)  	    ((0x22)|(((AP)&0x1)<<0))	
// 5. 显示控制  CLD;设置CL驱动频率 DT;点空比 LF/FI;帧周期
#define Display_Control_0()  	    (0xCA)
#define Display_Control_1(CLD)		((0x00)|(((CLD)&0x1)<<2))
#define Display_Control_2(DT)		((0x00)|(((DT)&0xFF)<<0))
#define Display_Control_3(LF, FI)	((0x00)|(((LF)&0xF)<<0)|(((FI)&0x1)<<4)|(((LF)&0x10)<<1))
// 6. 省电 设置省电模式 SLP=0;退出休眠模式 SLP=1;进入休眠模式
#define Power_Save(SLP)  		    ((0x94)|(((SLP)&0x1)<<0))
// 7. 设置页面地址 起始页面地址;00H<=YS<=28H 结束页面地址;YS<=YE<=28H
#define Set_Page_Address_0()  	    (0x75)
#define Set_Page_Address_1(YS)  	((0x00)|(((YS)&0xFF)<<0))
#define Set_Page_Address_2(YE)  	((0x00)|(((YE)&0xFF)<<0))
// 8. 设置列地址 起始列地址;00H<=XS<=FFH 结束列地址;XS<=XE<=FFH
#define Set_Column_Address_0()	    (0x15)
#define Set_Column_Address_1(XS)	((0x00)|(((XS)&0xFF)<<0))
#define Set_Column_Address_2(XE)	((0x00)|(((XE)&0xFF)<<0))
// 9. 数据扫描方向 设置正/反显示地址 和 地址扫描方向
#define Data_Scan_Direction_0()		(0xBC)
#define Data_Scan_Direction_1(MV, MX, MY) 	((0x00)|(((MV)&0x1)<<2)|(((MX)&0x1)<<1)|(((MY)&0x1)<<0))
// 10. 写数据 循环写数据
#define Write_Data_0()				(0x5C)
#define Write_Data_1(DATA)			((0x00)|(((DATA)&0xFF)<<0))
// 20. 电源控制 功率电路操作 =0;OFF =1;ON
#define Power_Control_0()			(0x20)
#define Power_Control_1(VB,VF,VR) 	((0x00)|(((VB)&0x1)<<3)|(((VF)&0x1)<<1)|(((VR)&0x1)<<0))
// 21. 设置VOP 设置对比度 微调对比度,可调范围0x00~0x3f,共64级 粗调对比度,可调范围0x00~0x07,共8级
#define Set_Vop_0()					(0x81)
#define Set_Vop_1(VOP)				((0x00)|(((VOP)&0x3F)<<0))
#define Set_Vop_2(VOP)				((0x00)|(((VOP)&0x7)<<0))
// 27. 数据格式选择 DO=0;高位在前 DO=1;低位在前
#define Data_Format_Select(DO)      ((0X8)|(((DO)&0x1)<<2))
// 28. 显示模式 设置显示模式 DM=0;单色(默认) DM=1;4级灰度模式
#define Display_Mode_0()			(0xF0)
#define Display_Mode_1(DM)			((0x10)|(((DM)&0x1)<<0))
// ======================= 指令 2 =======================
// 31.设定灰度 GL;设置轻灰色级别 GD;设定暗灰色等级
#define Set_Gray_Level_0()			(0x20)
#define Set_Gray_Level_1(HD)	    ((0x00)|(((HD)&0x1F)<<0))
#define Set_Gray_Level_2(HD)	    ((0x00)|(((HD)&0x1F)<<0))
#define Set_Gray_Level_3(HD)		((0x00)|(((HD)&0x1F)<<0))
#define Set_Gray_Level_4(GL)		((0x00)|(((GL)&0x1F)<<0))
#define Set_Gray_Level_5(GL)		((0x00)|(((GL)&0x1F)<<0))
#define Set_Gray_Level_6(GL)		((0x00)|(((GL)&0x1F)<<0))
#define Set_Gray_Level_7(HD)	    ((0x00)|(((HD)&0x1F)<<0))
#define Set_Gray_Level_8(HD)		((0x00)|(((HD)&0x1F)<<0))
#define Set_Gray_Level_9(GD)		((0x00)|(((GD)&0x1F)<<0))
#define Set_Gray_Level_10(HD)		((0x00)|(((HD)&0x1F)<<0))
#define Set_Gray_Level_11(HD)		((0x00)|(((HD)&0x1F)<<0))
#define Set_Gray_Level_12(GD)		((0x00)|(((GD)&0x1F)<<0))
#define Set_Gray_Level_13(GD)		((0x00)|(((GD)&0x1F)<<0))
#define Set_Gray_Level_14(GD)		((0x00)|(((GD)&0x1F)<<0))
#define Set_Gray_Level_15(HD)		((0x00)|(((HD)&0x1F)<<0))
#define Set_Gray_Level_16(HD)		((0x00)|(((HD)&0x1F)<<0))
// 32. LCD偏压比设置 BE;升压电容频率 BS;偏压比,
#define Analog_Circuit_Set_0()		(0x32)
#define Analog_Circuit_Set_1()		(0x00)
#define Analog_Circuit_Set_2(BE)	((0x00)|(((BE)&0x3)<<0))
#define Analog_Circuit_Set_3(BS)	((0x00)|(((BS)&0x7)<<0))
// 35. 自动读取控制 设置自动读取指令 XARD=0;启用自动读取 XARD=1;禁用自动读取
#define Auto_Read_Control_0()	    (0xD7)
#define Auto_Read_Control_1(XARD)	((0x8F)|(((XARD)&0x1)<<4))
// 42. 帧速率 此指令比较重要,不加此指令升压会慢 0.5s  帧速率设置在不同的温度范围
#define Set_Frame_Rate_0()          (0xF0)
#define Set_Frame_Rate_1以上是关于屏幕模块 - 笔记深圳市晶联讯电子 液晶模块 JLX19296G-915-BN的主要内容,如果未能解决你的问题,请参考以下文章

屏幕模块 - 笔记深圳市晶联讯电子 液晶模块 JLX19296G-915-BN

笔记本的液晶屏擦洗的时候。。清洁液喷的过多。渗进去了怎么办?

3.2寸TFT液晶屏模块-ILI9341有啥特点

学习笔记:12864液晶模块的详细使用 (转载)

arduino通过SPI串口控制2.2寸TFT液晶屏模块

深圳WiFi方案公司 工控智能网关模块 数据传输模组 4G插卡路由器与4G手机连外网ping百度数据对比