RA8875存取周期 初始化完成后,通过调用RA8875_Clear(RED);来验证我们的移植是否正确,若液晶没有显示颜色,可以通过读取RA8875_Init()中初始化的寄存器是否都正确的初始化了,大部分情况下,都是因为IO没有对应上或接线错误引起的。 如果你的板卡没有FSMC,那么接下来的改动就比较大了。下面我们以旺宝电子的金龙107开发板为例,讲解如何用普通IO来驱动我们的7寸屏。 要驱动7寸屏,有几个重要的基础函数, RA8875_WriteCmd(uint8_t RegAddr) RA8875_WriteData(uint8_t RegValue) uint16_t RA8875_ReadData16(void) 第一个函数是写命令 /**************************************************************** ** Function name: voidRA8875_WriteCmd(uint8_t RegAddr) ** Descriptions: 写RA8875指令寄存器 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无 ***************************************************************/ static void RA8875_WriteCmd(uint8_t RegAddr) { LCD_CS(0); //拉低片选段CS LCD_RD(1); //读失能 LCD_RS(1); //写入的是命令 LCD_WR(0); //拉低写入的引脚,准备写入 GPIO_Write(LCD_DATA_GPIO, RegAddr); //写入命令 RA8875_Delaly200us(); LCD_WR(1); //拉高写入的引脚,写入命令 LCD_CS(1); //拉高片选段CS } 第二个是写数据 /******************************************************************* ** Function name: void RA8875_WriteData(uint8_t RegValue) ** Descriptions: 写RA8875数据 ** input parameters: RegValue: 寄存器值 ** output parameters: 无 ** Returned value: 无 ******************************************************************/ static void RA8875_WriteData(uint8_tRegValue) { LCD_CS(0); //拉低片选段CS LCD_RD(1); //读失能 LCD_RS(0); //写入的是数据 LCD_WR(0); //拉低写入的引脚,准备写入 GPIO_Write(LCD_DATA_GPIO,RegValue);//写入数据 RA8875_Delaly200us(); LCD_WR(1); //拉高写入的引脚,写入数据 LCD_CS(1); //拉高片选段CS } 第三个是读数据 /******************************************************************** ** Function name: uint16_tRA8875_ReadData16(void) ** Descriptions: 读RA8875显存,16bit RGB ** input parameters: 无 ** output parameters: 无 ** Returned value: 读取的数据 ********************************************************************/ static uint16_t RA8875_ReadData16(void) { //IO应设为输入模式,此处省略 LCD_CS(0); //拉低片选段CS LCD_RD(0); //拉低读取的引脚,准备读取数据 LCD_RS(0); //读取的是数据 LCD_WR(1); RA8875_Delaly1ms(); t=GPIO_ReadInputData(LCD_DATA_GPIO); //读取数据 //设为输出,此处省略 } 按上面的时序写好后,就可以封装几个函数来初始化8875的寄存器了 /**************************************************************** ** Function name: voidRA8875_WriteReg(uint8_t RegAddr, uint8_t RegValue) ** Descriptions: 写RA8875寄存器 ** input parameters: RegAddr:寄存器地址 RegValue:要写入的数据 ** output parameters: 无 ** Returned value: 无 *****************************************************************/ static void RA8875_WriteReg(uint8_t RegAddr, uint8_t RegValue) { RA8875_WriteCmd(RegAddr); RA8875_WriteData(RegValue); } /****************************************************************** ** Function name: uint8_tRA8875_ReadReg(uint8_t RegAddr) ** Descriptions: 读RA8875寄存器 ** input parameters: RegAddr:寄存器地址 ** output parameters: 无 ** Returned value: 读取的寄存器值 ********************************************************************/ static uint8_t RA8875_ReadReg(uint8_t RegAddr) { uint8_t value; RA8875_WriteCmd(RegAddr); //设置寄存器地址 value = (uint8_t)RA8875_ReadData16(); // 读取寄存器值 return value; 初始化8875 /******************************************************************* ** Function name: voidRA8875_InitHard(void) ** Descriptions: 初始化RA8875驱动芯片 ** input parameters: 无 ** output parameters: 无 ** Returned value: 无 ********************************************************************/ void RA8875_InitHard(void) { //此处省略控制LCD的IO配置 RA8875_WriteCmd(0x88); // 初始化PLL. 晶振频率为25M RA8875_Delaly1us(); // 延迟1us RA8875_WriteData(12); //PLLDIVM [7] = 0 ; PLLDIVN [4:0] = 10 RA8875_Delaly1ms(); RA8875_WriteCmd(0x89); RA8875_Delaly1us(); RA8875_WriteData(2); //PLLDIVK[2:0] = 2, 除以4 RA8875_Delaly1ms(); //为保证PLL 输出稳定,须等待一段(< 100us) RA8875_WriteReg(0x10, (1 <<3) | (1 << 1));// 16位MCU并口,65K色 RA8875_WriteReg(0x04, 0x81); RA8875_Delaly1ms(); RA8875_WriteReg(0x14, 0x63); RA8875_WriteReg(0x15, 0x00); RA8875_WriteReg(0x16, 0x03); RA8875_WriteReg(0x17, 0x03); RA8875_WriteReg(0x18, 0x0B); RA8875_WriteReg(0x19, 0xDF); RA8875_WriteReg(0x1A, 0x01); RA8875_WriteReg(0x1B, 0x1F); RA8875_WriteReg(0x1C, 0x00); RA8875_WriteReg(0x1D, 0x16); RA8875_WriteReg(0x1E, 0x00); RA8875_WriteReg(0x1F, 0x01); RA8875_WriteReg(0xC7, 0x01); RA8875_WriteReg(0x01, 0x80); RA8875_WriteReg(0x40, 0x01); // 选择绘图模式 RA8875_WriteReg(0x41, 0x00); //选择绘图模式, 目的为CGRAM RA8875_SetDispWin(0, 0,LCD_HEIGHT, LCD_WIDTH); RA8875_WriteReg(0x20, (1 <<3)); // 水平扫描方向设定 //RA8875_WriteReg(0x20, (1 <<2)); // 垂直扫描方向设定 } 初始化完后可以通过调用RA8875_ReadReg来读取初始化的寄存器是否都被正确的配置了,如果是,那么可以调用RA8875_Clear(RED),颜色正常显示的话,说明移植成功了;若读回的寄存器没有被正确的初始化,那么就要检查下自己的连接线会不会有出错和IO是否可以正常操作。 3、背光控制 要实现背光控制,需要把R23拆下,因RA8875带PWM输出,所以在LCD初始化完后,可以调用RA8875_SetBackLight(uint8_t right)来控制液晶的背光。 /******************************************************************** ** Functionname: voidRA8875_SetBackLight(uint8_t right) **Descriptions: 配置RA8875芯片的PWM1相关寄存器,控制LCD背光 ** inputparameters: right : 亮度0~255 ** outputparameters: 无 ** Returnedvalue: 无 ********************************************************************/ void RA8875_SetBackLight(uint8_tright) { if(right == 0) { RA8875_WriteReg(0x8A, 0 << 6); //关闭PWM, PWM1引脚缺省输出0 } elseif (right == BRIGHT_MAX) //最大亮度 { RA8875_WriteReg(0x8A, 1 << 6); //关闭PWM, PWM1引脚缺省输出1 } else { RA8875_WriteReg(0x8A,(1 << 7) | 7); //PWM频率为2.4k RA8875_WriteReg(0x8B, right); } } 如果设置背光后有波纹,可通过提高PWM的频率解决。
|