/********************************************************************************************************************* * COPYRIGHT NOTICE * Copyright (c) 2020,逐飞科技 * All rights reserved. * 技术讨论QQ群:三群:824575535 * * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 * * @file 1.14寸IPS屏幕 * @company 成都逐飞科技有限公司 * @author 逐飞科技(QQ3184284598) * @version 查看doc内version文件 版本说明 * @Software ADS v1.2.2 * @Target core TC264D * @Taobao https://seekfree.taobao.com/ * @date 2020-3-23 * @note 接线定义: ------------------------------------ 模块管脚 单片机管脚 SCL 查看IPS114_SCL_PIN宏定义的引脚 硬件SPI引脚不可随意切换 SDA 查看IPS114_SDA_PIN宏定义的引脚 硬件SPI引脚不可随意切换 RES 查看IPS114_REST_PIN宏定义的引脚 DC 查看IPS114_DC_PIN宏定义的引脚 CS 查看IPS114_CS_PIN宏定义的引脚 硬件SPI引脚不可随意切换 电源引脚 BL 3.3V电源(背光控制引脚,也可以接PWM来控制亮度) VCC 3.3V电源 GND 电源地 最大分辨率135*240 ------------------------------------ ********************************************************************************************************************/ #include "zf_spi.h" #include "zf_gpio.h" #include "zf_assert.h" #include "zf_stm_systick.h" #include "SEEKFREE_PRINTF.h" #include "SEEKFREE_IPS114_SPI.h" //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 // @param void // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips114_writeIndex(uint8 dat) //写命令 { IPS114_DC(0); spi_mosi(IPS114_SPIN_PIN,IPS114_CS_PIN,&dat,&dat,1,1); } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 // @param void // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips114_writeData(uint8 dat) //写数据 { IPS114_DC(1); spi_mosi(IPS114_SPIN_PIN,IPS114_CS_PIN,&dat,&dat,1,1); } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 // @param void // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips114_writedata_16bit(uint16 dat) //向液晶屏写一个16位数据 { uint8 dat1[2]; dat1[0] = dat >> 8; dat1[1] = (uint8)dat; IPS114_DC(1); spi_mosi(IPS114_SPIN_PIN,IPS114_CS_PIN,dat1,dat1,2,1); //写入数据 高位在前 低位在后 } //------------------------------------------------------------------------------------------------------------------- // @brief 1.14寸 IPS液晶初始化 // @return void // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips114_init(void) { spi_init(IPS114_SPIN_PIN, IPS114_SCL_PIN, IPS114_SDA_PIN, IPS114_SDA_IN_PIN, IPS114_CS_PIN, 0, 48*1000*1000);//硬件SPI初始化 gpio_init(IPS114_BL_PIN,GPO,1,PUSHPULL); gpio_init(IPS114_DC_PIN,GPO,0,PUSHPULL); gpio_init(IPS114_REST_PIN,GPO,0,PUSHPULL); IPS114_REST(0); systick_delay_ms(STM0, 200); IPS114_REST(1); systick_delay_ms(STM0, 100); ips114_writeIndex(0x36); if (IPS114_DISPLAY_DIR==0) ips114_writeData(0x00); else if (IPS114_DISPLAY_DIR==1) ips114_writeData(0xC0); else if (IPS114_DISPLAY_DIR==2) ips114_writeData(0x70); else ips114_writeData(0xA0); ips114_writeIndex(0x3A); ips114_writeData(0x05); ips114_writeIndex(0xB2); ips114_writeData(0x0C); ips114_writeData(0x0C); ips114_writeData(0x00); ips114_writeData(0x33); ips114_writeData(0x33); ips114_writeIndex(0xB7); ips114_writeData(0x35); ips114_writeIndex(0xBB); ips114_writeData(0x37); ips114_writeIndex(0xC0); ips114_writeData(0x2C); ips114_writeIndex(0xC2); ips114_writeData(0x01); ips114_writeIndex(0xC3); ips114_writeData(0x12); ips114_writeIndex(0xC4); ips114_writeData(0x20); ips114_writeIndex(0xC6); ips114_writeData(0x0F); ips114_writeIndex(0xD0); ips114_writeData(0xA4); ips114_writeData(0xA1); ips114_writeIndex(0xE0); ips114_writeData(0xD0); ips114_writeData(0x04); ips114_writeData(0x0D); ips114_writeData(0x11); ips114_writeData(0x13); ips114_writeData(0x2B); ips114_writeData(0x3F); ips114_writeData(0x54); ips114_writeData(0x4C); ips114_writeData(0x18); ips114_writeData(0x0D); ips114_writeData(0x0B); ips114_writeData(0x1F); ips114_writeData(0x23); ips114_writeIndex(0xE1); ips114_writeData(0xD0); ips114_writeData(0x04); ips114_writeData(0x0C); ips114_writeData(0x11); ips114_writeData(0x13); ips114_writeData(0x2C); ips114_writeData(0x3F); ips114_writeData(0x44); ips114_writeData(0x51); ips114_writeData(0x2F); ips114_writeData(0x1F); ips114_writeData(0x1F); ips114_writeData(0x20); ips114_writeData(0x23); ips114_writeIndex(0x21); ips114_writeIndex(0x11); systick_delay_ms(STM0, 120); ips114_writeIndex(0x29); ips114_clear(IPS114_BGCOLOR); } void ips114_set_region(uint16 x1,uint16 y1,uint16 x2,uint16 y2) { if(IPS114_DISPLAY_DIR==0) { ips114_writeIndex(0x2a);//列地址设置 ips114_writedata_16bit(x1+52); ips114_writedata_16bit(x2+52); ips114_writeIndex(0x2b);//行地址设置 ips114_writedata_16bit(y1+40); ips114_writedata_16bit(y2+40); ips114_writeIndex(0x2c);//储存器写 } else if(IPS114_DISPLAY_DIR==1) { ips114_writeIndex(0x2a);//列地址设置 ips114_writedata_16bit(x1+53); ips114_writedata_16bit(x2+53); ips114_writeIndex(0x2b);//行地址设置 ips114_writedata_16bit(y1+40); ips114_writedata_16bit(y2+40); ips114_writeIndex(0x2c);//储存器写 } else if(IPS114_DISPLAY_DIR==2) { ips114_writeIndex(0x2a);//列地址设置 ips114_writedata_16bit(x1+40); ips114_writedata_16bit(x2+40); ips114_writeIndex(0x2b);//行地址设置 ips114_writedata_16bit(y1+53); ips114_writedata_16bit(y2+53); ips114_writeIndex(0x2c);//储存器写 } else { ips114_writeIndex(0x2a);//列地址设置 ips114_writedata_16bit(x1+40); ips114_writedata_16bit(x2+40); ips114_writeIndex(0x2b);//行地址设置 ips114_writedata_16bit(y1+52); ips114_writedata_16bit(y2+52); ips114_writeIndex(0x2c);//储存器写 } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶清屏函数 // @param color 颜色设置 // @return void // @since v1.0 // Sample usage: ips114_clear(YELLOW);// 全屏设置为黄色 //------------------------------------------------------------------------------------------------------------------- void ips114_clear(uint16 color) { uint16 i,j; ips114_set_region(0,0,IPS114_X_MAX-1,IPS114_Y_MAX-1); for(i=0;i>=1; } } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示字符串 // @param x 坐标x方向的起点 参数范围 0 -(IPS114_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(IPS114_Y_MAX/16-1) // @param dat 需要显示的字符串 // @return void // @since v1.0 // Sample usage: ips114_showstr(0,0,"seekfree"); //------------------------------------------------------------------------------------------------------------------- void ips114_showstr(uint16 x,uint16 y,const int8 dat[]) { uint16 j; j = 0; while(dat[j] != '\0') { ips114_showchar(x+8*j,y*16,dat[j]); j++; } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示8位有符号 // @param x 坐标x方向的起点 参数范围 0 -(IPS114_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(IPS114_Y_MAX/16-1) // @param dat 需要显示的变量,数据类型int8 // @return void // @since v1.0 // Sample usage: ips114_showint8(0,0,x);//x为int8类型 //------------------------------------------------------------------------------------------------------------------- void ips114_showint8(uint16 x,uint16 y,int8 dat) { uint8 a[3]; uint8 i; if(dat<0) { ips114_showchar(x,y*16,'-'); dat = -dat; } else ips114_showchar(x,y*16,' '); a[0] = dat/100; a[1] = dat/10%10; a[2] = dat%10; i = 0; while(i<3) { ips114_showchar(x+(8*(i+1)),y*16,'0' + a[i]); i++; } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示8位无符号 // @param x 坐标x方向的起点 参数范围 0 -(IPS114_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(IPS114_Y_MAX/16-1) // @param dat 需要显示的变量,数据类型uint8 // @return void // @since v1.0 // Sample usage: ips114_showuint8(0,0,x);//x为uint8类型 //------------------------------------------------------------------------------------------------------------------- void ips114_showuint8(uint16 x,uint16 y,uint8 dat) { uint8 a[3]; uint8 i; a[0] = dat/100; a[1] = dat/10%10; a[2] = dat%10; i = 0; while(i<3) { ips114_showchar(x+(8*i),y*16,'0' + a[i]); i++; } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示16位有符号 // @param x 坐标x方向的起点 参数范围 0 -(IPS114_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(IPS114_Y_MAX/16-1) // @param dat 需要显示的变量,数据类型int16 // @return void // @since v1.0 // Sample usage: ips114_showint16(0,0,x);//x为int16类型 //------------------------------------------------------------------------------------------------------------------- void ips114_showint16(uint16 x,uint16 y,int16 dat) { uint8 a[5]; uint8 i; if(dat<0) { ips114_showchar(x,y*16,'-'); dat = -dat; } else ips114_showchar(x,y*16,' '); a[0] = dat/10000; a[1] = dat/1000%10; a[2] = dat/100%10; a[3] = dat/10%10; a[4] = dat%10; i = 0; while(i<5) { ips114_showchar(x+(8*(i+1)),y*16,'0' + a[i]); i++; } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示16位无符号 // @param x 坐标x方向的起点 参数范围 0 -(IPS114_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(IPS114_Y_MAX/16-1) // @param dat 需要显示的变量,数据类型uint16 // @return void // @since v1.0 // Sample usage: ips114_showuint16(0,0,x);//x为uint16类型 //------------------------------------------------------------------------------------------------------------------- void ips114_showuint16(uint16 x,uint16 y,uint16 dat) { uint8 a[5]; uint8 i; a[0] = dat/10000; a[1] = dat/1000%10; a[2] = dat/100%10; a[3] = dat/10%10; a[4] = dat%10; i = 0; while(i<5) { ips114_showchar(x+(8*i),y*16,'0' + a[i]); i++; } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示32位有符号(去除整数部分无效的0) // @param x 坐标x方向的起点 参数范围 0 -(IPS114_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(IPS114_Y_MAX/16-1) // @param dat 需要显示的变量,数据类型uint32 // @param num 需要显示的位数 最高10位 不包含正负号 // @return void // @since v1.0 // Sample usage: ips114_showuint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 // Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 //------------------------------------------------------------------------------------------------------------------- void ips114_showint32(uint16 x,uint16 y,int32 dat,uint8 num) { int8 buff[34]; uint32 length; if(10dat) length = zf_sprintf( &buff[0],"%d",dat);//负数 else { buff[0] = ' '; length = zf_sprintf( &buff[1],"%d",dat); length++; } while(length < num) { buff[length] = ' '; length++; } buff[num] = '\0'; ips114_showstr(x, y, buff); //显示数字 } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示浮点数(去除整数部分无效的0) // @param x 坐标x方向的起点 参数范围 0 -(IPS114_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(IPS114_Y_MAX/16-1) // @param dat 需要显示的变量,数据类型float或double // @param num 整数位显示长度 最高10位 // @param pointnum 小数位显示长度 最高6位 // @return void // @since v1.0 // Sample usage: ips114_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 // @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 // 负数会显示一个 ‘-’号 正数显示一个空格 //------------------------------------------------------------------------------------------------------------------- void ips114_showfloat(uint16 x,uint16 y,double dat,uint8 num,uint8 pointnum) { uint32 length; int8 buff[34]; int8 start,end,point; if(6dat) length = zf_sprintf( &buff[0],"%f",dat);//负数 else { length = zf_sprintf( &buff[1],"%f",dat); length++; } point = (int8)(length - 7); //计算小数点位置 start = point - num - 1; //计算起始位 end = point + pointnum + 1; //计算结束位 while(0>start)//整数位不够 末尾应该填充空格 { buff[end] = ' '; end++; start++; } if(0>dat) buff[start] = '-'; else buff[start] = ' '; buff[end] = '\0'; ips114_showstr(x, y, buff); //显示数字 } //------------------------------------------------------------------------------------------------------------------- // @brief 总钻风(灰度摄像头)液晶显示函数 // @param *p 图像数组地址 // @param width 图像宽度 // @param height 图像高度 // @return void // @since v1.0 // Sample usage: ips114_displayimage032(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 // @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 //------------------------------------------------------------------------------------------------------------------- void ips114_displayimage032(uint8 *p, uint16 width, uint16 height) { uint32 i,j; uint16 color = 0; uint16 temp = 0; uint16 coord_x = 0; uint16 coord_y = 0; coord_x = width>IPS114_X_MAX?IPS114_X_MAX:width; coord_y = height>IPS114_Y_MAX?IPS114_Y_MAX:height; ips114_set_region(0,0,coord_x-1,coord_y-1); for(j=0;j>3))<<11; color=color|(((0x003f)&((temp)>>2))<<5); color=color|(0x001f&((temp)>>3)); ips114_writedata_16bit(color); } } } //------------------------------------------------------------------------------------------------------------------- // @brief 总钻风(灰度摄像头)液晶缩放显示函数 // @param *p 图像数组地址 // @param width 图像宽度 // @param height 图像高度 // @param dis_width 图像显示宽度 1 -(IPS114_X_MAX) // @param dis_height 图像显示高度 1 -(IPS114_Y_MAX) // @return void // @since v1.0 // Sample usage: ips114_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 // @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 //------------------------------------------------------------------------------------------------------------------- void ips114_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { uint32 i,j; uint16 color = 0; uint16 temp = 0; ips114_set_region(0,0,dis_width-1,dis_height-1);//设置显示区域 for(j=0;j>3))<<11; color=color|(((0x003f)&((temp)>>2))<<5); color=color|(0x001f&((temp)>>3)); ips114_writedata_16bit(color); } } } //------------------------------------------------------------------------------------------------------------------- // @brief 总钻风(灰度摄像头)液晶缩放显示函数 // @param *p 图像数组地址 // @param width 图像宽度 // @param height 图像高度 // @param start_x 设置显示起点的x轴坐标 // @param start_y 设置显示起点的y轴坐标 // @param dis_width 图像显示宽度 1 -(IPS114_X_MAX) // @param dis_height 图像显示高度 1 -(IPS114_Y_MAX) // @return void // @since v1.0 // Sample usage: ips114_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 //------------------------------------------------------------------------------------------------------------------- void ips114_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height) { uint32 i,j; uint16 color = 0; uint16 temp = 0; //检查设置的参数是否超过屏幕的分辨率 if((start_x+dis_width)>IPS114_X_MAX) ZF_ASSERT(0); if((start_y+dis_height)>IPS114_Y_MAX) ZF_ASSERT(0); ips114_set_region(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 for(j=0;j>3))<<11; color=color|(((0x003f)&((temp)>>2))<<5); color=color|(0x001f&((temp)>>3)); ips114_writedata_16bit(color); } } } //------------------------------------------------------------------------------------------------------------------- // @brief 凌瞳(彩色摄像头)液晶缩放显示函数 // @param *p 图像数组地址 // @param width 图像宽度 // @param height 图像高度 // @param dis_width 图像显示宽度 0 -(TFT_X_MAX-1) // @param dis_height 图像显示高度 0 -(TFT_Y_MAX-1) // @return void // @since v1.0 // Sample usage: ips114_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头 图像 // @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 //------------------------------------------------------------------------------------------------------------------- void ips114_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { uint32 i,j; uint16 color = 0; ips114_set_region(0,0,dis_width-1,dis_height-1);//设置显示区域 for(j=0;j>8); ips114_writedata_16bit(color); } } } //------------------------------------------------------------------------------------------------------------------- // @brief 凌瞳(彩色摄像头)液晶缩放显示函数 // @param *p 图像数组地址 // @param width 图像宽度 // @param height 图像高度 // @param start_x 设置显示起点的x轴坐标 // @param start_y 设置显示起点的y轴坐标 // @param dis_width 图像显示宽度 1 -(TFT_X_MAX) // @param dis_height 图像显示高度 1 -(TFT_Y_MAX) // @return void // @since v1.0 // Sample usage: ips114_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); //------------------------------------------------------------------------------------------------------------------- void ips114_displayimage8660_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height) { uint32 i,j; uint16 color = 0; //检查设置的参数是否超过屏幕的分辨率 if((start_x+dis_width)>IPS114_X_MAX) ZF_ASSERT(0); if((start_y+dis_height)>IPS114_Y_MAX) ZF_ASSERT(0); ips114_set_region(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 for(j=0;j>8); ips114_writedata_16bit(color); } } } //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风(二值化摄像头)液晶显示函数 // @param *p 图像数组地址 // @param width 图像宽度 // @param height 图像高度 // @return void // @since v1.0 // @note 图像分辨率需要设置在120(高)*160(宽)以下 //------------------------------------------------------------------------------------------------------------------- void ips114_displayimage7725(uint8 *p, uint16 width, uint16 height) { int i,j; uint16 temp = 0; ips114_set_region(0,0,width-1,height-1); for(i=0;i0;j--) { temp = (*p_data>>(j-1)) & 0x01; if(temp) ips114_writedata_16bit(color); else ips114_writedata_16bit(IPS114_BGCOLOR); } p_data++; } p_data = p_data - temp2 + temp2*size; } } }