/********************************************************************************************************************* * COPYRIGHT NOTICE * Copyright (c) 2020,逐飞科技 * All rights reserved. * 技术讨论QQ群:三群:824575535 * * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 * * @file 1.8寸TFT * @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 查看TFT_SCL宏定义的引脚 硬件SPI引脚不可随意切换 SDA 查看TFT_SDA宏定义的引脚 硬件SPI引脚不可随意切换 RES 查看REST_PIN宏定义的引脚 DC 查看DC_PIN宏定义的引脚 CS 查看TFT_CS宏定义的引脚 硬件SPI引脚不可随意切换 电源引脚 BL 3.3V电源(背光控制引脚,也可以接PWM来控制亮度) VCC 3.3V电源 GND 电源地 最大分辨率128*160 ------------------------------------ ********************************************************************************************************************/ #include "zf_spi.h" #include "zf_gpio.h" #include "zf_assert.h" #include "zf_stm_systick.h" #include "SEEKFREE_PRINTF.h" #include "SEEKFREE_18TFT.h" void lcd_writeIndex(uint8 dat) //写命令 { DC(0); spi_mosi(TFT_SPIN,TFT_CS,&dat,&dat,1,1); } void lcd_writeData(uint8 dat) //写数据 { DC(1); spi_mosi(TFT_SPIN,TFT_CS,&dat,&dat,1,1); } void lcd_writedata_16bit(uint16 dat) //向液晶屏写一个16位数据 { uint8 dat1[2]; dat1[0] = dat >> 8; dat1[1] = (uint8)dat; DC(1); spi_mosi(TFT_SPIN,TFT_CS,dat1,dat1,2,1); //写入数据 高位在前 低位在后 } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶坐标设置 // @param x_start 坐标x方向的起点 // @param y_start 坐标y方向的起点 // @param x_end 坐标x方向的终点 // @param y_end 坐标y方向的终点 // @return void // @since v1.0 // Sample usage: lcd_set_region(0,0,10,10);// x、y的起点都是0,终点都是10 //------------------------------------------------------------------------------------------------------------------- void lcd_set_region(unsigned int x_start,unsigned int y_start,unsigned int x_end,unsigned int y_end) { ZF_ASSERT(TFT_X_MAX>x_start);//参数断言,进入断言标志参数超出范围 ZF_ASSERT(TFT_Y_MAX>y_start); ZF_ASSERT(TFT_X_MAX>x_end); ZF_ASSERT(TFT_Y_MAX>y_end); #if (0 == TFT_DISPLAY_DIR || 1 == TFT_DISPLAY_DIR) lcd_writeIndex(0x2a); lcd_writeData(0x00); lcd_writeData(x_start+2); lcd_writeData(0x00); lcd_writeData(x_end+2); lcd_writeIndex(0x2b); lcd_writeData(0x00); lcd_writeData(y_start+1); lcd_writeData(0x00); lcd_writeData(y_end+1); #elif(2 == TFT_DISPLAY_DIR || 3 == TFT_DISPLAY_DIR) lcd_writeIndex(0x2a); lcd_writeData(0x00); lcd_writeData(x_start+1); lcd_writeData(0x0); lcd_writeData(x_end+1); lcd_writeIndex(0x2b); lcd_writeData(0x00); lcd_writeData(y_start+2); lcd_writeData(0x00); lcd_writeData(y_end+2); #endif lcd_writeIndex(0x2c); } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶清屏函数 // @param color 颜色设置 // @return void // @since v1.0 // Sample usage: lcd_clear(YELLOW);// 全屏设置为黄色 //------------------------------------------------------------------------------------------------------------------- void lcd_clear(uint16 color) { uint8 i,j; lcd_set_region(0,0,TFT_X_MAX-1,TFT_Y_MAX-1); for (i=0;i>=1; } } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示字符串 // @param x 坐标x方向的起点 参数范围 0 -(TFT_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(TFT_Y_MAX/16-1) // @param dat 需要显示的字符串 // @return void // @since v1.0 // Sample usage: lcd_showstr(0,0,"seekfree"); //------------------------------------------------------------------------------------------------------------------- void lcd_showstr(uint16 x,uint16 y,const int8 dat[]) { uint16 j; j = 0; while(dat[j] != '\0') { lcd_showchar(x+8*j,y*16,dat[j]); j++; } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示8位有符号 // @param x 坐标x方向的起点 参数范围 0 -(TFT_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(TFT_Y_MAX/16-1) // @param dat 需要显示的变量,数据类型int8 // @return void // @since v1.0 // Sample usage: lcd_showint8(0,0,x);//x为int8类型 //------------------------------------------------------------------------------------------------------------------- void lcd_showint8(uint16 x,uint16 y,int8 dat) { uint8 a[3]; uint8 i; if(dat<0) { lcd_showchar(x,y*16,'-'); dat = -dat; } else lcd_showchar(x,y*16,' '); a[0] = dat/100; a[1] = dat/10%10; a[2] = dat%10; i = 0; while(i<3) { lcd_showchar(x+(8*(i+1)),y*16,'0' + a[i]); i++; } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示8位无符号 // @param x 坐标x方向的起点 参数范围 0 -(TFT_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(TFT_Y_MAX/16-1) // @param dat 需要显示的变量,数据类型uint8 // @return void // @since v1.0 // Sample usage: lcd_showuint8(0,0,x);//x为uint8类型 //------------------------------------------------------------------------------------------------------------------- void lcd_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) { lcd_showchar(x+(8*i),y*16,'0' + a[i]); i++; } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示16位有符号 // @param x 坐标x方向的起点 参数范围 0 -(TFT_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(TFT_Y_MAX/16-1) // @param dat 需要显示的变量,数据类型int16 // @return void // @since v1.0 // Sample usage: lcd_showint16(0,0,x);//x为int16类型 //------------------------------------------------------------------------------------------------------------------- void lcd_showint16(uint16 x,uint16 y,int16 dat) { uint8 a[5]; uint8 i; if(dat<0) { lcd_showchar(x,y*16,'-'); dat = -dat; } else lcd_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) { lcd_showchar(x+(8*(i+1)),y*16,'0' + a[i]); i++; } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示16位无符号 // @param x 坐标x方向的起点 参数范围 0 -(TFT_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(TFT_Y_MAX/16-1) // @param dat 需要显示的变量,数据类型uint16 // @return void // @since v1.0 // Sample usage: lcd_showuint16(0,0,x);//x为uint16类型 //------------------------------------------------------------------------------------------------------------------- void lcd_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) { lcd_showchar(x+(8*i),y*16,'0' + a[i]); i++; } } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示32位有符号(去除整数部分无效的0) // @param x 坐标x方向的起点 参数范围 0 -(TFT_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(TFT_Y_MAX/16-1) // @param dat 需要显示的变量,数据类型uint32 // @param num 需要显示的位数 最高10位 不包含正负号 // @return void // @since v1.0 // Sample usage: lcd_showuint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 // Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 //------------------------------------------------------------------------------------------------------------------- void lcd_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'; lcd_showstr(x, y, buff); //显示数字 } //------------------------------------------------------------------------------------------------------------------- // @brief 液晶显示浮点数(去除整数部分无效的0) // @param x 坐标x方向的起点 参数范围 0 -(TFT_X_MAX-1) // @param y 坐标y方向的起点 参数范围 0 -(TFT_Y_MAX/16-1) // @param dat 需要显示的变量,数据类型float或double // @param num 整数位显示长度 最高10位 // @param pointnum 小数位显示长度 最高6位 // @return void // @since v1.0 // Sample usage: lcd_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 // @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, // 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, // 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 // 负数会显示一个 ‘-’号 正数显示一个空格 //------------------------------------------------------------------------------------------------------------------- void lcd_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'; lcd_showstr(x, y, buff); //显示数字 } //------------------------------------------------------------------------------------------------------------------- // @brief 显示40*40 QQ图片 // @param *p 图像数组地址 // @return void // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; lcd_clear(WHITE); //清屏 for(k=0;k<4;k++) { for(j=0;j<3;j++) { lcd_set_region(40*j,40*k,40*j+39,40*k+39); //坐标设置 for(i=0;i<40*40;i++) { picL=*(p+i*2); //数据低位在前 picH=*(p+i*2+1); lcd_writedata_16bit(picH<<8|picL); } } } } //------------------------------------------------------------------------------------------------------------------- // @brief 总钻风(灰度摄像头)液晶显示函数 // @param *p 图像数组地址 // @param width 图像宽度 // @param height 图像高度 // @return void // @since v1.0 // Sample usage: lcd_displayimage032(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 // @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 //------------------------------------------------------------------------------------------------------------------- void lcd_displayimage032(uint8 *p, uint16 width, uint16 height) { uint32 i,j; uint16 color = 0; uint16 temp = 0; uint16 coord_x = 0; uint16 coord_y = 0; if(0==TFT_DISPLAY_DIR || 1==TFT_DISPLAY_DIR)//竖屏 { coord_x = height>TFT_X_MAX?TFT_X_MAX:height; coord_y = width>TFT_Y_MAX?TFT_Y_MAX:width; for(j=0;j>3))<<11; color=color|(((0x003f)&((temp)>>2))<<5); color=color|(0x001f&((temp)>>3)); lcd_writedata_16bit(color); } } } else//横屏 { coord_x = width>TFT_X_MAX?TFT_X_MAX:width; coord_y = height>TFT_Y_MAX?TFT_Y_MAX:height; lcd_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)); lcd_writedata_16bit(color); } } } } //------------------------------------------------------------------------------------------------------------------- // @brief 总钻风(灰度摄像头)液晶缩放显示函数 // @param *p 图像数组地址 // @param width 图像宽度 // @param height 图像高度 // @param dis_width 图像显示宽度 1 -(TFT_X_MAX) // @param dis_height 图像显示高度 1 -(TFT_Y_MAX) // @return void // @since v1.0 // Sample usage: lcd_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, 160, 120)//显示灰度摄像头 图像 // @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 //------------------------------------------------------------------------------------------------------------------- void lcd_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { uint32 i,j; uint16 color = 0; uint16 temp = 0; lcd_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)); lcd_writedata_16bit(color); } } } //------------------------------------------------------------------------------------------------------------------- // @brief 凌瞳(彩色摄像头)液晶缩放显示函数 // @param *p 图像数组地址 // @param width 图像宽度 // @param height 图像高度 // @param dis_width 图像显示宽度 1 -(TFT_X_MAX) // @param dis_height 图像显示高度 1 -(TFT_Y_MAX) // @return void // @since v1.0 // Sample usage: lcd_displayimage8660_zoom(scc8660_csi_image[0],SCC8660_CSI_PIC_W,SCC8660_CSI_PIC_H,160,128); // @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 //------------------------------------------------------------------------------------------------------------------- void lcd_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) { uint32 i,j; uint16 color = 0; lcd_set_region(0,0,dis_width-1,dis_height-1);//设置显示区域 for(j=0;j>8); lcd_writedata_16bit(color); } } } //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风(二值化摄像头)液晶显示函数 // @param *p 图像数组地址 // @param width 图像宽度 // @param height 图像高度 // @return void // @since v1.0 // @note 图像分辨率需要设置在120(高)*160(宽)以下 //------------------------------------------------------------------------------------------------------------------- void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) { int i,j; uint16 temp = 0; lcd_set_region(0,0,width-1,height-1); for(i=0;i0;j--) { temp = (*p_data>>(j-1)) & 0x01; if(temp) lcd_writedata_16bit(color); else lcd_writedata_16bit(TFT_BGCOLOR); } p_data++; } p_data = p_data - temp2 + temp2*size; } } }