diff --git a/Example/ADC_Demo/Libraries/doc/version.txt b/Example/ADC_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/ADC_Demo/Libraries/doc/version.txt +++ b/Example/ADC_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/ADC_Demo/Libraries/seekfree_libraries/headfile.h b/Example/ADC_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/ADC_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/ADC_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/ADC_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/ADC_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/ADC_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/ADC_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); @@ -69,67 +63,94 @@ void ips200_w_data(uint8 dat) //写 //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param command 命令 // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips200_wr_reg(uint8 command) //写命令 { - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param dat 8位数据 // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 { - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param dat 16位数据 // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 { - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param com 命令 +// @param dat 数据 // @return // @since v1.0 // Sample usage: @@ -143,8 +164,11 @@ void ips200_w_reg(uint8 com,uint8 dat) //写 //------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 // @return // @since v1.0 // Sample usage: @@ -165,28 +189,42 @@ void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) //------------------------------------------------------------------------------------------------------------------- // @brief 2.0寸 IPS液晶初始化 -// @return void +// @return type_select 并口或者串口选择 // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) +void ips200_init(ips200_type_enum type_select) { - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } IPS200_BL(1); IPS200_RST(0); systick_delay_ms(STM0, 5); @@ -203,9 +241,6 @@ void ips200_init(void) else ips200_wr_data(0xA0); - - - ips200_wr_reg(0x3A); ips200_wr_data(0x05); @@ -276,7 +311,7 @@ void ips200_init(void) ips200_wr_reg(0x21); ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 } @@ -844,8 +879,8 @@ void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/doc/version.txt b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/doc/version.txt +++ b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); @@ -69,67 +63,94 @@ void ips200_w_data(uint8 dat) //写 //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param command 命令 // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips200_wr_reg(uint8 command) //写命令 { - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param dat 8位数据 // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 { - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param dat 16位数据 // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 { - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param com 命令 +// @param dat 数据 // @return // @since v1.0 // Sample usage: @@ -143,8 +164,11 @@ void ips200_w_reg(uint8 com,uint8 dat) //写 //------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 // @return // @since v1.0 // Sample usage: @@ -165,28 +189,42 @@ void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) //------------------------------------------------------------------------------------------------------------------- // @brief 2.0寸 IPS液晶初始化 -// @return void +// @return type_select 并口或者串口选择 // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) +void ips200_init(ips200_type_enum type_select) { - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } IPS200_BL(1); IPS200_RST(0); systick_delay_ms(STM0, 5); @@ -203,9 +241,6 @@ void ips200_init(void) else ips200_wr_data(0xA0); - - - ips200_wr_reg(0x3A); ips200_wr_data(0x05); @@ -276,7 +311,7 @@ void ips200_init(void) ips200_wr_reg(0x21); ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 } @@ -844,8 +879,8 @@ void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/Dual_Core_Demo/Libraries/doc/version.txt b/Example/Dual_Core_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/Dual_Core_Demo/Libraries/doc/version.txt +++ b/Example/Dual_Core_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/Dual_Core_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Dual_Core_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/Dual_Core_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Dual_Core_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/Dual_Core_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/Dual_Core_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/Dual_Core_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/Dual_Core_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); @@ -69,67 +63,94 @@ void ips200_w_data(uint8 dat) //写 //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param command 命令 // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips200_wr_reg(uint8 command) //写命令 { - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param dat 8位数据 // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 { - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param dat 16位数据 // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 { - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param com 命令 +// @param dat 数据 // @return // @since v1.0 // Sample usage: @@ -143,8 +164,11 @@ void ips200_w_reg(uint8 com,uint8 dat) //写 //------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 // @return // @since v1.0 // Sample usage: @@ -165,28 +189,42 @@ void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) //------------------------------------------------------------------------------------------------------------------- // @brief 2.0寸 IPS液晶初始化 -// @return void +// @return type_select 并口或者串口选择 // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) +void ips200_init(ips200_type_enum type_select) { - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } IPS200_BL(1); IPS200_RST(0); systick_delay_ms(STM0, 5); @@ -203,9 +241,6 @@ void ips200_init(void) else ips200_wr_data(0xA0); - - - ips200_wr_reg(0x3A); ips200_wr_data(0x05); @@ -276,7 +311,7 @@ void ips200_init(void) ips200_wr_reg(0x21); ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 } @@ -844,8 +879,8 @@ void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/EEPROM_Demo/Libraries/doc/version.txt b/Example/EEPROM_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/EEPROM_Demo/Libraries/doc/version.txt +++ b/Example/EEPROM_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/EEPROM_Demo/Libraries/seekfree_libraries/headfile.h b/Example/EEPROM_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/EEPROM_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/EEPROM_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/EEPROM_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/EEPROM_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/EEPROM_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/EEPROM_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); @@ -69,67 +63,94 @@ void ips200_w_data(uint8 dat) //写 //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param command 命令 // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips200_wr_reg(uint8 command) //写命令 { - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param dat 8位数据 // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 { - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param dat 16位数据 // @return // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 { - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } } //------------------------------------------------------------------------------------------------------------------- // @brief 内部调用,用户无需关心 -// @param void +// @param com 命令 +// @param dat 数据 // @return // @since v1.0 // Sample usage: @@ -143,8 +164,11 @@ void ips200_w_reg(uint8 com,uint8 dat) //写 //------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 // @return // @since v1.0 // Sample usage: @@ -165,28 +189,42 @@ void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) //------------------------------------------------------------------------------------------------------------------- // @brief 2.0寸 IPS液晶初始化 -// @return void +// @return type_select 并口或者串口选择 // @since v1.0 // Sample usage: //------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) +void ips200_init(ips200_type_enum type_select) { - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } IPS200_BL(1); IPS200_RST(0); systick_delay_ms(STM0, 5); @@ -203,9 +241,6 @@ void ips200_init(void) else ips200_wr_data(0xA0); - - - ips200_wr_reg(0x3A); ips200_wr_data(0x05); @@ -276,7 +311,7 @@ void ips200_init(void) ips200_wr_reg(0x21); ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 } @@ -844,8 +879,8 @@ void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/Encoder_Demo/Libraries/doc/version.txt b/Example/Encoder_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/Encoder_Demo/Libraries/doc/version.txt +++ b/Example/Encoder_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/Encoder_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Encoder_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/Encoder_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Encoder_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/Encoder_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/Encoder_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/Encoder_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/Encoder_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param command 命令 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_reg(uint8 command) //写命令 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 8位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 16位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param com 命令 +// @param dat 数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 +{ + ips200_wr_reg(com); + ips200_wr_data(dat); +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) +{ + ips200_wr_reg(0x2a); + ips200_wr_data16(x1); + ips200_wr_data16(x2); + + ips200_wr_reg(0x2b); + ips200_wr_data16(y1); + ips200_wr_data16(y2); + + ips200_wr_reg(0x2c); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 2.0寸 IPS液晶初始化 +// @return type_select 并口或者串口选择 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_init(ips200_type_enum type_select) +{ + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } + IPS200_BL(1); + IPS200_RST(0); + systick_delay_ms(STM0, 5); + IPS200_RST(1); + systick_delay_ms(STM0, 5); + + ips200_wr_reg(0x11); + systick_delay_ms(STM0, 120); + + ips200_wr_reg(0x36); + if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); + else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); + else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); + else ips200_wr_data(0xA0); + + + ips200_wr_reg(0x3A); + ips200_wr_data(0x05); + + ips200_wr_reg(0xB2); + ips200_wr_data(0x0C); + ips200_wr_data(0x0C); + ips200_wr_data(0x00); + ips200_wr_data(0x33); + ips200_wr_data(0x33); + + ips200_wr_reg(0xB7); + ips200_wr_data(0x35); + + ips200_wr_reg(0xBB); + ips200_wr_data(0x29); //32 Vcom=1.35V + + ips200_wr_reg(0xC2); + ips200_wr_data(0x01); + + ips200_wr_reg(0xC3); + ips200_wr_data(0x19); //GVDD=4.8V + + ips200_wr_reg(0xC4); + ips200_wr_data(0x20); //VDV, 0x20:0v + + ips200_wr_reg(0xC5); + ips200_wr_data(0x1A);//VCOM Offset Set + + ips200_wr_reg(0xC6); + ips200_wr_data(0x01F); //0x0F:60Hz + + ips200_wr_reg(0xD0); + ips200_wr_data(0xA4); + ips200_wr_data(0xA1); + + ips200_wr_reg(0xE0); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x05); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0xE1); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0x21); + + ips200_wr_reg(0x29); + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶清屏函数 +// @param color 颜色设置 +// @return void +// @since v1.0 +// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 +//------------------------------------------------------------------------------------------------------------------- +void ips200_clear(uint16 color) +{ + uint16 i,j; + ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); + for(i=0;i>=1; + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示字符串 +// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) +// @param dat 需要显示的字符串 +// @return void +// @since v1.0 +// Sample usage: ips200_showstr(0,0,"seekfree"); +//------------------------------------------------------------------------------------------------------------------- +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) +{ + uint16 j; + + j = 0; + while(dat[j] != '\0') + { + ips200_showchar(x+8*j,y*16,dat[j]); + j++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int8 +// @return void +// @since v1.0 +// Sample usage: ips200_showint8(0,0,x);//x为int8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint8(uint16 x,uint16 y,int8 dat) +{ + uint8 a[3]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_showchar(x,y*16,' '); + + a[0] = dat/100; + a[1] = dat/10%10; + a[2] = dat%10; + i = 0; + while(i<3) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint8 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int16 +// @return void +// @since v1.0 +// Sample usage: ips200_showint16(0,0,x);//x为int16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint16(uint16 x,uint16 y,int16 dat) +{ + uint8 a[5]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_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) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint16 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示32位有符号(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint32(uint16 x,uint16 y,int 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示浮点数(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param w 图像宽度 +// @param l 图像高度 +// @param *p 图像数组地址 +// @return void +// @since v1.0 +// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) +{ + int i; + unsigned char picH,picL; + ips200_address_set(x,y,x+w-1,y+l-1); + for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; + coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 总钻风(灰度摄像头)液晶缩放显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) +// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) +// @return void +// @since v1.0 +// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + + ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风(二值化摄像头)液晶显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @return void +// @since v1.0 +// @note 图像分辨率需要设置在120(高)*160(宽)以下 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) +{ + int i,j; + + uint16 temp = 0; + ips200_address_set(0,0,width-1,height-1); + for(i=0;i0;j--) + { + temp = (*p_data>>(j-1)) & 0x01; + if(temp) ips200_wr_data16(color); + else ips200_wr_data16(IPS200_BGCOLOR); + } + p_data++; + } + p_data = p_data - temp2 + temp2*size; + } + } +} diff --git a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h new file mode 100644 index 0000000..df01216 --- /dev/null +++ b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h @@ -0,0 +1,199 @@ + +/*/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file 2.0寸IPS屏幕 + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software ADS v1.5.2 + * @Target core TC264 + * @Taobao https://seekfree.taobao.com/ + * @date 2020-05-07 + * @note + 接线定义: + ------------------------------------ +* 模块管脚 单片机管脚 +* // 双排排针 并口两寸屏 硬件引脚 +* RD 查看 SEEKFREE_IPS200.h 中 IPS200_RD_PIN_PARALLEL8 宏定义 +* WR 查看 SEEKFREE_IPS200.h 中 IPS200_WR_PIN_PARALLEL8 宏定义 +* RS 查看 SEEKFREE_IPS200.h 中 IPS200_RS_PIN_PARALLEL8 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_PARALLEL8 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_PARALLEL8 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_PARALLEL8 宏定义 +* D0-D7 查看 SEEKFREE_IPS200.h 中 IPS200_Dx_PIN_PARALLEL8 宏定义 +* // 单排排针 SPI 两寸屏 硬件引脚 +* SCL 查看 SEEKFREE_IPS200.h 中 IPS200_SCL_PIN_SPI 宏定义 +* SDA 查看 SEEKFREE_IPS200.h 中 IPS200_SDA_PIN_SPI 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_SPI 宏定义 +* DC 查看 SEEKFREE_IPS200.h 中 IPS200_DC_PIN_SPI 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_SPI 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_SPI 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 最大分辨率 320 * 240 +* ------------------------------------ + + ********************************************************************************************************************/ + +#ifndef _SEEKFREE_IPS200_H +#define _SEEKFREE_IPS200_H + +#include "common.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_assert.h" +#include "SEEKFREE_PRINTF.h" +#include "zf_spi.h" +#include "SEEKFREE_FUN.h" +#include "SEEKFREE_FONT.h" + + +//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- +//#define RED 0xF800 //红色 +//#define BLUE 0x001F //蓝色 +//#define YELLOW 0xFFE0 //黄色 +//#define GREEN 0x07E0 //绿色 +//#define WHITE 0xFFFF //白色 +//#define BLACK 0x0000 //黑色 +//#define GRAY 0X8430 //灰色 +//#define BROWN 0XBC40 //棕色 +//#define PURPLE 0XF81F //紫色 +//#define PINK 0XFE19 //粉色 + + +#define IPS200_BGCOLOR RGB565_WHITE //背景颜色 +#define IPS200_PENCOLOR RGB565_RED //画笔颜色 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_SPIN SPI_2 //定义使用的SPI号 +#define IPS200_SCL_PIN_SPI SPI2_SCLK_P15_3 //定义SPI_SCK引脚 +#define IPS200_SDA_PIN_SPI SPI2_MOSI_P15_5 //定义SPI_MOSI引脚 +#define IPS200_SDA_IN_PIN_SPI SPI2_MISO_P15_4 //定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 +#define IPS200_CS_PIN_SPI SPI2_CS0_P15_2 //定义SPI_CS引脚 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_RST_PIN_SPI P15_1 // 液晶复位引脚定义 +#define IPS200_DC_PIN_SPI P15_0 +#define IPS200_BL_PIN_SPI P15_4 + + +//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 +//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 +#define IPS200_RD_PIN_PARALLEL8 P15_3 +#define IPS200_WR_PIN_PARALLEL8 P15_5 +#define IPS200_RS_PIN_PARALLEL8 P15_1 +#define IPS200_RST_PIN_PARALLEL8 P15_0 +#define IPS200_CS_PIN_PARALLEL8 P15_2 +#define IPS200_BL_PIN_PARALLEL8 P15_4 + +//并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 +//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, +//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 +//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 +//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 +#define IPS200_D0_PIN_PARALLEL8 P11_9 +#define IPS200_D1_PIN_PARALLEL8 P11_10 +#define IPS200_D2_PIN_PARALLEL8 P11_11 +#define IPS200_D3_PIN_PARALLEL8 P11_12 +#define IPS200_D4_PIN_PARALLEL8 P13_0 +#define IPS200_D5_PIN_PARALLEL8 P13_1 +#define IPS200_D6_PIN_PARALLEL8 P13_2 +#define IPS200_D7_PIN_PARALLEL8 P13_3 + +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c deleted file mode 100644 index 3439d14..0000000 --- a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c +++ /dev/null @@ -1,896 +0,0 @@ -/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#include "stdlib.h" -#include "string.h" -#include "stdio.h" -#include "zf_stm_systick.h" -#include "zf_gpio.h" -#include "zf_assert.h" -#include "SEEKFREE_PRINTF.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_data(uint8 dat) //写数据 -{ - IPS200_DATAPORT1 = (dat << DATA_START_NUM1) | (IPS200_DATAPORT1 & ~((uint32)(0x0F << DATA_START_NUM1)) ); - IPS200_DATAPORT2 = ((dat>>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_reg(uint8 command) //写命令 -{ - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 -{ - ips200_wr_reg(com); - ips200_wr_data(dat); -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) -{ - ips200_wr_reg(0x2a); - ips200_wr_data16(x1); - ips200_wr_data16(x2); - - ips200_wr_reg(0x2b); - ips200_wr_data16(y1); - ips200_wr_data16(y2); - - ips200_wr_reg(0x2c); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 2.0寸 IPS液晶初始化 -// @return void -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) -{ - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - - IPS200_BL(1); - IPS200_RST(0); - systick_delay_ms(STM0, 5); - IPS200_RST(1); - systick_delay_ms(STM0, 5); - - ips200_wr_reg(0x11); - systick_delay_ms(STM0, 120); - - ips200_wr_reg(0x36); - if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); - else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); - else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); - else ips200_wr_data(0xA0); - - - - - - ips200_wr_reg(0x3A); - ips200_wr_data(0x05); - - ips200_wr_reg(0xB2); - ips200_wr_data(0x0C); - ips200_wr_data(0x0C); - ips200_wr_data(0x00); - ips200_wr_data(0x33); - ips200_wr_data(0x33); - - ips200_wr_reg(0xB7); - ips200_wr_data(0x35); - - ips200_wr_reg(0xBB); - ips200_wr_data(0x29); //32 Vcom=1.35V - - ips200_wr_reg(0xC2); - ips200_wr_data(0x01); - - ips200_wr_reg(0xC3); - ips200_wr_data(0x19); //GVDD=4.8V - - ips200_wr_reg(0xC4); - ips200_wr_data(0x20); //VDV, 0x20:0v - - ips200_wr_reg(0xC5); - ips200_wr_data(0x1A);//VCOM Offset Set - - ips200_wr_reg(0xC6); - ips200_wr_data(0x01F); //0x0F:60Hz - - ips200_wr_reg(0xD0); - ips200_wr_data(0xA4); - ips200_wr_data(0xA1); - - ips200_wr_reg(0xE0); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x05); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0xE1); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0x21); - - ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶清屏函数 -// @param color 颜色设置 -// @return void -// @since v1.0 -// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 -//------------------------------------------------------------------------------------------------------------------- -void ips200_clear(uint16 color) -{ - uint16 i,j; - ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); - for(i=0;i>=1; - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示字符串 -// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) -// @param dat 需要显示的字符串 -// @return void -// @since v1.0 -// Sample usage: ips200_showstr(0,0,"seekfree"); -//------------------------------------------------------------------------------------------------------------------- -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) -{ - uint16 j; - - j = 0; - while(dat[j] != '\0') - { - ips200_showchar(x+8*j,y*16,dat[j]); - j++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int8 -// @return void -// @since v1.0 -// Sample usage: ips200_showint8(0,0,x);//x为int8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint8(uint16 x,uint16 y,int8 dat) -{ - uint8 a[3]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_showchar(x,y*16,' '); - - a[0] = dat/100; - a[1] = dat/10%10; - a[2] = dat%10; - i = 0; - while(i<3) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint8 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int16 -// @return void -// @since v1.0 -// Sample usage: ips200_showint16(0,0,x);//x为int16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint16(uint16 x,uint16 y,int16 dat) -{ - uint8 a[5]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_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) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint16 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示32位有符号(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint32 -// @param num 需要显示的位数 最高10位 不包含正负号 -// @return void -// @since v1.0 -// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 -// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint32(uint16 x,uint16 y,int 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示浮点数(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型float或double -// @param num 整数位显示长度 最高10位 -// @param pointnum 小数位显示长度 最高6位 -// @return void -// @since v1.0 -// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 -// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, -// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, -// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param w 图像宽度 -// @param l 图像高度 -// @param *p 图像数组地址 -// @return void -// @since v1.0 -// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) -{ - int i; - unsigned char picH,picL; - ips200_address_set(x,y,x+w-1,y+l-1); - for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; - coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 总钻风(灰度摄像头)液晶缩放显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) -// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) -// @return void -// @since v1.0 -// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - - ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 小钻风(二值化摄像头)液晶显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @return void -// @since v1.0 -// @note 图像分辨率需要设置在120(高)*160(宽)以下 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) -{ - int i,j; - - uint16 temp = 0; - ips200_address_set(0,0,width-1,height-1); - for(i=0;i0;j--) - { - temp = (*p_data>>(j-1)) & 0x01; - if(temp) ips200_wr_data16(color); - else ips200_wr_data16(IPS200_BGCOLOR); - } - p_data++; - } - p_data = p_data - temp2 + temp2*size; - } - } -} diff --git a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/FFT_Demo/Libraries/doc/version.txt b/Example/FFT_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/FFT_Demo/Libraries/doc/version.txt +++ b/Example/FFT_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/FFT_Demo/Libraries/seekfree_libraries/headfile.h b/Example/FFT_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/FFT_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/FFT_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/FFT_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/FFT_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/FFT_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/FFT_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param command 命令 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_reg(uint8 command) //写命令 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 8位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 16位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param com 命令 +// @param dat 数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 +{ + ips200_wr_reg(com); + ips200_wr_data(dat); +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) +{ + ips200_wr_reg(0x2a); + ips200_wr_data16(x1); + ips200_wr_data16(x2); + + ips200_wr_reg(0x2b); + ips200_wr_data16(y1); + ips200_wr_data16(y2); + + ips200_wr_reg(0x2c); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 2.0寸 IPS液晶初始化 +// @return type_select 并口或者串口选择 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_init(ips200_type_enum type_select) +{ + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } + IPS200_BL(1); + IPS200_RST(0); + systick_delay_ms(STM0, 5); + IPS200_RST(1); + systick_delay_ms(STM0, 5); + + ips200_wr_reg(0x11); + systick_delay_ms(STM0, 120); + + ips200_wr_reg(0x36); + if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); + else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); + else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); + else ips200_wr_data(0xA0); + + + ips200_wr_reg(0x3A); + ips200_wr_data(0x05); + + ips200_wr_reg(0xB2); + ips200_wr_data(0x0C); + ips200_wr_data(0x0C); + ips200_wr_data(0x00); + ips200_wr_data(0x33); + ips200_wr_data(0x33); + + ips200_wr_reg(0xB7); + ips200_wr_data(0x35); + + ips200_wr_reg(0xBB); + ips200_wr_data(0x29); //32 Vcom=1.35V + + ips200_wr_reg(0xC2); + ips200_wr_data(0x01); + + ips200_wr_reg(0xC3); + ips200_wr_data(0x19); //GVDD=4.8V + + ips200_wr_reg(0xC4); + ips200_wr_data(0x20); //VDV, 0x20:0v + + ips200_wr_reg(0xC5); + ips200_wr_data(0x1A);//VCOM Offset Set + + ips200_wr_reg(0xC6); + ips200_wr_data(0x01F); //0x0F:60Hz + + ips200_wr_reg(0xD0); + ips200_wr_data(0xA4); + ips200_wr_data(0xA1); + + ips200_wr_reg(0xE0); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x05); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0xE1); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0x21); + + ips200_wr_reg(0x29); + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶清屏函数 +// @param color 颜色设置 +// @return void +// @since v1.0 +// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 +//------------------------------------------------------------------------------------------------------------------- +void ips200_clear(uint16 color) +{ + uint16 i,j; + ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); + for(i=0;i>=1; + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示字符串 +// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) +// @param dat 需要显示的字符串 +// @return void +// @since v1.0 +// Sample usage: ips200_showstr(0,0,"seekfree"); +//------------------------------------------------------------------------------------------------------------------- +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) +{ + uint16 j; + + j = 0; + while(dat[j] != '\0') + { + ips200_showchar(x+8*j,y*16,dat[j]); + j++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int8 +// @return void +// @since v1.0 +// Sample usage: ips200_showint8(0,0,x);//x为int8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint8(uint16 x,uint16 y,int8 dat) +{ + uint8 a[3]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_showchar(x,y*16,' '); + + a[0] = dat/100; + a[1] = dat/10%10; + a[2] = dat%10; + i = 0; + while(i<3) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint8 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int16 +// @return void +// @since v1.0 +// Sample usage: ips200_showint16(0,0,x);//x为int16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint16(uint16 x,uint16 y,int16 dat) +{ + uint8 a[5]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_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) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint16 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示32位有符号(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint32(uint16 x,uint16 y,int 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示浮点数(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param w 图像宽度 +// @param l 图像高度 +// @param *p 图像数组地址 +// @return void +// @since v1.0 +// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) +{ + int i; + unsigned char picH,picL; + ips200_address_set(x,y,x+w-1,y+l-1); + for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; + coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 总钻风(灰度摄像头)液晶缩放显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) +// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) +// @return void +// @since v1.0 +// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + + ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风(二值化摄像头)液晶显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @return void +// @since v1.0 +// @note 图像分辨率需要设置在120(高)*160(宽)以下 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) +{ + int i,j; + + uint16 temp = 0; + ips200_address_set(0,0,width-1,height-1); + for(i=0;i0;j--) + { + temp = (*p_data>>(j-1)) & 0x01; + if(temp) ips200_wr_data16(color); + else ips200_wr_data16(IPS200_BGCOLOR); + } + p_data++; + } + p_data = p_data - temp2 + temp2*size; + } + } +} diff --git a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h new file mode 100644 index 0000000..df01216 --- /dev/null +++ b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h @@ -0,0 +1,199 @@ + +/*/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file 2.0寸IPS屏幕 + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software ADS v1.5.2 + * @Target core TC264 + * @Taobao https://seekfree.taobao.com/ + * @date 2020-05-07 + * @note + 接线定义: + ------------------------------------ +* 模块管脚 单片机管脚 +* // 双排排针 并口两寸屏 硬件引脚 +* RD 查看 SEEKFREE_IPS200.h 中 IPS200_RD_PIN_PARALLEL8 宏定义 +* WR 查看 SEEKFREE_IPS200.h 中 IPS200_WR_PIN_PARALLEL8 宏定义 +* RS 查看 SEEKFREE_IPS200.h 中 IPS200_RS_PIN_PARALLEL8 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_PARALLEL8 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_PARALLEL8 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_PARALLEL8 宏定义 +* D0-D7 查看 SEEKFREE_IPS200.h 中 IPS200_Dx_PIN_PARALLEL8 宏定义 +* // 单排排针 SPI 两寸屏 硬件引脚 +* SCL 查看 SEEKFREE_IPS200.h 中 IPS200_SCL_PIN_SPI 宏定义 +* SDA 查看 SEEKFREE_IPS200.h 中 IPS200_SDA_PIN_SPI 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_SPI 宏定义 +* DC 查看 SEEKFREE_IPS200.h 中 IPS200_DC_PIN_SPI 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_SPI 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_SPI 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 最大分辨率 320 * 240 +* ------------------------------------ + + ********************************************************************************************************************/ + +#ifndef _SEEKFREE_IPS200_H +#define _SEEKFREE_IPS200_H + +#include "common.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_assert.h" +#include "SEEKFREE_PRINTF.h" +#include "zf_spi.h" +#include "SEEKFREE_FUN.h" +#include "SEEKFREE_FONT.h" + + +//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- +//#define RED 0xF800 //红色 +//#define BLUE 0x001F //蓝色 +//#define YELLOW 0xFFE0 //黄色 +//#define GREEN 0x07E0 //绿色 +//#define WHITE 0xFFFF //白色 +//#define BLACK 0x0000 //黑色 +//#define GRAY 0X8430 //灰色 +//#define BROWN 0XBC40 //棕色 +//#define PURPLE 0XF81F //紫色 +//#define PINK 0XFE19 //粉色 + + +#define IPS200_BGCOLOR RGB565_WHITE //背景颜色 +#define IPS200_PENCOLOR RGB565_RED //画笔颜色 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_SPIN SPI_2 //定义使用的SPI号 +#define IPS200_SCL_PIN_SPI SPI2_SCLK_P15_3 //定义SPI_SCK引脚 +#define IPS200_SDA_PIN_SPI SPI2_MOSI_P15_5 //定义SPI_MOSI引脚 +#define IPS200_SDA_IN_PIN_SPI SPI2_MISO_P15_4 //定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 +#define IPS200_CS_PIN_SPI SPI2_CS0_P15_2 //定义SPI_CS引脚 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_RST_PIN_SPI P15_1 // 液晶复位引脚定义 +#define IPS200_DC_PIN_SPI P15_0 +#define IPS200_BL_PIN_SPI P15_4 + + +//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 +//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 +#define IPS200_RD_PIN_PARALLEL8 P15_3 +#define IPS200_WR_PIN_PARALLEL8 P15_5 +#define IPS200_RS_PIN_PARALLEL8 P15_1 +#define IPS200_RST_PIN_PARALLEL8 P15_0 +#define IPS200_CS_PIN_PARALLEL8 P15_2 +#define IPS200_BL_PIN_PARALLEL8 P15_4 + +//并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 +//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, +//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 +//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 +//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 +#define IPS200_D0_PIN_PARALLEL8 P11_9 +#define IPS200_D1_PIN_PARALLEL8 P11_10 +#define IPS200_D2_PIN_PARALLEL8 P11_11 +#define IPS200_D3_PIN_PARALLEL8 P11_12 +#define IPS200_D4_PIN_PARALLEL8 P13_0 +#define IPS200_D5_PIN_PARALLEL8 P13_1 +#define IPS200_D6_PIN_PARALLEL8 P13_2 +#define IPS200_D7_PIN_PARALLEL8 P13_3 + +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c deleted file mode 100644 index 3439d14..0000000 --- a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c +++ /dev/null @@ -1,896 +0,0 @@ -/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#include "stdlib.h" -#include "string.h" -#include "stdio.h" -#include "zf_stm_systick.h" -#include "zf_gpio.h" -#include "zf_assert.h" -#include "SEEKFREE_PRINTF.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_data(uint8 dat) //写数据 -{ - IPS200_DATAPORT1 = (dat << DATA_START_NUM1) | (IPS200_DATAPORT1 & ~((uint32)(0x0F << DATA_START_NUM1)) ); - IPS200_DATAPORT2 = ((dat>>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_reg(uint8 command) //写命令 -{ - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 -{ - ips200_wr_reg(com); - ips200_wr_data(dat); -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) -{ - ips200_wr_reg(0x2a); - ips200_wr_data16(x1); - ips200_wr_data16(x2); - - ips200_wr_reg(0x2b); - ips200_wr_data16(y1); - ips200_wr_data16(y2); - - ips200_wr_reg(0x2c); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 2.0寸 IPS液晶初始化 -// @return void -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) -{ - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - - IPS200_BL(1); - IPS200_RST(0); - systick_delay_ms(STM0, 5); - IPS200_RST(1); - systick_delay_ms(STM0, 5); - - ips200_wr_reg(0x11); - systick_delay_ms(STM0, 120); - - ips200_wr_reg(0x36); - if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); - else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); - else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); - else ips200_wr_data(0xA0); - - - - - - ips200_wr_reg(0x3A); - ips200_wr_data(0x05); - - ips200_wr_reg(0xB2); - ips200_wr_data(0x0C); - ips200_wr_data(0x0C); - ips200_wr_data(0x00); - ips200_wr_data(0x33); - ips200_wr_data(0x33); - - ips200_wr_reg(0xB7); - ips200_wr_data(0x35); - - ips200_wr_reg(0xBB); - ips200_wr_data(0x29); //32 Vcom=1.35V - - ips200_wr_reg(0xC2); - ips200_wr_data(0x01); - - ips200_wr_reg(0xC3); - ips200_wr_data(0x19); //GVDD=4.8V - - ips200_wr_reg(0xC4); - ips200_wr_data(0x20); //VDV, 0x20:0v - - ips200_wr_reg(0xC5); - ips200_wr_data(0x1A);//VCOM Offset Set - - ips200_wr_reg(0xC6); - ips200_wr_data(0x01F); //0x0F:60Hz - - ips200_wr_reg(0xD0); - ips200_wr_data(0xA4); - ips200_wr_data(0xA1); - - ips200_wr_reg(0xE0); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x05); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0xE1); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0x21); - - ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶清屏函数 -// @param color 颜色设置 -// @return void -// @since v1.0 -// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 -//------------------------------------------------------------------------------------------------------------------- -void ips200_clear(uint16 color) -{ - uint16 i,j; - ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); - for(i=0;i>=1; - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示字符串 -// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) -// @param dat 需要显示的字符串 -// @return void -// @since v1.0 -// Sample usage: ips200_showstr(0,0,"seekfree"); -//------------------------------------------------------------------------------------------------------------------- -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) -{ - uint16 j; - - j = 0; - while(dat[j] != '\0') - { - ips200_showchar(x+8*j,y*16,dat[j]); - j++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int8 -// @return void -// @since v1.0 -// Sample usage: ips200_showint8(0,0,x);//x为int8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint8(uint16 x,uint16 y,int8 dat) -{ - uint8 a[3]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_showchar(x,y*16,' '); - - a[0] = dat/100; - a[1] = dat/10%10; - a[2] = dat%10; - i = 0; - while(i<3) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint8 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int16 -// @return void -// @since v1.0 -// Sample usage: ips200_showint16(0,0,x);//x为int16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint16(uint16 x,uint16 y,int16 dat) -{ - uint8 a[5]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_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) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint16 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示32位有符号(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint32 -// @param num 需要显示的位数 最高10位 不包含正负号 -// @return void -// @since v1.0 -// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 -// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint32(uint16 x,uint16 y,int 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示浮点数(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型float或double -// @param num 整数位显示长度 最高10位 -// @param pointnum 小数位显示长度 最高6位 -// @return void -// @since v1.0 -// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 -// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, -// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, -// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param w 图像宽度 -// @param l 图像高度 -// @param *p 图像数组地址 -// @return void -// @since v1.0 -// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) -{ - int i; - unsigned char picH,picL; - ips200_address_set(x,y,x+w-1,y+l-1); - for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; - coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 总钻风(灰度摄像头)液晶缩放显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) -// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) -// @return void -// @since v1.0 -// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - - ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 小钻风(二值化摄像头)液晶显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @return void -// @since v1.0 -// @note 图像分辨率需要设置在120(高)*160(宽)以下 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) -{ - int i,j; - - uint16 temp = 0; - ips200_address_set(0,0,width-1,height-1); - for(i=0;i0;j--) - { - temp = (*p_data>>(j-1)) & 0x01; - if(temp) ips200_wr_data16(color); - else ips200_wr_data16(IPS200_BGCOLOR); - } - p_data++; - } - p_data = p_data - temp2 + temp2*size; - } - } -} diff --git a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/GPIO_Interrupt_Demo/Libraries/doc/version.txt b/Example/GPIO_Interrupt_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/GPIO_Interrupt_Demo/Libraries/doc/version.txt +++ b/Example/GPIO_Interrupt_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_libraries/headfile.h b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param command 命令 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_reg(uint8 command) //写命令 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 8位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 16位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param com 命令 +// @param dat 数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 +{ + ips200_wr_reg(com); + ips200_wr_data(dat); +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) +{ + ips200_wr_reg(0x2a); + ips200_wr_data16(x1); + ips200_wr_data16(x2); + + ips200_wr_reg(0x2b); + ips200_wr_data16(y1); + ips200_wr_data16(y2); + + ips200_wr_reg(0x2c); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 2.0寸 IPS液晶初始化 +// @return type_select 并口或者串口选择 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_init(ips200_type_enum type_select) +{ + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } + IPS200_BL(1); + IPS200_RST(0); + systick_delay_ms(STM0, 5); + IPS200_RST(1); + systick_delay_ms(STM0, 5); + + ips200_wr_reg(0x11); + systick_delay_ms(STM0, 120); + + ips200_wr_reg(0x36); + if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); + else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); + else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); + else ips200_wr_data(0xA0); + + + ips200_wr_reg(0x3A); + ips200_wr_data(0x05); + + ips200_wr_reg(0xB2); + ips200_wr_data(0x0C); + ips200_wr_data(0x0C); + ips200_wr_data(0x00); + ips200_wr_data(0x33); + ips200_wr_data(0x33); + + ips200_wr_reg(0xB7); + ips200_wr_data(0x35); + + ips200_wr_reg(0xBB); + ips200_wr_data(0x29); //32 Vcom=1.35V + + ips200_wr_reg(0xC2); + ips200_wr_data(0x01); + + ips200_wr_reg(0xC3); + ips200_wr_data(0x19); //GVDD=4.8V + + ips200_wr_reg(0xC4); + ips200_wr_data(0x20); //VDV, 0x20:0v + + ips200_wr_reg(0xC5); + ips200_wr_data(0x1A);//VCOM Offset Set + + ips200_wr_reg(0xC6); + ips200_wr_data(0x01F); //0x0F:60Hz + + ips200_wr_reg(0xD0); + ips200_wr_data(0xA4); + ips200_wr_data(0xA1); + + ips200_wr_reg(0xE0); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x05); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0xE1); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0x21); + + ips200_wr_reg(0x29); + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶清屏函数 +// @param color 颜色设置 +// @return void +// @since v1.0 +// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 +//------------------------------------------------------------------------------------------------------------------- +void ips200_clear(uint16 color) +{ + uint16 i,j; + ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); + for(i=0;i>=1; + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示字符串 +// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) +// @param dat 需要显示的字符串 +// @return void +// @since v1.0 +// Sample usage: ips200_showstr(0,0,"seekfree"); +//------------------------------------------------------------------------------------------------------------------- +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) +{ + uint16 j; + + j = 0; + while(dat[j] != '\0') + { + ips200_showchar(x+8*j,y*16,dat[j]); + j++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int8 +// @return void +// @since v1.0 +// Sample usage: ips200_showint8(0,0,x);//x为int8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint8(uint16 x,uint16 y,int8 dat) +{ + uint8 a[3]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_showchar(x,y*16,' '); + + a[0] = dat/100; + a[1] = dat/10%10; + a[2] = dat%10; + i = 0; + while(i<3) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint8 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int16 +// @return void +// @since v1.0 +// Sample usage: ips200_showint16(0,0,x);//x为int16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint16(uint16 x,uint16 y,int16 dat) +{ + uint8 a[5]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_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) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint16 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示32位有符号(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint32(uint16 x,uint16 y,int 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示浮点数(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param w 图像宽度 +// @param l 图像高度 +// @param *p 图像数组地址 +// @return void +// @since v1.0 +// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) +{ + int i; + unsigned char picH,picL; + ips200_address_set(x,y,x+w-1,y+l-1); + for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; + coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 总钻风(灰度摄像头)液晶缩放显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) +// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) +// @return void +// @since v1.0 +// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + + ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风(二值化摄像头)液晶显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @return void +// @since v1.0 +// @note 图像分辨率需要设置在120(高)*160(宽)以下 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) +{ + int i,j; + + uint16 temp = 0; + ips200_address_set(0,0,width-1,height-1); + for(i=0;i0;j--) + { + temp = (*p_data>>(j-1)) & 0x01; + if(temp) ips200_wr_data16(color); + else ips200_wr_data16(IPS200_BGCOLOR); + } + p_data++; + } + p_data = p_data - temp2 + temp2*size; + } + } +} diff --git a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h new file mode 100644 index 0000000..df01216 --- /dev/null +++ b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h @@ -0,0 +1,199 @@ + +/*/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file 2.0寸IPS屏幕 + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software ADS v1.5.2 + * @Target core TC264 + * @Taobao https://seekfree.taobao.com/ + * @date 2020-05-07 + * @note + 接线定义: + ------------------------------------ +* 模块管脚 单片机管脚 +* // 双排排针 并口两寸屏 硬件引脚 +* RD 查看 SEEKFREE_IPS200.h 中 IPS200_RD_PIN_PARALLEL8 宏定义 +* WR 查看 SEEKFREE_IPS200.h 中 IPS200_WR_PIN_PARALLEL8 宏定义 +* RS 查看 SEEKFREE_IPS200.h 中 IPS200_RS_PIN_PARALLEL8 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_PARALLEL8 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_PARALLEL8 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_PARALLEL8 宏定义 +* D0-D7 查看 SEEKFREE_IPS200.h 中 IPS200_Dx_PIN_PARALLEL8 宏定义 +* // 单排排针 SPI 两寸屏 硬件引脚 +* SCL 查看 SEEKFREE_IPS200.h 中 IPS200_SCL_PIN_SPI 宏定义 +* SDA 查看 SEEKFREE_IPS200.h 中 IPS200_SDA_PIN_SPI 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_SPI 宏定义 +* DC 查看 SEEKFREE_IPS200.h 中 IPS200_DC_PIN_SPI 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_SPI 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_SPI 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 最大分辨率 320 * 240 +* ------------------------------------ + + ********************************************************************************************************************/ + +#ifndef _SEEKFREE_IPS200_H +#define _SEEKFREE_IPS200_H + +#include "common.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_assert.h" +#include "SEEKFREE_PRINTF.h" +#include "zf_spi.h" +#include "SEEKFREE_FUN.h" +#include "SEEKFREE_FONT.h" + + +//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- +//#define RED 0xF800 //红色 +//#define BLUE 0x001F //蓝色 +//#define YELLOW 0xFFE0 //黄色 +//#define GREEN 0x07E0 //绿色 +//#define WHITE 0xFFFF //白色 +//#define BLACK 0x0000 //黑色 +//#define GRAY 0X8430 //灰色 +//#define BROWN 0XBC40 //棕色 +//#define PURPLE 0XF81F //紫色 +//#define PINK 0XFE19 //粉色 + + +#define IPS200_BGCOLOR RGB565_WHITE //背景颜色 +#define IPS200_PENCOLOR RGB565_RED //画笔颜色 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_SPIN SPI_2 //定义使用的SPI号 +#define IPS200_SCL_PIN_SPI SPI2_SCLK_P15_3 //定义SPI_SCK引脚 +#define IPS200_SDA_PIN_SPI SPI2_MOSI_P15_5 //定义SPI_MOSI引脚 +#define IPS200_SDA_IN_PIN_SPI SPI2_MISO_P15_4 //定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 +#define IPS200_CS_PIN_SPI SPI2_CS0_P15_2 //定义SPI_CS引脚 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_RST_PIN_SPI P15_1 // 液晶复位引脚定义 +#define IPS200_DC_PIN_SPI P15_0 +#define IPS200_BL_PIN_SPI P15_4 + + +//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 +//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 +#define IPS200_RD_PIN_PARALLEL8 P15_3 +#define IPS200_WR_PIN_PARALLEL8 P15_5 +#define IPS200_RS_PIN_PARALLEL8 P15_1 +#define IPS200_RST_PIN_PARALLEL8 P15_0 +#define IPS200_CS_PIN_PARALLEL8 P15_2 +#define IPS200_BL_PIN_PARALLEL8 P15_4 + +//并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 +//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, +//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 +//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 +//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 +#define IPS200_D0_PIN_PARALLEL8 P11_9 +#define IPS200_D1_PIN_PARALLEL8 P11_10 +#define IPS200_D2_PIN_PARALLEL8 P11_11 +#define IPS200_D3_PIN_PARALLEL8 P11_12 +#define IPS200_D4_PIN_PARALLEL8 P13_0 +#define IPS200_D5_PIN_PARALLEL8 P13_1 +#define IPS200_D6_PIN_PARALLEL8 P13_2 +#define IPS200_D7_PIN_PARALLEL8 P13_3 + +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c deleted file mode 100644 index 3439d14..0000000 --- a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c +++ /dev/null @@ -1,896 +0,0 @@ -/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#include "stdlib.h" -#include "string.h" -#include "stdio.h" -#include "zf_stm_systick.h" -#include "zf_gpio.h" -#include "zf_assert.h" -#include "SEEKFREE_PRINTF.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_data(uint8 dat) //写数据 -{ - IPS200_DATAPORT1 = (dat << DATA_START_NUM1) | (IPS200_DATAPORT1 & ~((uint32)(0x0F << DATA_START_NUM1)) ); - IPS200_DATAPORT2 = ((dat>>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_reg(uint8 command) //写命令 -{ - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 -{ - ips200_wr_reg(com); - ips200_wr_data(dat); -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) -{ - ips200_wr_reg(0x2a); - ips200_wr_data16(x1); - ips200_wr_data16(x2); - - ips200_wr_reg(0x2b); - ips200_wr_data16(y1); - ips200_wr_data16(y2); - - ips200_wr_reg(0x2c); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 2.0寸 IPS液晶初始化 -// @return void -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) -{ - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - - IPS200_BL(1); - IPS200_RST(0); - systick_delay_ms(STM0, 5); - IPS200_RST(1); - systick_delay_ms(STM0, 5); - - ips200_wr_reg(0x11); - systick_delay_ms(STM0, 120); - - ips200_wr_reg(0x36); - if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); - else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); - else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); - else ips200_wr_data(0xA0); - - - - - - ips200_wr_reg(0x3A); - ips200_wr_data(0x05); - - ips200_wr_reg(0xB2); - ips200_wr_data(0x0C); - ips200_wr_data(0x0C); - ips200_wr_data(0x00); - ips200_wr_data(0x33); - ips200_wr_data(0x33); - - ips200_wr_reg(0xB7); - ips200_wr_data(0x35); - - ips200_wr_reg(0xBB); - ips200_wr_data(0x29); //32 Vcom=1.35V - - ips200_wr_reg(0xC2); - ips200_wr_data(0x01); - - ips200_wr_reg(0xC3); - ips200_wr_data(0x19); //GVDD=4.8V - - ips200_wr_reg(0xC4); - ips200_wr_data(0x20); //VDV, 0x20:0v - - ips200_wr_reg(0xC5); - ips200_wr_data(0x1A);//VCOM Offset Set - - ips200_wr_reg(0xC6); - ips200_wr_data(0x01F); //0x0F:60Hz - - ips200_wr_reg(0xD0); - ips200_wr_data(0xA4); - ips200_wr_data(0xA1); - - ips200_wr_reg(0xE0); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x05); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0xE1); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0x21); - - ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶清屏函数 -// @param color 颜色设置 -// @return void -// @since v1.0 -// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 -//------------------------------------------------------------------------------------------------------------------- -void ips200_clear(uint16 color) -{ - uint16 i,j; - ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); - for(i=0;i>=1; - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示字符串 -// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) -// @param dat 需要显示的字符串 -// @return void -// @since v1.0 -// Sample usage: ips200_showstr(0,0,"seekfree"); -//------------------------------------------------------------------------------------------------------------------- -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) -{ - uint16 j; - - j = 0; - while(dat[j] != '\0') - { - ips200_showchar(x+8*j,y*16,dat[j]); - j++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int8 -// @return void -// @since v1.0 -// Sample usage: ips200_showint8(0,0,x);//x为int8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint8(uint16 x,uint16 y,int8 dat) -{ - uint8 a[3]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_showchar(x,y*16,' '); - - a[0] = dat/100; - a[1] = dat/10%10; - a[2] = dat%10; - i = 0; - while(i<3) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint8 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int16 -// @return void -// @since v1.0 -// Sample usage: ips200_showint16(0,0,x);//x为int16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint16(uint16 x,uint16 y,int16 dat) -{ - uint8 a[5]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_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) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint16 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示32位有符号(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint32 -// @param num 需要显示的位数 最高10位 不包含正负号 -// @return void -// @since v1.0 -// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 -// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint32(uint16 x,uint16 y,int 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示浮点数(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型float或double -// @param num 整数位显示长度 最高10位 -// @param pointnum 小数位显示长度 最高6位 -// @return void -// @since v1.0 -// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 -// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, -// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, -// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param w 图像宽度 -// @param l 图像高度 -// @param *p 图像数组地址 -// @return void -// @since v1.0 -// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) -{ - int i; - unsigned char picH,picL; - ips200_address_set(x,y,x+w-1,y+l-1); - for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; - coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 总钻风(灰度摄像头)液晶缩放显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) -// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) -// @return void -// @since v1.0 -// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - - ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 小钻风(二值化摄像头)液晶显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @return void -// @since v1.0 -// @note 图像分辨率需要设置在120(高)*160(宽)以下 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) -{ - int i,j; - - uint16 temp = 0; - ips200_address_set(0,0,width-1,height-1); - for(i=0;i0;j--) - { - temp = (*p_data>>(j-1)) & 0x01; - if(temp) ips200_wr_data16(color); - else ips200_wr_data16(IPS200_BGCOLOR); - } - p_data++; - } - p_data = p_data - temp2 + temp2*size; - } - } -} diff --git a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/doc/version.txt b/Example/Interrupt_Priority_Set_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/Interrupt_Priority_Set_Demo/Libraries/doc/version.txt +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param command 命令 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_reg(uint8 command) //写命令 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 8位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 16位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param com 命令 +// @param dat 数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 +{ + ips200_wr_reg(com); + ips200_wr_data(dat); +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) +{ + ips200_wr_reg(0x2a); + ips200_wr_data16(x1); + ips200_wr_data16(x2); + + ips200_wr_reg(0x2b); + ips200_wr_data16(y1); + ips200_wr_data16(y2); + + ips200_wr_reg(0x2c); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 2.0寸 IPS液晶初始化 +// @return type_select 并口或者串口选择 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_init(ips200_type_enum type_select) +{ + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } + IPS200_BL(1); + IPS200_RST(0); + systick_delay_ms(STM0, 5); + IPS200_RST(1); + systick_delay_ms(STM0, 5); + + ips200_wr_reg(0x11); + systick_delay_ms(STM0, 120); + + ips200_wr_reg(0x36); + if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); + else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); + else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); + else ips200_wr_data(0xA0); + + + ips200_wr_reg(0x3A); + ips200_wr_data(0x05); + + ips200_wr_reg(0xB2); + ips200_wr_data(0x0C); + ips200_wr_data(0x0C); + ips200_wr_data(0x00); + ips200_wr_data(0x33); + ips200_wr_data(0x33); + + ips200_wr_reg(0xB7); + ips200_wr_data(0x35); + + ips200_wr_reg(0xBB); + ips200_wr_data(0x29); //32 Vcom=1.35V + + ips200_wr_reg(0xC2); + ips200_wr_data(0x01); + + ips200_wr_reg(0xC3); + ips200_wr_data(0x19); //GVDD=4.8V + + ips200_wr_reg(0xC4); + ips200_wr_data(0x20); //VDV, 0x20:0v + + ips200_wr_reg(0xC5); + ips200_wr_data(0x1A);//VCOM Offset Set + + ips200_wr_reg(0xC6); + ips200_wr_data(0x01F); //0x0F:60Hz + + ips200_wr_reg(0xD0); + ips200_wr_data(0xA4); + ips200_wr_data(0xA1); + + ips200_wr_reg(0xE0); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x05); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0xE1); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0x21); + + ips200_wr_reg(0x29); + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶清屏函数 +// @param color 颜色设置 +// @return void +// @since v1.0 +// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 +//------------------------------------------------------------------------------------------------------------------- +void ips200_clear(uint16 color) +{ + uint16 i,j; + ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); + for(i=0;i>=1; + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示字符串 +// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) +// @param dat 需要显示的字符串 +// @return void +// @since v1.0 +// Sample usage: ips200_showstr(0,0,"seekfree"); +//------------------------------------------------------------------------------------------------------------------- +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) +{ + uint16 j; + + j = 0; + while(dat[j] != '\0') + { + ips200_showchar(x+8*j,y*16,dat[j]); + j++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int8 +// @return void +// @since v1.0 +// Sample usage: ips200_showint8(0,0,x);//x为int8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint8(uint16 x,uint16 y,int8 dat) +{ + uint8 a[3]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_showchar(x,y*16,' '); + + a[0] = dat/100; + a[1] = dat/10%10; + a[2] = dat%10; + i = 0; + while(i<3) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint8 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int16 +// @return void +// @since v1.0 +// Sample usage: ips200_showint16(0,0,x);//x为int16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint16(uint16 x,uint16 y,int16 dat) +{ + uint8 a[5]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_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) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint16 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示32位有符号(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint32(uint16 x,uint16 y,int 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示浮点数(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param w 图像宽度 +// @param l 图像高度 +// @param *p 图像数组地址 +// @return void +// @since v1.0 +// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) +{ + int i; + unsigned char picH,picL; + ips200_address_set(x,y,x+w-1,y+l-1); + for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; + coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 总钻风(灰度摄像头)液晶缩放显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) +// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) +// @return void +// @since v1.0 +// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + + ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风(二值化摄像头)液晶显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @return void +// @since v1.0 +// @note 图像分辨率需要设置在120(高)*160(宽)以下 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) +{ + int i,j; + + uint16 temp = 0; + ips200_address_set(0,0,width-1,height-1); + for(i=0;i0;j--) + { + temp = (*p_data>>(j-1)) & 0x01; + if(temp) ips200_wr_data16(color); + else ips200_wr_data16(IPS200_BGCOLOR); + } + p_data++; + } + p_data = p_data - temp2 + temp2*size; + } + } +} diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h new file mode 100644 index 0000000..df01216 --- /dev/null +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h @@ -0,0 +1,199 @@ + +/*/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file 2.0寸IPS屏幕 + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software ADS v1.5.2 + * @Target core TC264 + * @Taobao https://seekfree.taobao.com/ + * @date 2020-05-07 + * @note + 接线定义: + ------------------------------------ +* 模块管脚 单片机管脚 +* // 双排排针 并口两寸屏 硬件引脚 +* RD 查看 SEEKFREE_IPS200.h 中 IPS200_RD_PIN_PARALLEL8 宏定义 +* WR 查看 SEEKFREE_IPS200.h 中 IPS200_WR_PIN_PARALLEL8 宏定义 +* RS 查看 SEEKFREE_IPS200.h 中 IPS200_RS_PIN_PARALLEL8 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_PARALLEL8 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_PARALLEL8 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_PARALLEL8 宏定义 +* D0-D7 查看 SEEKFREE_IPS200.h 中 IPS200_Dx_PIN_PARALLEL8 宏定义 +* // 单排排针 SPI 两寸屏 硬件引脚 +* SCL 查看 SEEKFREE_IPS200.h 中 IPS200_SCL_PIN_SPI 宏定义 +* SDA 查看 SEEKFREE_IPS200.h 中 IPS200_SDA_PIN_SPI 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_SPI 宏定义 +* DC 查看 SEEKFREE_IPS200.h 中 IPS200_DC_PIN_SPI 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_SPI 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_SPI 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 最大分辨率 320 * 240 +* ------------------------------------ + + ********************************************************************************************************************/ + +#ifndef _SEEKFREE_IPS200_H +#define _SEEKFREE_IPS200_H + +#include "common.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_assert.h" +#include "SEEKFREE_PRINTF.h" +#include "zf_spi.h" +#include "SEEKFREE_FUN.h" +#include "SEEKFREE_FONT.h" + + +//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- +//#define RED 0xF800 //红色 +//#define BLUE 0x001F //蓝色 +//#define YELLOW 0xFFE0 //黄色 +//#define GREEN 0x07E0 //绿色 +//#define WHITE 0xFFFF //白色 +//#define BLACK 0x0000 //黑色 +//#define GRAY 0X8430 //灰色 +//#define BROWN 0XBC40 //棕色 +//#define PURPLE 0XF81F //紫色 +//#define PINK 0XFE19 //粉色 + + +#define IPS200_BGCOLOR RGB565_WHITE //背景颜色 +#define IPS200_PENCOLOR RGB565_RED //画笔颜色 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_SPIN SPI_2 //定义使用的SPI号 +#define IPS200_SCL_PIN_SPI SPI2_SCLK_P15_3 //定义SPI_SCK引脚 +#define IPS200_SDA_PIN_SPI SPI2_MOSI_P15_5 //定义SPI_MOSI引脚 +#define IPS200_SDA_IN_PIN_SPI SPI2_MISO_P15_4 //定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 +#define IPS200_CS_PIN_SPI SPI2_CS0_P15_2 //定义SPI_CS引脚 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_RST_PIN_SPI P15_1 // 液晶复位引脚定义 +#define IPS200_DC_PIN_SPI P15_0 +#define IPS200_BL_PIN_SPI P15_4 + + +//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 +//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 +#define IPS200_RD_PIN_PARALLEL8 P15_3 +#define IPS200_WR_PIN_PARALLEL8 P15_5 +#define IPS200_RS_PIN_PARALLEL8 P15_1 +#define IPS200_RST_PIN_PARALLEL8 P15_0 +#define IPS200_CS_PIN_PARALLEL8 P15_2 +#define IPS200_BL_PIN_PARALLEL8 P15_4 + +//并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 +//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, +//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 +//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 +//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 +#define IPS200_D0_PIN_PARALLEL8 P11_9 +#define IPS200_D1_PIN_PARALLEL8 P11_10 +#define IPS200_D2_PIN_PARALLEL8 P11_11 +#define IPS200_D3_PIN_PARALLEL8 P11_12 +#define IPS200_D4_PIN_PARALLEL8 P13_0 +#define IPS200_D5_PIN_PARALLEL8 P13_1 +#define IPS200_D6_PIN_PARALLEL8 P13_2 +#define IPS200_D7_PIN_PARALLEL8 P13_3 + +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c deleted file mode 100644 index 3439d14..0000000 --- a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c +++ /dev/null @@ -1,896 +0,0 @@ -/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#include "stdlib.h" -#include "string.h" -#include "stdio.h" -#include "zf_stm_systick.h" -#include "zf_gpio.h" -#include "zf_assert.h" -#include "SEEKFREE_PRINTF.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_data(uint8 dat) //写数据 -{ - IPS200_DATAPORT1 = (dat << DATA_START_NUM1) | (IPS200_DATAPORT1 & ~((uint32)(0x0F << DATA_START_NUM1)) ); - IPS200_DATAPORT2 = ((dat>>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_reg(uint8 command) //写命令 -{ - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 -{ - ips200_wr_reg(com); - ips200_wr_data(dat); -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) -{ - ips200_wr_reg(0x2a); - ips200_wr_data16(x1); - ips200_wr_data16(x2); - - ips200_wr_reg(0x2b); - ips200_wr_data16(y1); - ips200_wr_data16(y2); - - ips200_wr_reg(0x2c); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 2.0寸 IPS液晶初始化 -// @return void -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) -{ - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - - IPS200_BL(1); - IPS200_RST(0); - systick_delay_ms(STM0, 5); - IPS200_RST(1); - systick_delay_ms(STM0, 5); - - ips200_wr_reg(0x11); - systick_delay_ms(STM0, 120); - - ips200_wr_reg(0x36); - if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); - else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); - else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); - else ips200_wr_data(0xA0); - - - - - - ips200_wr_reg(0x3A); - ips200_wr_data(0x05); - - ips200_wr_reg(0xB2); - ips200_wr_data(0x0C); - ips200_wr_data(0x0C); - ips200_wr_data(0x00); - ips200_wr_data(0x33); - ips200_wr_data(0x33); - - ips200_wr_reg(0xB7); - ips200_wr_data(0x35); - - ips200_wr_reg(0xBB); - ips200_wr_data(0x29); //32 Vcom=1.35V - - ips200_wr_reg(0xC2); - ips200_wr_data(0x01); - - ips200_wr_reg(0xC3); - ips200_wr_data(0x19); //GVDD=4.8V - - ips200_wr_reg(0xC4); - ips200_wr_data(0x20); //VDV, 0x20:0v - - ips200_wr_reg(0xC5); - ips200_wr_data(0x1A);//VCOM Offset Set - - ips200_wr_reg(0xC6); - ips200_wr_data(0x01F); //0x0F:60Hz - - ips200_wr_reg(0xD0); - ips200_wr_data(0xA4); - ips200_wr_data(0xA1); - - ips200_wr_reg(0xE0); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x05); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0xE1); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0x21); - - ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶清屏函数 -// @param color 颜色设置 -// @return void -// @since v1.0 -// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 -//------------------------------------------------------------------------------------------------------------------- -void ips200_clear(uint16 color) -{ - uint16 i,j; - ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); - for(i=0;i>=1; - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示字符串 -// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) -// @param dat 需要显示的字符串 -// @return void -// @since v1.0 -// Sample usage: ips200_showstr(0,0,"seekfree"); -//------------------------------------------------------------------------------------------------------------------- -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) -{ - uint16 j; - - j = 0; - while(dat[j] != '\0') - { - ips200_showchar(x+8*j,y*16,dat[j]); - j++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int8 -// @return void -// @since v1.0 -// Sample usage: ips200_showint8(0,0,x);//x为int8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint8(uint16 x,uint16 y,int8 dat) -{ - uint8 a[3]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_showchar(x,y*16,' '); - - a[0] = dat/100; - a[1] = dat/10%10; - a[2] = dat%10; - i = 0; - while(i<3) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint8 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int16 -// @return void -// @since v1.0 -// Sample usage: ips200_showint16(0,0,x);//x为int16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint16(uint16 x,uint16 y,int16 dat) -{ - uint8 a[5]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_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) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint16 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示32位有符号(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint32 -// @param num 需要显示的位数 最高10位 不包含正负号 -// @return void -// @since v1.0 -// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 -// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint32(uint16 x,uint16 y,int 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示浮点数(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型float或double -// @param num 整数位显示长度 最高10位 -// @param pointnum 小数位显示长度 最高6位 -// @return void -// @since v1.0 -// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 -// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, -// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, -// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param w 图像宽度 -// @param l 图像高度 -// @param *p 图像数组地址 -// @return void -// @since v1.0 -// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) -{ - int i; - unsigned char picH,picL; - ips200_address_set(x,y,x+w-1,y+l-1); - for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; - coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 总钻风(灰度摄像头)液晶缩放显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) -// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) -// @return void -// @since v1.0 -// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - - ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 小钻风(二值化摄像头)液晶显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @return void -// @since v1.0 -// @note 图像分辨率需要设置在120(高)*160(宽)以下 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) -{ - int i,j; - - uint16 temp = 0; - ips200_address_set(0,0,width-1,height-1); - for(i=0;i0;j--) - { - temp = (*p_data>>(j-1)) & 0x01; - if(temp) ips200_wr_data16(color); - else ips200_wr_data16(IPS200_BGCOLOR); - } - p_data++; - } - p_data = p_data - temp2 + temp2*size; - } - } -} diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/LED_Blink_Demo/Libraries/doc/version.txt b/Example/LED_Blink_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/LED_Blink_Demo/Libraries/doc/version.txt +++ b/Example/LED_Blink_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/LED_Blink_Demo/Libraries/seekfree_libraries/headfile.h b/Example/LED_Blink_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/LED_Blink_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/LED_Blink_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/LED_Blink_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/LED_Blink_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/LED_Blink_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/LED_Blink_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param command 命令 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_reg(uint8 command) //写命令 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 8位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 16位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param com 命令 +// @param dat 数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 +{ + ips200_wr_reg(com); + ips200_wr_data(dat); +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) +{ + ips200_wr_reg(0x2a); + ips200_wr_data16(x1); + ips200_wr_data16(x2); + + ips200_wr_reg(0x2b); + ips200_wr_data16(y1); + ips200_wr_data16(y2); + + ips200_wr_reg(0x2c); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 2.0寸 IPS液晶初始化 +// @return type_select 并口或者串口选择 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_init(ips200_type_enum type_select) +{ + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } + IPS200_BL(1); + IPS200_RST(0); + systick_delay_ms(STM0, 5); + IPS200_RST(1); + systick_delay_ms(STM0, 5); + + ips200_wr_reg(0x11); + systick_delay_ms(STM0, 120); + + ips200_wr_reg(0x36); + if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); + else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); + else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); + else ips200_wr_data(0xA0); + + + ips200_wr_reg(0x3A); + ips200_wr_data(0x05); + + ips200_wr_reg(0xB2); + ips200_wr_data(0x0C); + ips200_wr_data(0x0C); + ips200_wr_data(0x00); + ips200_wr_data(0x33); + ips200_wr_data(0x33); + + ips200_wr_reg(0xB7); + ips200_wr_data(0x35); + + ips200_wr_reg(0xBB); + ips200_wr_data(0x29); //32 Vcom=1.35V + + ips200_wr_reg(0xC2); + ips200_wr_data(0x01); + + ips200_wr_reg(0xC3); + ips200_wr_data(0x19); //GVDD=4.8V + + ips200_wr_reg(0xC4); + ips200_wr_data(0x20); //VDV, 0x20:0v + + ips200_wr_reg(0xC5); + ips200_wr_data(0x1A);//VCOM Offset Set + + ips200_wr_reg(0xC6); + ips200_wr_data(0x01F); //0x0F:60Hz + + ips200_wr_reg(0xD0); + ips200_wr_data(0xA4); + ips200_wr_data(0xA1); + + ips200_wr_reg(0xE0); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x05); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0xE1); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0x21); + + ips200_wr_reg(0x29); + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶清屏函数 +// @param color 颜色设置 +// @return void +// @since v1.0 +// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 +//------------------------------------------------------------------------------------------------------------------- +void ips200_clear(uint16 color) +{ + uint16 i,j; + ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); + for(i=0;i>=1; + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示字符串 +// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) +// @param dat 需要显示的字符串 +// @return void +// @since v1.0 +// Sample usage: ips200_showstr(0,0,"seekfree"); +//------------------------------------------------------------------------------------------------------------------- +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) +{ + uint16 j; + + j = 0; + while(dat[j] != '\0') + { + ips200_showchar(x+8*j,y*16,dat[j]); + j++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int8 +// @return void +// @since v1.0 +// Sample usage: ips200_showint8(0,0,x);//x为int8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint8(uint16 x,uint16 y,int8 dat) +{ + uint8 a[3]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_showchar(x,y*16,' '); + + a[0] = dat/100; + a[1] = dat/10%10; + a[2] = dat%10; + i = 0; + while(i<3) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint8 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int16 +// @return void +// @since v1.0 +// Sample usage: ips200_showint16(0,0,x);//x为int16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint16(uint16 x,uint16 y,int16 dat) +{ + uint8 a[5]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_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) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint16 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示32位有符号(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint32(uint16 x,uint16 y,int 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示浮点数(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param w 图像宽度 +// @param l 图像高度 +// @param *p 图像数组地址 +// @return void +// @since v1.0 +// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) +{ + int i; + unsigned char picH,picL; + ips200_address_set(x,y,x+w-1,y+l-1); + for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; + coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 总钻风(灰度摄像头)液晶缩放显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) +// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) +// @return void +// @since v1.0 +// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + + ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风(二值化摄像头)液晶显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @return void +// @since v1.0 +// @note 图像分辨率需要设置在120(高)*160(宽)以下 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) +{ + int i,j; + + uint16 temp = 0; + ips200_address_set(0,0,width-1,height-1); + for(i=0;i0;j--) + { + temp = (*p_data>>(j-1)) & 0x01; + if(temp) ips200_wr_data16(color); + else ips200_wr_data16(IPS200_BGCOLOR); + } + p_data++; + } + p_data = p_data - temp2 + temp2*size; + } + } +} diff --git a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h new file mode 100644 index 0000000..df01216 --- /dev/null +++ b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h @@ -0,0 +1,199 @@ + +/*/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file 2.0寸IPS屏幕 + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software ADS v1.5.2 + * @Target core TC264 + * @Taobao https://seekfree.taobao.com/ + * @date 2020-05-07 + * @note + 接线定义: + ------------------------------------ +* 模块管脚 单片机管脚 +* // 双排排针 并口两寸屏 硬件引脚 +* RD 查看 SEEKFREE_IPS200.h 中 IPS200_RD_PIN_PARALLEL8 宏定义 +* WR 查看 SEEKFREE_IPS200.h 中 IPS200_WR_PIN_PARALLEL8 宏定义 +* RS 查看 SEEKFREE_IPS200.h 中 IPS200_RS_PIN_PARALLEL8 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_PARALLEL8 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_PARALLEL8 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_PARALLEL8 宏定义 +* D0-D7 查看 SEEKFREE_IPS200.h 中 IPS200_Dx_PIN_PARALLEL8 宏定义 +* // 单排排针 SPI 两寸屏 硬件引脚 +* SCL 查看 SEEKFREE_IPS200.h 中 IPS200_SCL_PIN_SPI 宏定义 +* SDA 查看 SEEKFREE_IPS200.h 中 IPS200_SDA_PIN_SPI 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_SPI 宏定义 +* DC 查看 SEEKFREE_IPS200.h 中 IPS200_DC_PIN_SPI 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_SPI 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_SPI 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 最大分辨率 320 * 240 +* ------------------------------------ + + ********************************************************************************************************************/ + +#ifndef _SEEKFREE_IPS200_H +#define _SEEKFREE_IPS200_H + +#include "common.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_assert.h" +#include "SEEKFREE_PRINTF.h" +#include "zf_spi.h" +#include "SEEKFREE_FUN.h" +#include "SEEKFREE_FONT.h" + + +//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- +//#define RED 0xF800 //红色 +//#define BLUE 0x001F //蓝色 +//#define YELLOW 0xFFE0 //黄色 +//#define GREEN 0x07E0 //绿色 +//#define WHITE 0xFFFF //白色 +//#define BLACK 0x0000 //黑色 +//#define GRAY 0X8430 //灰色 +//#define BROWN 0XBC40 //棕色 +//#define PURPLE 0XF81F //紫色 +//#define PINK 0XFE19 //粉色 + + +#define IPS200_BGCOLOR RGB565_WHITE //背景颜色 +#define IPS200_PENCOLOR RGB565_RED //画笔颜色 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_SPIN SPI_2 //定义使用的SPI号 +#define IPS200_SCL_PIN_SPI SPI2_SCLK_P15_3 //定义SPI_SCK引脚 +#define IPS200_SDA_PIN_SPI SPI2_MOSI_P15_5 //定义SPI_MOSI引脚 +#define IPS200_SDA_IN_PIN_SPI SPI2_MISO_P15_4 //定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 +#define IPS200_CS_PIN_SPI SPI2_CS0_P15_2 //定义SPI_CS引脚 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_RST_PIN_SPI P15_1 // 液晶复位引脚定义 +#define IPS200_DC_PIN_SPI P15_0 +#define IPS200_BL_PIN_SPI P15_4 + + +//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 +//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 +#define IPS200_RD_PIN_PARALLEL8 P15_3 +#define IPS200_WR_PIN_PARALLEL8 P15_5 +#define IPS200_RS_PIN_PARALLEL8 P15_1 +#define IPS200_RST_PIN_PARALLEL8 P15_0 +#define IPS200_CS_PIN_PARALLEL8 P15_2 +#define IPS200_BL_PIN_PARALLEL8 P15_4 + +//并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 +//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, +//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 +//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 +//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 +#define IPS200_D0_PIN_PARALLEL8 P11_9 +#define IPS200_D1_PIN_PARALLEL8 P11_10 +#define IPS200_D2_PIN_PARALLEL8 P11_11 +#define IPS200_D3_PIN_PARALLEL8 P11_12 +#define IPS200_D4_PIN_PARALLEL8 P13_0 +#define IPS200_D5_PIN_PARALLEL8 P13_1 +#define IPS200_D6_PIN_PARALLEL8 P13_2 +#define IPS200_D7_PIN_PARALLEL8 P13_3 + +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c deleted file mode 100644 index 3439d14..0000000 --- a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c +++ /dev/null @@ -1,896 +0,0 @@ -/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#include "stdlib.h" -#include "string.h" -#include "stdio.h" -#include "zf_stm_systick.h" -#include "zf_gpio.h" -#include "zf_assert.h" -#include "SEEKFREE_PRINTF.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_data(uint8 dat) //写数据 -{ - IPS200_DATAPORT1 = (dat << DATA_START_NUM1) | (IPS200_DATAPORT1 & ~((uint32)(0x0F << DATA_START_NUM1)) ); - IPS200_DATAPORT2 = ((dat>>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_reg(uint8 command) //写命令 -{ - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 -{ - ips200_wr_reg(com); - ips200_wr_data(dat); -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) -{ - ips200_wr_reg(0x2a); - ips200_wr_data16(x1); - ips200_wr_data16(x2); - - ips200_wr_reg(0x2b); - ips200_wr_data16(y1); - ips200_wr_data16(y2); - - ips200_wr_reg(0x2c); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 2.0寸 IPS液晶初始化 -// @return void -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) -{ - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - - IPS200_BL(1); - IPS200_RST(0); - systick_delay_ms(STM0, 5); - IPS200_RST(1); - systick_delay_ms(STM0, 5); - - ips200_wr_reg(0x11); - systick_delay_ms(STM0, 120); - - ips200_wr_reg(0x36); - if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); - else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); - else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); - else ips200_wr_data(0xA0); - - - - - - ips200_wr_reg(0x3A); - ips200_wr_data(0x05); - - ips200_wr_reg(0xB2); - ips200_wr_data(0x0C); - ips200_wr_data(0x0C); - ips200_wr_data(0x00); - ips200_wr_data(0x33); - ips200_wr_data(0x33); - - ips200_wr_reg(0xB7); - ips200_wr_data(0x35); - - ips200_wr_reg(0xBB); - ips200_wr_data(0x29); //32 Vcom=1.35V - - ips200_wr_reg(0xC2); - ips200_wr_data(0x01); - - ips200_wr_reg(0xC3); - ips200_wr_data(0x19); //GVDD=4.8V - - ips200_wr_reg(0xC4); - ips200_wr_data(0x20); //VDV, 0x20:0v - - ips200_wr_reg(0xC5); - ips200_wr_data(0x1A);//VCOM Offset Set - - ips200_wr_reg(0xC6); - ips200_wr_data(0x01F); //0x0F:60Hz - - ips200_wr_reg(0xD0); - ips200_wr_data(0xA4); - ips200_wr_data(0xA1); - - ips200_wr_reg(0xE0); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x05); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0xE1); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0x21); - - ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶清屏函数 -// @param color 颜色设置 -// @return void -// @since v1.0 -// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 -//------------------------------------------------------------------------------------------------------------------- -void ips200_clear(uint16 color) -{ - uint16 i,j; - ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); - for(i=0;i>=1; - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示字符串 -// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) -// @param dat 需要显示的字符串 -// @return void -// @since v1.0 -// Sample usage: ips200_showstr(0,0,"seekfree"); -//------------------------------------------------------------------------------------------------------------------- -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) -{ - uint16 j; - - j = 0; - while(dat[j] != '\0') - { - ips200_showchar(x+8*j,y*16,dat[j]); - j++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int8 -// @return void -// @since v1.0 -// Sample usage: ips200_showint8(0,0,x);//x为int8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint8(uint16 x,uint16 y,int8 dat) -{ - uint8 a[3]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_showchar(x,y*16,' '); - - a[0] = dat/100; - a[1] = dat/10%10; - a[2] = dat%10; - i = 0; - while(i<3) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint8 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int16 -// @return void -// @since v1.0 -// Sample usage: ips200_showint16(0,0,x);//x为int16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint16(uint16 x,uint16 y,int16 dat) -{ - uint8 a[5]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_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) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint16 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示32位有符号(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint32 -// @param num 需要显示的位数 最高10位 不包含正负号 -// @return void -// @since v1.0 -// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 -// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint32(uint16 x,uint16 y,int 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示浮点数(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型float或double -// @param num 整数位显示长度 最高10位 -// @param pointnum 小数位显示长度 最高6位 -// @return void -// @since v1.0 -// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 -// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, -// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, -// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param w 图像宽度 -// @param l 图像高度 -// @param *p 图像数组地址 -// @return void -// @since v1.0 -// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) -{ - int i; - unsigned char picH,picL; - ips200_address_set(x,y,x+w-1,y+l-1); - for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; - coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 总钻风(灰度摄像头)液晶缩放显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) -// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) -// @return void -// @since v1.0 -// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - - ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 小钻风(二值化摄像头)液晶显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @return void -// @since v1.0 -// @note 图像分辨率需要设置在120(高)*160(宽)以下 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) -{ - int i,j; - - uint16 temp = 0; - ips200_address_set(0,0,width-1,height-1); - for(i=0;i0;j--) - { - temp = (*p_data>>(j-1)) & 0x01; - if(temp) ips200_wr_data16(color); - else ips200_wr_data16(IPS200_BGCOLOR); - } - p_data++; - } - p_data = p_data - temp2 + temp2*size; - } - } -} diff --git a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/PIT_Demo/Libraries/doc/version.txt b/Example/PIT_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/PIT_Demo/Libraries/doc/version.txt +++ b/Example/PIT_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/PIT_Demo/Libraries/seekfree_libraries/headfile.h b/Example/PIT_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/PIT_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/PIT_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/PIT_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/PIT_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/PIT_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/PIT_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param command 命令 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_reg(uint8 command) //写命令 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 8位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 16位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param com 命令 +// @param dat 数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 +{ + ips200_wr_reg(com); + ips200_wr_data(dat); +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) +{ + ips200_wr_reg(0x2a); + ips200_wr_data16(x1); + ips200_wr_data16(x2); + + ips200_wr_reg(0x2b); + ips200_wr_data16(y1); + ips200_wr_data16(y2); + + ips200_wr_reg(0x2c); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 2.0寸 IPS液晶初始化 +// @return type_select 并口或者串口选择 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_init(ips200_type_enum type_select) +{ + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } + IPS200_BL(1); + IPS200_RST(0); + systick_delay_ms(STM0, 5); + IPS200_RST(1); + systick_delay_ms(STM0, 5); + + ips200_wr_reg(0x11); + systick_delay_ms(STM0, 120); + + ips200_wr_reg(0x36); + if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); + else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); + else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); + else ips200_wr_data(0xA0); + + + ips200_wr_reg(0x3A); + ips200_wr_data(0x05); + + ips200_wr_reg(0xB2); + ips200_wr_data(0x0C); + ips200_wr_data(0x0C); + ips200_wr_data(0x00); + ips200_wr_data(0x33); + ips200_wr_data(0x33); + + ips200_wr_reg(0xB7); + ips200_wr_data(0x35); + + ips200_wr_reg(0xBB); + ips200_wr_data(0x29); //32 Vcom=1.35V + + ips200_wr_reg(0xC2); + ips200_wr_data(0x01); + + ips200_wr_reg(0xC3); + ips200_wr_data(0x19); //GVDD=4.8V + + ips200_wr_reg(0xC4); + ips200_wr_data(0x20); //VDV, 0x20:0v + + ips200_wr_reg(0xC5); + ips200_wr_data(0x1A);//VCOM Offset Set + + ips200_wr_reg(0xC6); + ips200_wr_data(0x01F); //0x0F:60Hz + + ips200_wr_reg(0xD0); + ips200_wr_data(0xA4); + ips200_wr_data(0xA1); + + ips200_wr_reg(0xE0); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x05); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0xE1); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0x21); + + ips200_wr_reg(0x29); + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶清屏函数 +// @param color 颜色设置 +// @return void +// @since v1.0 +// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 +//------------------------------------------------------------------------------------------------------------------- +void ips200_clear(uint16 color) +{ + uint16 i,j; + ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); + for(i=0;i>=1; + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示字符串 +// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) +// @param dat 需要显示的字符串 +// @return void +// @since v1.0 +// Sample usage: ips200_showstr(0,0,"seekfree"); +//------------------------------------------------------------------------------------------------------------------- +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) +{ + uint16 j; + + j = 0; + while(dat[j] != '\0') + { + ips200_showchar(x+8*j,y*16,dat[j]); + j++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int8 +// @return void +// @since v1.0 +// Sample usage: ips200_showint8(0,0,x);//x为int8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint8(uint16 x,uint16 y,int8 dat) +{ + uint8 a[3]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_showchar(x,y*16,' '); + + a[0] = dat/100; + a[1] = dat/10%10; + a[2] = dat%10; + i = 0; + while(i<3) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint8 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int16 +// @return void +// @since v1.0 +// Sample usage: ips200_showint16(0,0,x);//x为int16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint16(uint16 x,uint16 y,int16 dat) +{ + uint8 a[5]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_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) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint16 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示32位有符号(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint32(uint16 x,uint16 y,int 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示浮点数(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param w 图像宽度 +// @param l 图像高度 +// @param *p 图像数组地址 +// @return void +// @since v1.0 +// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) +{ + int i; + unsigned char picH,picL; + ips200_address_set(x,y,x+w-1,y+l-1); + for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; + coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 总钻风(灰度摄像头)液晶缩放显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) +// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) +// @return void +// @since v1.0 +// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + + ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风(二值化摄像头)液晶显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @return void +// @since v1.0 +// @note 图像分辨率需要设置在120(高)*160(宽)以下 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) +{ + int i,j; + + uint16 temp = 0; + ips200_address_set(0,0,width-1,height-1); + for(i=0;i0;j--) + { + temp = (*p_data>>(j-1)) & 0x01; + if(temp) ips200_wr_data16(color); + else ips200_wr_data16(IPS200_BGCOLOR); + } + p_data++; + } + p_data = p_data - temp2 + temp2*size; + } + } +} diff --git a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h new file mode 100644 index 0000000..df01216 --- /dev/null +++ b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h @@ -0,0 +1,199 @@ + +/*/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file 2.0寸IPS屏幕 + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software ADS v1.5.2 + * @Target core TC264 + * @Taobao https://seekfree.taobao.com/ + * @date 2020-05-07 + * @note + 接线定义: + ------------------------------------ +* 模块管脚 单片机管脚 +* // 双排排针 并口两寸屏 硬件引脚 +* RD 查看 SEEKFREE_IPS200.h 中 IPS200_RD_PIN_PARALLEL8 宏定义 +* WR 查看 SEEKFREE_IPS200.h 中 IPS200_WR_PIN_PARALLEL8 宏定义 +* RS 查看 SEEKFREE_IPS200.h 中 IPS200_RS_PIN_PARALLEL8 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_PARALLEL8 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_PARALLEL8 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_PARALLEL8 宏定义 +* D0-D7 查看 SEEKFREE_IPS200.h 中 IPS200_Dx_PIN_PARALLEL8 宏定义 +* // 单排排针 SPI 两寸屏 硬件引脚 +* SCL 查看 SEEKFREE_IPS200.h 中 IPS200_SCL_PIN_SPI 宏定义 +* SDA 查看 SEEKFREE_IPS200.h 中 IPS200_SDA_PIN_SPI 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_SPI 宏定义 +* DC 查看 SEEKFREE_IPS200.h 中 IPS200_DC_PIN_SPI 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_SPI 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_SPI 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 最大分辨率 320 * 240 +* ------------------------------------ + + ********************************************************************************************************************/ + +#ifndef _SEEKFREE_IPS200_H +#define _SEEKFREE_IPS200_H + +#include "common.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_assert.h" +#include "SEEKFREE_PRINTF.h" +#include "zf_spi.h" +#include "SEEKFREE_FUN.h" +#include "SEEKFREE_FONT.h" + + +//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- +//#define RED 0xF800 //红色 +//#define BLUE 0x001F //蓝色 +//#define YELLOW 0xFFE0 //黄色 +//#define GREEN 0x07E0 //绿色 +//#define WHITE 0xFFFF //白色 +//#define BLACK 0x0000 //黑色 +//#define GRAY 0X8430 //灰色 +//#define BROWN 0XBC40 //棕色 +//#define PURPLE 0XF81F //紫色 +//#define PINK 0XFE19 //粉色 + + +#define IPS200_BGCOLOR RGB565_WHITE //背景颜色 +#define IPS200_PENCOLOR RGB565_RED //画笔颜色 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_SPIN SPI_2 //定义使用的SPI号 +#define IPS200_SCL_PIN_SPI SPI2_SCLK_P15_3 //定义SPI_SCK引脚 +#define IPS200_SDA_PIN_SPI SPI2_MOSI_P15_5 //定义SPI_MOSI引脚 +#define IPS200_SDA_IN_PIN_SPI SPI2_MISO_P15_4 //定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 +#define IPS200_CS_PIN_SPI SPI2_CS0_P15_2 //定义SPI_CS引脚 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_RST_PIN_SPI P15_1 // 液晶复位引脚定义 +#define IPS200_DC_PIN_SPI P15_0 +#define IPS200_BL_PIN_SPI P15_4 + + +//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 +//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 +#define IPS200_RD_PIN_PARALLEL8 P15_3 +#define IPS200_WR_PIN_PARALLEL8 P15_5 +#define IPS200_RS_PIN_PARALLEL8 P15_1 +#define IPS200_RST_PIN_PARALLEL8 P15_0 +#define IPS200_CS_PIN_PARALLEL8 P15_2 +#define IPS200_BL_PIN_PARALLEL8 P15_4 + +//并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 +//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, +//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 +//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 +//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 +#define IPS200_D0_PIN_PARALLEL8 P11_9 +#define IPS200_D1_PIN_PARALLEL8 P11_10 +#define IPS200_D2_PIN_PARALLEL8 P11_11 +#define IPS200_D3_PIN_PARALLEL8 P11_12 +#define IPS200_D4_PIN_PARALLEL8 P13_0 +#define IPS200_D5_PIN_PARALLEL8 P13_1 +#define IPS200_D6_PIN_PARALLEL8 P13_2 +#define IPS200_D7_PIN_PARALLEL8 P13_3 + +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c deleted file mode 100644 index 3439d14..0000000 --- a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c +++ /dev/null @@ -1,896 +0,0 @@ -/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#include "stdlib.h" -#include "string.h" -#include "stdio.h" -#include "zf_stm_systick.h" -#include "zf_gpio.h" -#include "zf_assert.h" -#include "SEEKFREE_PRINTF.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_data(uint8 dat) //写数据 -{ - IPS200_DATAPORT1 = (dat << DATA_START_NUM1) | (IPS200_DATAPORT1 & ~((uint32)(0x0F << DATA_START_NUM1)) ); - IPS200_DATAPORT2 = ((dat>>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_reg(uint8 command) //写命令 -{ - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 -{ - ips200_wr_reg(com); - ips200_wr_data(dat); -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) -{ - ips200_wr_reg(0x2a); - ips200_wr_data16(x1); - ips200_wr_data16(x2); - - ips200_wr_reg(0x2b); - ips200_wr_data16(y1); - ips200_wr_data16(y2); - - ips200_wr_reg(0x2c); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 2.0寸 IPS液晶初始化 -// @return void -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) -{ - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - - IPS200_BL(1); - IPS200_RST(0); - systick_delay_ms(STM0, 5); - IPS200_RST(1); - systick_delay_ms(STM0, 5); - - ips200_wr_reg(0x11); - systick_delay_ms(STM0, 120); - - ips200_wr_reg(0x36); - if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); - else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); - else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); - else ips200_wr_data(0xA0); - - - - - - ips200_wr_reg(0x3A); - ips200_wr_data(0x05); - - ips200_wr_reg(0xB2); - ips200_wr_data(0x0C); - ips200_wr_data(0x0C); - ips200_wr_data(0x00); - ips200_wr_data(0x33); - ips200_wr_data(0x33); - - ips200_wr_reg(0xB7); - ips200_wr_data(0x35); - - ips200_wr_reg(0xBB); - ips200_wr_data(0x29); //32 Vcom=1.35V - - ips200_wr_reg(0xC2); - ips200_wr_data(0x01); - - ips200_wr_reg(0xC3); - ips200_wr_data(0x19); //GVDD=4.8V - - ips200_wr_reg(0xC4); - ips200_wr_data(0x20); //VDV, 0x20:0v - - ips200_wr_reg(0xC5); - ips200_wr_data(0x1A);//VCOM Offset Set - - ips200_wr_reg(0xC6); - ips200_wr_data(0x01F); //0x0F:60Hz - - ips200_wr_reg(0xD0); - ips200_wr_data(0xA4); - ips200_wr_data(0xA1); - - ips200_wr_reg(0xE0); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x05); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0xE1); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0x21); - - ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶清屏函数 -// @param color 颜色设置 -// @return void -// @since v1.0 -// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 -//------------------------------------------------------------------------------------------------------------------- -void ips200_clear(uint16 color) -{ - uint16 i,j; - ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); - for(i=0;i>=1; - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示字符串 -// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) -// @param dat 需要显示的字符串 -// @return void -// @since v1.0 -// Sample usage: ips200_showstr(0,0,"seekfree"); -//------------------------------------------------------------------------------------------------------------------- -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) -{ - uint16 j; - - j = 0; - while(dat[j] != '\0') - { - ips200_showchar(x+8*j,y*16,dat[j]); - j++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int8 -// @return void -// @since v1.0 -// Sample usage: ips200_showint8(0,0,x);//x为int8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint8(uint16 x,uint16 y,int8 dat) -{ - uint8 a[3]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_showchar(x,y*16,' '); - - a[0] = dat/100; - a[1] = dat/10%10; - a[2] = dat%10; - i = 0; - while(i<3) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint8 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int16 -// @return void -// @since v1.0 -// Sample usage: ips200_showint16(0,0,x);//x为int16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint16(uint16 x,uint16 y,int16 dat) -{ - uint8 a[5]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_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) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint16 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示32位有符号(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint32 -// @param num 需要显示的位数 最高10位 不包含正负号 -// @return void -// @since v1.0 -// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 -// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint32(uint16 x,uint16 y,int 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示浮点数(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型float或double -// @param num 整数位显示长度 最高10位 -// @param pointnum 小数位显示长度 最高6位 -// @return void -// @since v1.0 -// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 -// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, -// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, -// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param w 图像宽度 -// @param l 图像高度 -// @param *p 图像数组地址 -// @return void -// @since v1.0 -// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) -{ - int i; - unsigned char picH,picL; - ips200_address_set(x,y,x+w-1,y+l-1); - for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; - coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 总钻风(灰度摄像头)液晶缩放显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) -// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) -// @return void -// @since v1.0 -// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - - ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 小钻风(二值化摄像头)液晶显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @return void -// @since v1.0 -// @note 图像分辨率需要设置在120(高)*160(宽)以下 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) -{ - int i,j; - - uint16 temp = 0; - ips200_address_set(0,0,width-1,height-1); - for(i=0;i0;j--) - { - temp = (*p_data>>(j-1)) & 0x01; - if(temp) ips200_wr_data16(color); - else ips200_wr_data16(IPS200_BGCOLOR); - } - p_data++; - } - p_data = p_data - temp2 + temp2*size; - } - } -} diff --git a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/PWM_Demo/Libraries/doc/version.txt b/Example/PWM_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/PWM_Demo/Libraries/doc/version.txt +++ b/Example/PWM_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/PWM_Demo/Libraries/seekfree_libraries/headfile.h b/Example/PWM_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/PWM_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/PWM_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/PWM_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/PWM_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/PWM_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/PWM_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param command 命令 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_reg(uint8 command) //写命令 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 8位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 16位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param com 命令 +// @param dat 数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 +{ + ips200_wr_reg(com); + ips200_wr_data(dat); +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) +{ + ips200_wr_reg(0x2a); + ips200_wr_data16(x1); + ips200_wr_data16(x2); + + ips200_wr_reg(0x2b); + ips200_wr_data16(y1); + ips200_wr_data16(y2); + + ips200_wr_reg(0x2c); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 2.0寸 IPS液晶初始化 +// @return type_select 并口或者串口选择 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_init(ips200_type_enum type_select) +{ + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } + IPS200_BL(1); + IPS200_RST(0); + systick_delay_ms(STM0, 5); + IPS200_RST(1); + systick_delay_ms(STM0, 5); + + ips200_wr_reg(0x11); + systick_delay_ms(STM0, 120); + + ips200_wr_reg(0x36); + if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); + else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); + else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); + else ips200_wr_data(0xA0); + + + ips200_wr_reg(0x3A); + ips200_wr_data(0x05); + + ips200_wr_reg(0xB2); + ips200_wr_data(0x0C); + ips200_wr_data(0x0C); + ips200_wr_data(0x00); + ips200_wr_data(0x33); + ips200_wr_data(0x33); + + ips200_wr_reg(0xB7); + ips200_wr_data(0x35); + + ips200_wr_reg(0xBB); + ips200_wr_data(0x29); //32 Vcom=1.35V + + ips200_wr_reg(0xC2); + ips200_wr_data(0x01); + + ips200_wr_reg(0xC3); + ips200_wr_data(0x19); //GVDD=4.8V + + ips200_wr_reg(0xC4); + ips200_wr_data(0x20); //VDV, 0x20:0v + + ips200_wr_reg(0xC5); + ips200_wr_data(0x1A);//VCOM Offset Set + + ips200_wr_reg(0xC6); + ips200_wr_data(0x01F); //0x0F:60Hz + + ips200_wr_reg(0xD0); + ips200_wr_data(0xA4); + ips200_wr_data(0xA1); + + ips200_wr_reg(0xE0); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x05); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0xE1); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0x21); + + ips200_wr_reg(0x29); + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶清屏函数 +// @param color 颜色设置 +// @return void +// @since v1.0 +// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 +//------------------------------------------------------------------------------------------------------------------- +void ips200_clear(uint16 color) +{ + uint16 i,j; + ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); + for(i=0;i>=1; + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示字符串 +// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) +// @param dat 需要显示的字符串 +// @return void +// @since v1.0 +// Sample usage: ips200_showstr(0,0,"seekfree"); +//------------------------------------------------------------------------------------------------------------------- +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) +{ + uint16 j; + + j = 0; + while(dat[j] != '\0') + { + ips200_showchar(x+8*j,y*16,dat[j]); + j++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int8 +// @return void +// @since v1.0 +// Sample usage: ips200_showint8(0,0,x);//x为int8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint8(uint16 x,uint16 y,int8 dat) +{ + uint8 a[3]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_showchar(x,y*16,' '); + + a[0] = dat/100; + a[1] = dat/10%10; + a[2] = dat%10; + i = 0; + while(i<3) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint8 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int16 +// @return void +// @since v1.0 +// Sample usage: ips200_showint16(0,0,x);//x为int16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint16(uint16 x,uint16 y,int16 dat) +{ + uint8 a[5]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_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) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint16 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示32位有符号(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint32(uint16 x,uint16 y,int 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示浮点数(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param w 图像宽度 +// @param l 图像高度 +// @param *p 图像数组地址 +// @return void +// @since v1.0 +// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) +{ + int i; + unsigned char picH,picL; + ips200_address_set(x,y,x+w-1,y+l-1); + for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; + coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 总钻风(灰度摄像头)液晶缩放显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) +// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) +// @return void +// @since v1.0 +// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + + ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风(二值化摄像头)液晶显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @return void +// @since v1.0 +// @note 图像分辨率需要设置在120(高)*160(宽)以下 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) +{ + int i,j; + + uint16 temp = 0; + ips200_address_set(0,0,width-1,height-1); + for(i=0;i0;j--) + { + temp = (*p_data>>(j-1)) & 0x01; + if(temp) ips200_wr_data16(color); + else ips200_wr_data16(IPS200_BGCOLOR); + } + p_data++; + } + p_data = p_data - temp2 + temp2*size; + } + } +} diff --git a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h new file mode 100644 index 0000000..df01216 --- /dev/null +++ b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h @@ -0,0 +1,199 @@ + +/*/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file 2.0寸IPS屏幕 + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software ADS v1.5.2 + * @Target core TC264 + * @Taobao https://seekfree.taobao.com/ + * @date 2020-05-07 + * @note + 接线定义: + ------------------------------------ +* 模块管脚 单片机管脚 +* // 双排排针 并口两寸屏 硬件引脚 +* RD 查看 SEEKFREE_IPS200.h 中 IPS200_RD_PIN_PARALLEL8 宏定义 +* WR 查看 SEEKFREE_IPS200.h 中 IPS200_WR_PIN_PARALLEL8 宏定义 +* RS 查看 SEEKFREE_IPS200.h 中 IPS200_RS_PIN_PARALLEL8 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_PARALLEL8 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_PARALLEL8 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_PARALLEL8 宏定义 +* D0-D7 查看 SEEKFREE_IPS200.h 中 IPS200_Dx_PIN_PARALLEL8 宏定义 +* // 单排排针 SPI 两寸屏 硬件引脚 +* SCL 查看 SEEKFREE_IPS200.h 中 IPS200_SCL_PIN_SPI 宏定义 +* SDA 查看 SEEKFREE_IPS200.h 中 IPS200_SDA_PIN_SPI 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_SPI 宏定义 +* DC 查看 SEEKFREE_IPS200.h 中 IPS200_DC_PIN_SPI 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_SPI 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_SPI 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 最大分辨率 320 * 240 +* ------------------------------------ + + ********************************************************************************************************************/ + +#ifndef _SEEKFREE_IPS200_H +#define _SEEKFREE_IPS200_H + +#include "common.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_assert.h" +#include "SEEKFREE_PRINTF.h" +#include "zf_spi.h" +#include "SEEKFREE_FUN.h" +#include "SEEKFREE_FONT.h" + + +//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- +//#define RED 0xF800 //红色 +//#define BLUE 0x001F //蓝色 +//#define YELLOW 0xFFE0 //黄色 +//#define GREEN 0x07E0 //绿色 +//#define WHITE 0xFFFF //白色 +//#define BLACK 0x0000 //黑色 +//#define GRAY 0X8430 //灰色 +//#define BROWN 0XBC40 //棕色 +//#define PURPLE 0XF81F //紫色 +//#define PINK 0XFE19 //粉色 + + +#define IPS200_BGCOLOR RGB565_WHITE //背景颜色 +#define IPS200_PENCOLOR RGB565_RED //画笔颜色 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_SPIN SPI_2 //定义使用的SPI号 +#define IPS200_SCL_PIN_SPI SPI2_SCLK_P15_3 //定义SPI_SCK引脚 +#define IPS200_SDA_PIN_SPI SPI2_MOSI_P15_5 //定义SPI_MOSI引脚 +#define IPS200_SDA_IN_PIN_SPI SPI2_MISO_P15_4 //定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 +#define IPS200_CS_PIN_SPI SPI2_CS0_P15_2 //定义SPI_CS引脚 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_RST_PIN_SPI P15_1 // 液晶复位引脚定义 +#define IPS200_DC_PIN_SPI P15_0 +#define IPS200_BL_PIN_SPI P15_4 + + +//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 +//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 +#define IPS200_RD_PIN_PARALLEL8 P15_3 +#define IPS200_WR_PIN_PARALLEL8 P15_5 +#define IPS200_RS_PIN_PARALLEL8 P15_1 +#define IPS200_RST_PIN_PARALLEL8 P15_0 +#define IPS200_CS_PIN_PARALLEL8 P15_2 +#define IPS200_BL_PIN_PARALLEL8 P15_4 + +//并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 +//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, +//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 +//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 +//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 +#define IPS200_D0_PIN_PARALLEL8 P11_9 +#define IPS200_D1_PIN_PARALLEL8 P11_10 +#define IPS200_D2_PIN_PARALLEL8 P11_11 +#define IPS200_D3_PIN_PARALLEL8 P11_12 +#define IPS200_D4_PIN_PARALLEL8 P13_0 +#define IPS200_D5_PIN_PARALLEL8 P13_1 +#define IPS200_D6_PIN_PARALLEL8 P13_2 +#define IPS200_D7_PIN_PARALLEL8 P13_3 + +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c deleted file mode 100644 index 3439d14..0000000 --- a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c +++ /dev/null @@ -1,896 +0,0 @@ -/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#include "stdlib.h" -#include "string.h" -#include "stdio.h" -#include "zf_stm_systick.h" -#include "zf_gpio.h" -#include "zf_assert.h" -#include "SEEKFREE_PRINTF.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_data(uint8 dat) //写数据 -{ - IPS200_DATAPORT1 = (dat << DATA_START_NUM1) | (IPS200_DATAPORT1 & ~((uint32)(0x0F << DATA_START_NUM1)) ); - IPS200_DATAPORT2 = ((dat>>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_reg(uint8 command) //写命令 -{ - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 -{ - ips200_wr_reg(com); - ips200_wr_data(dat); -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) -{ - ips200_wr_reg(0x2a); - ips200_wr_data16(x1); - ips200_wr_data16(x2); - - ips200_wr_reg(0x2b); - ips200_wr_data16(y1); - ips200_wr_data16(y2); - - ips200_wr_reg(0x2c); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 2.0寸 IPS液晶初始化 -// @return void -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) -{ - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - - IPS200_BL(1); - IPS200_RST(0); - systick_delay_ms(STM0, 5); - IPS200_RST(1); - systick_delay_ms(STM0, 5); - - ips200_wr_reg(0x11); - systick_delay_ms(STM0, 120); - - ips200_wr_reg(0x36); - if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); - else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); - else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); - else ips200_wr_data(0xA0); - - - - - - ips200_wr_reg(0x3A); - ips200_wr_data(0x05); - - ips200_wr_reg(0xB2); - ips200_wr_data(0x0C); - ips200_wr_data(0x0C); - ips200_wr_data(0x00); - ips200_wr_data(0x33); - ips200_wr_data(0x33); - - ips200_wr_reg(0xB7); - ips200_wr_data(0x35); - - ips200_wr_reg(0xBB); - ips200_wr_data(0x29); //32 Vcom=1.35V - - ips200_wr_reg(0xC2); - ips200_wr_data(0x01); - - ips200_wr_reg(0xC3); - ips200_wr_data(0x19); //GVDD=4.8V - - ips200_wr_reg(0xC4); - ips200_wr_data(0x20); //VDV, 0x20:0v - - ips200_wr_reg(0xC5); - ips200_wr_data(0x1A);//VCOM Offset Set - - ips200_wr_reg(0xC6); - ips200_wr_data(0x01F); //0x0F:60Hz - - ips200_wr_reg(0xD0); - ips200_wr_data(0xA4); - ips200_wr_data(0xA1); - - ips200_wr_reg(0xE0); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x05); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0xE1); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0x21); - - ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶清屏函数 -// @param color 颜色设置 -// @return void -// @since v1.0 -// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 -//------------------------------------------------------------------------------------------------------------------- -void ips200_clear(uint16 color) -{ - uint16 i,j; - ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); - for(i=0;i>=1; - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示字符串 -// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) -// @param dat 需要显示的字符串 -// @return void -// @since v1.0 -// Sample usage: ips200_showstr(0,0,"seekfree"); -//------------------------------------------------------------------------------------------------------------------- -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) -{ - uint16 j; - - j = 0; - while(dat[j] != '\0') - { - ips200_showchar(x+8*j,y*16,dat[j]); - j++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int8 -// @return void -// @since v1.0 -// Sample usage: ips200_showint8(0,0,x);//x为int8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint8(uint16 x,uint16 y,int8 dat) -{ - uint8 a[3]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_showchar(x,y*16,' '); - - a[0] = dat/100; - a[1] = dat/10%10; - a[2] = dat%10; - i = 0; - while(i<3) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint8 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int16 -// @return void -// @since v1.0 -// Sample usage: ips200_showint16(0,0,x);//x为int16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint16(uint16 x,uint16 y,int16 dat) -{ - uint8 a[5]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_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) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint16 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示32位有符号(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint32 -// @param num 需要显示的位数 最高10位 不包含正负号 -// @return void -// @since v1.0 -// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 -// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint32(uint16 x,uint16 y,int 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示浮点数(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型float或double -// @param num 整数位显示长度 最高10位 -// @param pointnum 小数位显示长度 最高6位 -// @return void -// @since v1.0 -// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 -// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, -// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, -// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param w 图像宽度 -// @param l 图像高度 -// @param *p 图像数组地址 -// @return void -// @since v1.0 -// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) -{ - int i; - unsigned char picH,picL; - ips200_address_set(x,y,x+w-1,y+l-1); - for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; - coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 总钻风(灰度摄像头)液晶缩放显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) -// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) -// @return void -// @since v1.0 -// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - - ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 小钻风(二值化摄像头)液晶显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @return void -// @since v1.0 -// @note 图像分辨率需要设置在120(高)*160(宽)以下 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) -{ - int i,j; - - uint16 temp = 0; - ips200_address_set(0,0,width-1,height-1); - for(i=0;i0;j--) - { - temp = (*p_data>>(j-1)) & 0x01; - if(temp) ips200_wr_data16(color); - else ips200_wr_data16(IPS200_BGCOLOR); - } - p_data++; - } - p_data = p_data - temp2 + temp2*size; - } - } -} diff --git a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/Printf_Demo/Libraries/doc/version.txt b/Example/Printf_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/Printf_Demo/Libraries/doc/version.txt +++ b/Example/Printf_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/Printf_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Printf_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/Printf_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Printf_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/Printf_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/Printf_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/Printf_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/Printf_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param command 命令 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_reg(uint8 command) //写命令 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 8位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 16位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param com 命令 +// @param dat 数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 +{ + ips200_wr_reg(com); + ips200_wr_data(dat); +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) +{ + ips200_wr_reg(0x2a); + ips200_wr_data16(x1); + ips200_wr_data16(x2); + + ips200_wr_reg(0x2b); + ips200_wr_data16(y1); + ips200_wr_data16(y2); + + ips200_wr_reg(0x2c); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 2.0寸 IPS液晶初始化 +// @return type_select 并口或者串口选择 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_init(ips200_type_enum type_select) +{ + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } + IPS200_BL(1); + IPS200_RST(0); + systick_delay_ms(STM0, 5); + IPS200_RST(1); + systick_delay_ms(STM0, 5); + + ips200_wr_reg(0x11); + systick_delay_ms(STM0, 120); + + ips200_wr_reg(0x36); + if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); + else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); + else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); + else ips200_wr_data(0xA0); + + + ips200_wr_reg(0x3A); + ips200_wr_data(0x05); + + ips200_wr_reg(0xB2); + ips200_wr_data(0x0C); + ips200_wr_data(0x0C); + ips200_wr_data(0x00); + ips200_wr_data(0x33); + ips200_wr_data(0x33); + + ips200_wr_reg(0xB7); + ips200_wr_data(0x35); + + ips200_wr_reg(0xBB); + ips200_wr_data(0x29); //32 Vcom=1.35V + + ips200_wr_reg(0xC2); + ips200_wr_data(0x01); + + ips200_wr_reg(0xC3); + ips200_wr_data(0x19); //GVDD=4.8V + + ips200_wr_reg(0xC4); + ips200_wr_data(0x20); //VDV, 0x20:0v + + ips200_wr_reg(0xC5); + ips200_wr_data(0x1A);//VCOM Offset Set + + ips200_wr_reg(0xC6); + ips200_wr_data(0x01F); //0x0F:60Hz + + ips200_wr_reg(0xD0); + ips200_wr_data(0xA4); + ips200_wr_data(0xA1); + + ips200_wr_reg(0xE0); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x05); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0xE1); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0x21); + + ips200_wr_reg(0x29); + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶清屏函数 +// @param color 颜色设置 +// @return void +// @since v1.0 +// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 +//------------------------------------------------------------------------------------------------------------------- +void ips200_clear(uint16 color) +{ + uint16 i,j; + ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); + for(i=0;i>=1; + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示字符串 +// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) +// @param dat 需要显示的字符串 +// @return void +// @since v1.0 +// Sample usage: ips200_showstr(0,0,"seekfree"); +//------------------------------------------------------------------------------------------------------------------- +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) +{ + uint16 j; + + j = 0; + while(dat[j] != '\0') + { + ips200_showchar(x+8*j,y*16,dat[j]); + j++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int8 +// @return void +// @since v1.0 +// Sample usage: ips200_showint8(0,0,x);//x为int8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint8(uint16 x,uint16 y,int8 dat) +{ + uint8 a[3]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_showchar(x,y*16,' '); + + a[0] = dat/100; + a[1] = dat/10%10; + a[2] = dat%10; + i = 0; + while(i<3) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint8 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int16 +// @return void +// @since v1.0 +// Sample usage: ips200_showint16(0,0,x);//x为int16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint16(uint16 x,uint16 y,int16 dat) +{ + uint8 a[5]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_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) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint16 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示32位有符号(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint32(uint16 x,uint16 y,int 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示浮点数(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param w 图像宽度 +// @param l 图像高度 +// @param *p 图像数组地址 +// @return void +// @since v1.0 +// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) +{ + int i; + unsigned char picH,picL; + ips200_address_set(x,y,x+w-1,y+l-1); + for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; + coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 总钻风(灰度摄像头)液晶缩放显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) +// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) +// @return void +// @since v1.0 +// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + + ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风(二值化摄像头)液晶显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @return void +// @since v1.0 +// @note 图像分辨率需要设置在120(高)*160(宽)以下 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) +{ + int i,j; + + uint16 temp = 0; + ips200_address_set(0,0,width-1,height-1); + for(i=0;i0;j--) + { + temp = (*p_data>>(j-1)) & 0x01; + if(temp) ips200_wr_data16(color); + else ips200_wr_data16(IPS200_BGCOLOR); + } + p_data++; + } + p_data = p_data - temp2 + temp2*size; + } + } +} diff --git a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h new file mode 100644 index 0000000..df01216 --- /dev/null +++ b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h @@ -0,0 +1,199 @@ + +/*/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file 2.0寸IPS屏幕 + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software ADS v1.5.2 + * @Target core TC264 + * @Taobao https://seekfree.taobao.com/ + * @date 2020-05-07 + * @note + 接线定义: + ------------------------------------ +* 模块管脚 单片机管脚 +* // 双排排针 并口两寸屏 硬件引脚 +* RD 查看 SEEKFREE_IPS200.h 中 IPS200_RD_PIN_PARALLEL8 宏定义 +* WR 查看 SEEKFREE_IPS200.h 中 IPS200_WR_PIN_PARALLEL8 宏定义 +* RS 查看 SEEKFREE_IPS200.h 中 IPS200_RS_PIN_PARALLEL8 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_PARALLEL8 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_PARALLEL8 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_PARALLEL8 宏定义 +* D0-D7 查看 SEEKFREE_IPS200.h 中 IPS200_Dx_PIN_PARALLEL8 宏定义 +* // 单排排针 SPI 两寸屏 硬件引脚 +* SCL 查看 SEEKFREE_IPS200.h 中 IPS200_SCL_PIN_SPI 宏定义 +* SDA 查看 SEEKFREE_IPS200.h 中 IPS200_SDA_PIN_SPI 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_SPI 宏定义 +* DC 查看 SEEKFREE_IPS200.h 中 IPS200_DC_PIN_SPI 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_SPI 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_SPI 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 最大分辨率 320 * 240 +* ------------------------------------ + + ********************************************************************************************************************/ + +#ifndef _SEEKFREE_IPS200_H +#define _SEEKFREE_IPS200_H + +#include "common.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_assert.h" +#include "SEEKFREE_PRINTF.h" +#include "zf_spi.h" +#include "SEEKFREE_FUN.h" +#include "SEEKFREE_FONT.h" + + +//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- +//#define RED 0xF800 //红色 +//#define BLUE 0x001F //蓝色 +//#define YELLOW 0xFFE0 //黄色 +//#define GREEN 0x07E0 //绿色 +//#define WHITE 0xFFFF //白色 +//#define BLACK 0x0000 //黑色 +//#define GRAY 0X8430 //灰色 +//#define BROWN 0XBC40 //棕色 +//#define PURPLE 0XF81F //紫色 +//#define PINK 0XFE19 //粉色 + + +#define IPS200_BGCOLOR RGB565_WHITE //背景颜色 +#define IPS200_PENCOLOR RGB565_RED //画笔颜色 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_SPIN SPI_2 //定义使用的SPI号 +#define IPS200_SCL_PIN_SPI SPI2_SCLK_P15_3 //定义SPI_SCK引脚 +#define IPS200_SDA_PIN_SPI SPI2_MOSI_P15_5 //定义SPI_MOSI引脚 +#define IPS200_SDA_IN_PIN_SPI SPI2_MISO_P15_4 //定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 +#define IPS200_CS_PIN_SPI SPI2_CS0_P15_2 //定义SPI_CS引脚 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_RST_PIN_SPI P15_1 // 液晶复位引脚定义 +#define IPS200_DC_PIN_SPI P15_0 +#define IPS200_BL_PIN_SPI P15_4 + + +//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 +//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 +#define IPS200_RD_PIN_PARALLEL8 P15_3 +#define IPS200_WR_PIN_PARALLEL8 P15_5 +#define IPS200_RS_PIN_PARALLEL8 P15_1 +#define IPS200_RST_PIN_PARALLEL8 P15_0 +#define IPS200_CS_PIN_PARALLEL8 P15_2 +#define IPS200_BL_PIN_PARALLEL8 P15_4 + +//并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 +//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, +//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 +//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 +//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 +#define IPS200_D0_PIN_PARALLEL8 P11_9 +#define IPS200_D1_PIN_PARALLEL8 P11_10 +#define IPS200_D2_PIN_PARALLEL8 P11_11 +#define IPS200_D3_PIN_PARALLEL8 P11_12 +#define IPS200_D4_PIN_PARALLEL8 P13_0 +#define IPS200_D5_PIN_PARALLEL8 P13_1 +#define IPS200_D6_PIN_PARALLEL8 P13_2 +#define IPS200_D7_PIN_PARALLEL8 P13_3 + +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c deleted file mode 100644 index 3439d14..0000000 --- a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c +++ /dev/null @@ -1,896 +0,0 @@ -/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#include "stdlib.h" -#include "string.h" -#include "stdio.h" -#include "zf_stm_systick.h" -#include "zf_gpio.h" -#include "zf_assert.h" -#include "SEEKFREE_PRINTF.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_data(uint8 dat) //写数据 -{ - IPS200_DATAPORT1 = (dat << DATA_START_NUM1) | (IPS200_DATAPORT1 & ~((uint32)(0x0F << DATA_START_NUM1)) ); - IPS200_DATAPORT2 = ((dat>>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_reg(uint8 command) //写命令 -{ - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 -{ - ips200_wr_reg(com); - ips200_wr_data(dat); -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) -{ - ips200_wr_reg(0x2a); - ips200_wr_data16(x1); - ips200_wr_data16(x2); - - ips200_wr_reg(0x2b); - ips200_wr_data16(y1); - ips200_wr_data16(y2); - - ips200_wr_reg(0x2c); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 2.0寸 IPS液晶初始化 -// @return void -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) -{ - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - - IPS200_BL(1); - IPS200_RST(0); - systick_delay_ms(STM0, 5); - IPS200_RST(1); - systick_delay_ms(STM0, 5); - - ips200_wr_reg(0x11); - systick_delay_ms(STM0, 120); - - ips200_wr_reg(0x36); - if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); - else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); - else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); - else ips200_wr_data(0xA0); - - - - - - ips200_wr_reg(0x3A); - ips200_wr_data(0x05); - - ips200_wr_reg(0xB2); - ips200_wr_data(0x0C); - ips200_wr_data(0x0C); - ips200_wr_data(0x00); - ips200_wr_data(0x33); - ips200_wr_data(0x33); - - ips200_wr_reg(0xB7); - ips200_wr_data(0x35); - - ips200_wr_reg(0xBB); - ips200_wr_data(0x29); //32 Vcom=1.35V - - ips200_wr_reg(0xC2); - ips200_wr_data(0x01); - - ips200_wr_reg(0xC3); - ips200_wr_data(0x19); //GVDD=4.8V - - ips200_wr_reg(0xC4); - ips200_wr_data(0x20); //VDV, 0x20:0v - - ips200_wr_reg(0xC5); - ips200_wr_data(0x1A);//VCOM Offset Set - - ips200_wr_reg(0xC6); - ips200_wr_data(0x01F); //0x0F:60Hz - - ips200_wr_reg(0xD0); - ips200_wr_data(0xA4); - ips200_wr_data(0xA1); - - ips200_wr_reg(0xE0); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x05); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0xE1); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0x21); - - ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶清屏函数 -// @param color 颜色设置 -// @return void -// @since v1.0 -// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 -//------------------------------------------------------------------------------------------------------------------- -void ips200_clear(uint16 color) -{ - uint16 i,j; - ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); - for(i=0;i>=1; - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示字符串 -// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) -// @param dat 需要显示的字符串 -// @return void -// @since v1.0 -// Sample usage: ips200_showstr(0,0,"seekfree"); -//------------------------------------------------------------------------------------------------------------------- -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) -{ - uint16 j; - - j = 0; - while(dat[j] != '\0') - { - ips200_showchar(x+8*j,y*16,dat[j]); - j++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int8 -// @return void -// @since v1.0 -// Sample usage: ips200_showint8(0,0,x);//x为int8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint8(uint16 x,uint16 y,int8 dat) -{ - uint8 a[3]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_showchar(x,y*16,' '); - - a[0] = dat/100; - a[1] = dat/10%10; - a[2] = dat%10; - i = 0; - while(i<3) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint8 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int16 -// @return void -// @since v1.0 -// Sample usage: ips200_showint16(0,0,x);//x为int16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint16(uint16 x,uint16 y,int16 dat) -{ - uint8 a[5]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_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) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint16 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示32位有符号(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint32 -// @param num 需要显示的位数 最高10位 不包含正负号 -// @return void -// @since v1.0 -// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 -// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint32(uint16 x,uint16 y,int 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示浮点数(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型float或double -// @param num 整数位显示长度 最高10位 -// @param pointnum 小数位显示长度 最高6位 -// @return void -// @since v1.0 -// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 -// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, -// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, -// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param w 图像宽度 -// @param l 图像高度 -// @param *p 图像数组地址 -// @return void -// @since v1.0 -// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) -{ - int i; - unsigned char picH,picL; - ips200_address_set(x,y,x+w-1,y+l-1); - for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; - coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 总钻风(灰度摄像头)液晶缩放显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) -// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) -// @return void -// @since v1.0 -// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - - ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 小钻风(二值化摄像头)液晶显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @return void -// @since v1.0 -// @note 图像分辨率需要设置在120(高)*160(宽)以下 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) -{ - int i,j; - - uint16 temp = 0; - ips200_address_set(0,0,width-1,height-1); - for(i=0;i0;j--) - { - temp = (*p_data>>(j-1)) & 0x01; - if(temp) ips200_wr_data16(color); - else ips200_wr_data16(IPS200_BGCOLOR); - } - p_data++; - } - p_data = p_data - temp2 + temp2*size; - } - } -} diff --git a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/doc/version.txt b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/doc/version.txt +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param command 命令 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_reg(uint8 command) //写命令 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 8位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 16位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param com 命令 +// @param dat 数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 +{ + ips200_wr_reg(com); + ips200_wr_data(dat); +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) +{ + ips200_wr_reg(0x2a); + ips200_wr_data16(x1); + ips200_wr_data16(x2); + + ips200_wr_reg(0x2b); + ips200_wr_data16(y1); + ips200_wr_data16(y2); + + ips200_wr_reg(0x2c); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 2.0寸 IPS液晶初始化 +// @return type_select 并口或者串口选择 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_init(ips200_type_enum type_select) +{ + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } + IPS200_BL(1); + IPS200_RST(0); + systick_delay_ms(STM0, 5); + IPS200_RST(1); + systick_delay_ms(STM0, 5); + + ips200_wr_reg(0x11); + systick_delay_ms(STM0, 120); + + ips200_wr_reg(0x36); + if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); + else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); + else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); + else ips200_wr_data(0xA0); + + + ips200_wr_reg(0x3A); + ips200_wr_data(0x05); + + ips200_wr_reg(0xB2); + ips200_wr_data(0x0C); + ips200_wr_data(0x0C); + ips200_wr_data(0x00); + ips200_wr_data(0x33); + ips200_wr_data(0x33); + + ips200_wr_reg(0xB7); + ips200_wr_data(0x35); + + ips200_wr_reg(0xBB); + ips200_wr_data(0x29); //32 Vcom=1.35V + + ips200_wr_reg(0xC2); + ips200_wr_data(0x01); + + ips200_wr_reg(0xC3); + ips200_wr_data(0x19); //GVDD=4.8V + + ips200_wr_reg(0xC4); + ips200_wr_data(0x20); //VDV, 0x20:0v + + ips200_wr_reg(0xC5); + ips200_wr_data(0x1A);//VCOM Offset Set + + ips200_wr_reg(0xC6); + ips200_wr_data(0x01F); //0x0F:60Hz + + ips200_wr_reg(0xD0); + ips200_wr_data(0xA4); + ips200_wr_data(0xA1); + + ips200_wr_reg(0xE0); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x05); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0xE1); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0x21); + + ips200_wr_reg(0x29); + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶清屏函数 +// @param color 颜色设置 +// @return void +// @since v1.0 +// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 +//------------------------------------------------------------------------------------------------------------------- +void ips200_clear(uint16 color) +{ + uint16 i,j; + ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); + for(i=0;i>=1; + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示字符串 +// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) +// @param dat 需要显示的字符串 +// @return void +// @since v1.0 +// Sample usage: ips200_showstr(0,0,"seekfree"); +//------------------------------------------------------------------------------------------------------------------- +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) +{ + uint16 j; + + j = 0; + while(dat[j] != '\0') + { + ips200_showchar(x+8*j,y*16,dat[j]); + j++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int8 +// @return void +// @since v1.0 +// Sample usage: ips200_showint8(0,0,x);//x为int8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint8(uint16 x,uint16 y,int8 dat) +{ + uint8 a[3]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_showchar(x,y*16,' '); + + a[0] = dat/100; + a[1] = dat/10%10; + a[2] = dat%10; + i = 0; + while(i<3) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint8 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int16 +// @return void +// @since v1.0 +// Sample usage: ips200_showint16(0,0,x);//x为int16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint16(uint16 x,uint16 y,int16 dat) +{ + uint8 a[5]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_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) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint16 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示32位有符号(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint32(uint16 x,uint16 y,int 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示浮点数(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param w 图像宽度 +// @param l 图像高度 +// @param *p 图像数组地址 +// @return void +// @since v1.0 +// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) +{ + int i; + unsigned char picH,picL; + ips200_address_set(x,y,x+w-1,y+l-1); + for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; + coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 总钻风(灰度摄像头)液晶缩放显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) +// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) +// @return void +// @since v1.0 +// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + + ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风(二值化摄像头)液晶显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @return void +// @since v1.0 +// @note 图像分辨率需要设置在120(高)*160(宽)以下 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) +{ + int i,j; + + uint16 temp = 0; + ips200_address_set(0,0,width-1,height-1); + for(i=0;i0;j--) + { + temp = (*p_data>>(j-1)) & 0x01; + if(temp) ips200_wr_data16(color); + else ips200_wr_data16(IPS200_BGCOLOR); + } + p_data++; + } + p_data = p_data - temp2 + temp2*size; + } + } +} diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h new file mode 100644 index 0000000..df01216 --- /dev/null +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h @@ -0,0 +1,199 @@ + +/*/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file 2.0寸IPS屏幕 + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software ADS v1.5.2 + * @Target core TC264 + * @Taobao https://seekfree.taobao.com/ + * @date 2020-05-07 + * @note + 接线定义: + ------------------------------------ +* 模块管脚 单片机管脚 +* // 双排排针 并口两寸屏 硬件引脚 +* RD 查看 SEEKFREE_IPS200.h 中 IPS200_RD_PIN_PARALLEL8 宏定义 +* WR 查看 SEEKFREE_IPS200.h 中 IPS200_WR_PIN_PARALLEL8 宏定义 +* RS 查看 SEEKFREE_IPS200.h 中 IPS200_RS_PIN_PARALLEL8 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_PARALLEL8 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_PARALLEL8 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_PARALLEL8 宏定义 +* D0-D7 查看 SEEKFREE_IPS200.h 中 IPS200_Dx_PIN_PARALLEL8 宏定义 +* // 单排排针 SPI 两寸屏 硬件引脚 +* SCL 查看 SEEKFREE_IPS200.h 中 IPS200_SCL_PIN_SPI 宏定义 +* SDA 查看 SEEKFREE_IPS200.h 中 IPS200_SDA_PIN_SPI 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_SPI 宏定义 +* DC 查看 SEEKFREE_IPS200.h 中 IPS200_DC_PIN_SPI 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_SPI 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_SPI 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 最大分辨率 320 * 240 +* ------------------------------------ + + ********************************************************************************************************************/ + +#ifndef _SEEKFREE_IPS200_H +#define _SEEKFREE_IPS200_H + +#include "common.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_assert.h" +#include "SEEKFREE_PRINTF.h" +#include "zf_spi.h" +#include "SEEKFREE_FUN.h" +#include "SEEKFREE_FONT.h" + + +//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- +//#define RED 0xF800 //红色 +//#define BLUE 0x001F //蓝色 +//#define YELLOW 0xFFE0 //黄色 +//#define GREEN 0x07E0 //绿色 +//#define WHITE 0xFFFF //白色 +//#define BLACK 0x0000 //黑色 +//#define GRAY 0X8430 //灰色 +//#define BROWN 0XBC40 //棕色 +//#define PURPLE 0XF81F //紫色 +//#define PINK 0XFE19 //粉色 + + +#define IPS200_BGCOLOR RGB565_WHITE //背景颜色 +#define IPS200_PENCOLOR RGB565_RED //画笔颜色 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_SPIN SPI_2 //定义使用的SPI号 +#define IPS200_SCL_PIN_SPI SPI2_SCLK_P15_3 //定义SPI_SCK引脚 +#define IPS200_SDA_PIN_SPI SPI2_MOSI_P15_5 //定义SPI_MOSI引脚 +#define IPS200_SDA_IN_PIN_SPI SPI2_MISO_P15_4 //定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 +#define IPS200_CS_PIN_SPI SPI2_CS0_P15_2 //定义SPI_CS引脚 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_RST_PIN_SPI P15_1 // 液晶复位引脚定义 +#define IPS200_DC_PIN_SPI P15_0 +#define IPS200_BL_PIN_SPI P15_4 + + +//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 +//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 +#define IPS200_RD_PIN_PARALLEL8 P15_3 +#define IPS200_WR_PIN_PARALLEL8 P15_5 +#define IPS200_RS_PIN_PARALLEL8 P15_1 +#define IPS200_RST_PIN_PARALLEL8 P15_0 +#define IPS200_CS_PIN_PARALLEL8 P15_2 +#define IPS200_BL_PIN_PARALLEL8 P15_4 + +//并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 +//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, +//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 +//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 +//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 +#define IPS200_D0_PIN_PARALLEL8 P11_9 +#define IPS200_D1_PIN_PARALLEL8 P11_10 +#define IPS200_D2_PIN_PARALLEL8 P11_11 +#define IPS200_D3_PIN_PARALLEL8 P11_12 +#define IPS200_D4_PIN_PARALLEL8 P13_0 +#define IPS200_D5_PIN_PARALLEL8 P13_1 +#define IPS200_D6_PIN_PARALLEL8 P13_2 +#define IPS200_D7_PIN_PARALLEL8 P13_3 + +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c deleted file mode 100644 index 3439d14..0000000 --- a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c +++ /dev/null @@ -1,896 +0,0 @@ -/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#include "stdlib.h" -#include "string.h" -#include "stdio.h" -#include "zf_stm_systick.h" -#include "zf_gpio.h" -#include "zf_assert.h" -#include "SEEKFREE_PRINTF.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_data(uint8 dat) //写数据 -{ - IPS200_DATAPORT1 = (dat << DATA_START_NUM1) | (IPS200_DATAPORT1 & ~((uint32)(0x0F << DATA_START_NUM1)) ); - IPS200_DATAPORT2 = ((dat>>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_reg(uint8 command) //写命令 -{ - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 -{ - ips200_wr_reg(com); - ips200_wr_data(dat); -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) -{ - ips200_wr_reg(0x2a); - ips200_wr_data16(x1); - ips200_wr_data16(x2); - - ips200_wr_reg(0x2b); - ips200_wr_data16(y1); - ips200_wr_data16(y2); - - ips200_wr_reg(0x2c); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 2.0寸 IPS液晶初始化 -// @return void -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) -{ - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - - IPS200_BL(1); - IPS200_RST(0); - systick_delay_ms(STM0, 5); - IPS200_RST(1); - systick_delay_ms(STM0, 5); - - ips200_wr_reg(0x11); - systick_delay_ms(STM0, 120); - - ips200_wr_reg(0x36); - if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); - else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); - else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); - else ips200_wr_data(0xA0); - - - - - - ips200_wr_reg(0x3A); - ips200_wr_data(0x05); - - ips200_wr_reg(0xB2); - ips200_wr_data(0x0C); - ips200_wr_data(0x0C); - ips200_wr_data(0x00); - ips200_wr_data(0x33); - ips200_wr_data(0x33); - - ips200_wr_reg(0xB7); - ips200_wr_data(0x35); - - ips200_wr_reg(0xBB); - ips200_wr_data(0x29); //32 Vcom=1.35V - - ips200_wr_reg(0xC2); - ips200_wr_data(0x01); - - ips200_wr_reg(0xC3); - ips200_wr_data(0x19); //GVDD=4.8V - - ips200_wr_reg(0xC4); - ips200_wr_data(0x20); //VDV, 0x20:0v - - ips200_wr_reg(0xC5); - ips200_wr_data(0x1A);//VCOM Offset Set - - ips200_wr_reg(0xC6); - ips200_wr_data(0x01F); //0x0F:60Hz - - ips200_wr_reg(0xD0); - ips200_wr_data(0xA4); - ips200_wr_data(0xA1); - - ips200_wr_reg(0xE0); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x05); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0xE1); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0x21); - - ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶清屏函数 -// @param color 颜色设置 -// @return void -// @since v1.0 -// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 -//------------------------------------------------------------------------------------------------------------------- -void ips200_clear(uint16 color) -{ - uint16 i,j; - ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); - for(i=0;i>=1; - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示字符串 -// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) -// @param dat 需要显示的字符串 -// @return void -// @since v1.0 -// Sample usage: ips200_showstr(0,0,"seekfree"); -//------------------------------------------------------------------------------------------------------------------- -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) -{ - uint16 j; - - j = 0; - while(dat[j] != '\0') - { - ips200_showchar(x+8*j,y*16,dat[j]); - j++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int8 -// @return void -// @since v1.0 -// Sample usage: ips200_showint8(0,0,x);//x为int8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint8(uint16 x,uint16 y,int8 dat) -{ - uint8 a[3]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_showchar(x,y*16,' '); - - a[0] = dat/100; - a[1] = dat/10%10; - a[2] = dat%10; - i = 0; - while(i<3) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint8 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int16 -// @return void -// @since v1.0 -// Sample usage: ips200_showint16(0,0,x);//x为int16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint16(uint16 x,uint16 y,int16 dat) -{ - uint8 a[5]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_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) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint16 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示32位有符号(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint32 -// @param num 需要显示的位数 最高10位 不包含正负号 -// @return void -// @since v1.0 -// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 -// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint32(uint16 x,uint16 y,int 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示浮点数(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型float或double -// @param num 整数位显示长度 最高10位 -// @param pointnum 小数位显示长度 最高6位 -// @return void -// @since v1.0 -// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 -// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, -// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, -// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param w 图像宽度 -// @param l 图像高度 -// @param *p 图像数组地址 -// @return void -// @since v1.0 -// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) -{ - int i; - unsigned char picH,picL; - ips200_address_set(x,y,x+w-1,y+l-1); - for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; - coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 总钻风(灰度摄像头)液晶缩放显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) -// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) -// @return void -// @since v1.0 -// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - - ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 小钻风(二值化摄像头)液晶显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @return void -// @since v1.0 -// @note 图像分辨率需要设置在120(高)*160(宽)以下 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) -{ - int i,j; - - uint16 temp = 0; - ips200_address_set(0,0,width-1,height-1); - for(i=0;i0;j--) - { - temp = (*p_data>>(j-1)) & 0x01; - if(temp) ips200_wr_data16(color); - else ips200_wr_data16(IPS200_BGCOLOR); - } - p_data++; - } - p_data = p_data - temp2 + temp2*size; - } - } -} diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/Systick_Demo/Libraries/doc/version.txt b/Example/Systick_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/Systick_Demo/Libraries/doc/version.txt +++ b/Example/Systick_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/Systick_Demo/Libraries/seekfree_libraries/headfile.h b/Example/Systick_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/Systick_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/Systick_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/Systick_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/Systick_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/Systick_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/Systick_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param command 命令 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_reg(uint8 command) //写命令 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 8位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 16位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param com 命令 +// @param dat 数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 +{ + ips200_wr_reg(com); + ips200_wr_data(dat); +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) +{ + ips200_wr_reg(0x2a); + ips200_wr_data16(x1); + ips200_wr_data16(x2); + + ips200_wr_reg(0x2b); + ips200_wr_data16(y1); + ips200_wr_data16(y2); + + ips200_wr_reg(0x2c); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 2.0寸 IPS液晶初始化 +// @return type_select 并口或者串口选择 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_init(ips200_type_enum type_select) +{ + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } + IPS200_BL(1); + IPS200_RST(0); + systick_delay_ms(STM0, 5); + IPS200_RST(1); + systick_delay_ms(STM0, 5); + + ips200_wr_reg(0x11); + systick_delay_ms(STM0, 120); + + ips200_wr_reg(0x36); + if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); + else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); + else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); + else ips200_wr_data(0xA0); + + + ips200_wr_reg(0x3A); + ips200_wr_data(0x05); + + ips200_wr_reg(0xB2); + ips200_wr_data(0x0C); + ips200_wr_data(0x0C); + ips200_wr_data(0x00); + ips200_wr_data(0x33); + ips200_wr_data(0x33); + + ips200_wr_reg(0xB7); + ips200_wr_data(0x35); + + ips200_wr_reg(0xBB); + ips200_wr_data(0x29); //32 Vcom=1.35V + + ips200_wr_reg(0xC2); + ips200_wr_data(0x01); + + ips200_wr_reg(0xC3); + ips200_wr_data(0x19); //GVDD=4.8V + + ips200_wr_reg(0xC4); + ips200_wr_data(0x20); //VDV, 0x20:0v + + ips200_wr_reg(0xC5); + ips200_wr_data(0x1A);//VCOM Offset Set + + ips200_wr_reg(0xC6); + ips200_wr_data(0x01F); //0x0F:60Hz + + ips200_wr_reg(0xD0); + ips200_wr_data(0xA4); + ips200_wr_data(0xA1); + + ips200_wr_reg(0xE0); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x05); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0xE1); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0x21); + + ips200_wr_reg(0x29); + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶清屏函数 +// @param color 颜色设置 +// @return void +// @since v1.0 +// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 +//------------------------------------------------------------------------------------------------------------------- +void ips200_clear(uint16 color) +{ + uint16 i,j; + ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); + for(i=0;i>=1; + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示字符串 +// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) +// @param dat 需要显示的字符串 +// @return void +// @since v1.0 +// Sample usage: ips200_showstr(0,0,"seekfree"); +//------------------------------------------------------------------------------------------------------------------- +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) +{ + uint16 j; + + j = 0; + while(dat[j] != '\0') + { + ips200_showchar(x+8*j,y*16,dat[j]); + j++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int8 +// @return void +// @since v1.0 +// Sample usage: ips200_showint8(0,0,x);//x为int8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint8(uint16 x,uint16 y,int8 dat) +{ + uint8 a[3]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_showchar(x,y*16,' '); + + a[0] = dat/100; + a[1] = dat/10%10; + a[2] = dat%10; + i = 0; + while(i<3) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint8 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int16 +// @return void +// @since v1.0 +// Sample usage: ips200_showint16(0,0,x);//x为int16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint16(uint16 x,uint16 y,int16 dat) +{ + uint8 a[5]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_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) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint16 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示32位有符号(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint32(uint16 x,uint16 y,int 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示浮点数(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param w 图像宽度 +// @param l 图像高度 +// @param *p 图像数组地址 +// @return void +// @since v1.0 +// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) +{ + int i; + unsigned char picH,picL; + ips200_address_set(x,y,x+w-1,y+l-1); + for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; + coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 总钻风(灰度摄像头)液晶缩放显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) +// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) +// @return void +// @since v1.0 +// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + + ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风(二值化摄像头)液晶显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @return void +// @since v1.0 +// @note 图像分辨率需要设置在120(高)*160(宽)以下 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) +{ + int i,j; + + uint16 temp = 0; + ips200_address_set(0,0,width-1,height-1); + for(i=0;i0;j--) + { + temp = (*p_data>>(j-1)) & 0x01; + if(temp) ips200_wr_data16(color); + else ips200_wr_data16(IPS200_BGCOLOR); + } + p_data++; + } + p_data = p_data - temp2 + temp2*size; + } + } +} diff --git a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h new file mode 100644 index 0000000..df01216 --- /dev/null +++ b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h @@ -0,0 +1,199 @@ + +/*/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file 2.0寸IPS屏幕 + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software ADS v1.5.2 + * @Target core TC264 + * @Taobao https://seekfree.taobao.com/ + * @date 2020-05-07 + * @note + 接线定义: + ------------------------------------ +* 模块管脚 单片机管脚 +* // 双排排针 并口两寸屏 硬件引脚 +* RD 查看 SEEKFREE_IPS200.h 中 IPS200_RD_PIN_PARALLEL8 宏定义 +* WR 查看 SEEKFREE_IPS200.h 中 IPS200_WR_PIN_PARALLEL8 宏定义 +* RS 查看 SEEKFREE_IPS200.h 中 IPS200_RS_PIN_PARALLEL8 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_PARALLEL8 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_PARALLEL8 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_PARALLEL8 宏定义 +* D0-D7 查看 SEEKFREE_IPS200.h 中 IPS200_Dx_PIN_PARALLEL8 宏定义 +* // 单排排针 SPI 两寸屏 硬件引脚 +* SCL 查看 SEEKFREE_IPS200.h 中 IPS200_SCL_PIN_SPI 宏定义 +* SDA 查看 SEEKFREE_IPS200.h 中 IPS200_SDA_PIN_SPI 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_SPI 宏定义 +* DC 查看 SEEKFREE_IPS200.h 中 IPS200_DC_PIN_SPI 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_SPI 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_SPI 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 最大分辨率 320 * 240 +* ------------------------------------ + + ********************************************************************************************************************/ + +#ifndef _SEEKFREE_IPS200_H +#define _SEEKFREE_IPS200_H + +#include "common.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_assert.h" +#include "SEEKFREE_PRINTF.h" +#include "zf_spi.h" +#include "SEEKFREE_FUN.h" +#include "SEEKFREE_FONT.h" + + +//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- +//#define RED 0xF800 //红色 +//#define BLUE 0x001F //蓝色 +//#define YELLOW 0xFFE0 //黄色 +//#define GREEN 0x07E0 //绿色 +//#define WHITE 0xFFFF //白色 +//#define BLACK 0x0000 //黑色 +//#define GRAY 0X8430 //灰色 +//#define BROWN 0XBC40 //棕色 +//#define PURPLE 0XF81F //紫色 +//#define PINK 0XFE19 //粉色 + + +#define IPS200_BGCOLOR RGB565_WHITE //背景颜色 +#define IPS200_PENCOLOR RGB565_RED //画笔颜色 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_SPIN SPI_2 //定义使用的SPI号 +#define IPS200_SCL_PIN_SPI SPI2_SCLK_P15_3 //定义SPI_SCK引脚 +#define IPS200_SDA_PIN_SPI SPI2_MOSI_P15_5 //定义SPI_MOSI引脚 +#define IPS200_SDA_IN_PIN_SPI SPI2_MISO_P15_4 //定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 +#define IPS200_CS_PIN_SPI SPI2_CS0_P15_2 //定义SPI_CS引脚 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_RST_PIN_SPI P15_1 // 液晶复位引脚定义 +#define IPS200_DC_PIN_SPI P15_0 +#define IPS200_BL_PIN_SPI P15_4 + + +//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 +//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 +#define IPS200_RD_PIN_PARALLEL8 P15_3 +#define IPS200_WR_PIN_PARALLEL8 P15_5 +#define IPS200_RS_PIN_PARALLEL8 P15_1 +#define IPS200_RST_PIN_PARALLEL8 P15_0 +#define IPS200_CS_PIN_PARALLEL8 P15_2 +#define IPS200_BL_PIN_PARALLEL8 P15_4 + +//并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 +//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, +//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 +//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 +//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 +#define IPS200_D0_PIN_PARALLEL8 P11_9 +#define IPS200_D1_PIN_PARALLEL8 P11_10 +#define IPS200_D2_PIN_PARALLEL8 P11_11 +#define IPS200_D3_PIN_PARALLEL8 P11_12 +#define IPS200_D4_PIN_PARALLEL8 P13_0 +#define IPS200_D5_PIN_PARALLEL8 P13_1 +#define IPS200_D6_PIN_PARALLEL8 P13_2 +#define IPS200_D7_PIN_PARALLEL8 P13_3 + +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c deleted file mode 100644 index 3439d14..0000000 --- a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c +++ /dev/null @@ -1,896 +0,0 @@ -/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#include "stdlib.h" -#include "string.h" -#include "stdio.h" -#include "zf_stm_systick.h" -#include "zf_gpio.h" -#include "zf_assert.h" -#include "SEEKFREE_PRINTF.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_data(uint8 dat) //写数据 -{ - IPS200_DATAPORT1 = (dat << DATA_START_NUM1) | (IPS200_DATAPORT1 & ~((uint32)(0x0F << DATA_START_NUM1)) ); - IPS200_DATAPORT2 = ((dat>>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_reg(uint8 command) //写命令 -{ - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 -{ - ips200_wr_reg(com); - ips200_wr_data(dat); -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) -{ - ips200_wr_reg(0x2a); - ips200_wr_data16(x1); - ips200_wr_data16(x2); - - ips200_wr_reg(0x2b); - ips200_wr_data16(y1); - ips200_wr_data16(y2); - - ips200_wr_reg(0x2c); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 2.0寸 IPS液晶初始化 -// @return void -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) -{ - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - - IPS200_BL(1); - IPS200_RST(0); - systick_delay_ms(STM0, 5); - IPS200_RST(1); - systick_delay_ms(STM0, 5); - - ips200_wr_reg(0x11); - systick_delay_ms(STM0, 120); - - ips200_wr_reg(0x36); - if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); - else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); - else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); - else ips200_wr_data(0xA0); - - - - - - ips200_wr_reg(0x3A); - ips200_wr_data(0x05); - - ips200_wr_reg(0xB2); - ips200_wr_data(0x0C); - ips200_wr_data(0x0C); - ips200_wr_data(0x00); - ips200_wr_data(0x33); - ips200_wr_data(0x33); - - ips200_wr_reg(0xB7); - ips200_wr_data(0x35); - - ips200_wr_reg(0xBB); - ips200_wr_data(0x29); //32 Vcom=1.35V - - ips200_wr_reg(0xC2); - ips200_wr_data(0x01); - - ips200_wr_reg(0xC3); - ips200_wr_data(0x19); //GVDD=4.8V - - ips200_wr_reg(0xC4); - ips200_wr_data(0x20); //VDV, 0x20:0v - - ips200_wr_reg(0xC5); - ips200_wr_data(0x1A);//VCOM Offset Set - - ips200_wr_reg(0xC6); - ips200_wr_data(0x01F); //0x0F:60Hz - - ips200_wr_reg(0xD0); - ips200_wr_data(0xA4); - ips200_wr_data(0xA1); - - ips200_wr_reg(0xE0); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x05); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0xE1); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0x21); - - ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶清屏函数 -// @param color 颜色设置 -// @return void -// @since v1.0 -// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 -//------------------------------------------------------------------------------------------------------------------- -void ips200_clear(uint16 color) -{ - uint16 i,j; - ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); - for(i=0;i>=1; - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示字符串 -// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) -// @param dat 需要显示的字符串 -// @return void -// @since v1.0 -// Sample usage: ips200_showstr(0,0,"seekfree"); -//------------------------------------------------------------------------------------------------------------------- -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) -{ - uint16 j; - - j = 0; - while(dat[j] != '\0') - { - ips200_showchar(x+8*j,y*16,dat[j]); - j++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int8 -// @return void -// @since v1.0 -// Sample usage: ips200_showint8(0,0,x);//x为int8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint8(uint16 x,uint16 y,int8 dat) -{ - uint8 a[3]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_showchar(x,y*16,' '); - - a[0] = dat/100; - a[1] = dat/10%10; - a[2] = dat%10; - i = 0; - while(i<3) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint8 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int16 -// @return void -// @since v1.0 -// Sample usage: ips200_showint16(0,0,x);//x为int16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint16(uint16 x,uint16 y,int16 dat) -{ - uint8 a[5]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_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) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint16 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示32位有符号(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint32 -// @param num 需要显示的位数 最高10位 不包含正负号 -// @return void -// @since v1.0 -// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 -// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint32(uint16 x,uint16 y,int 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示浮点数(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型float或double -// @param num 整数位显示长度 最高10位 -// @param pointnum 小数位显示长度 最高6位 -// @return void -// @since v1.0 -// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 -// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, -// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, -// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param w 图像宽度 -// @param l 图像高度 -// @param *p 图像数组地址 -// @return void -// @since v1.0 -// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) -{ - int i; - unsigned char picH,picL; - ips200_address_set(x,y,x+w-1,y+l-1); - for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; - coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 总钻风(灰度摄像头)液晶缩放显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) -// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) -// @return void -// @since v1.0 -// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - - ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 小钻风(二值化摄像头)液晶显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @return void -// @since v1.0 -// @note 图像分辨率需要设置在120(高)*160(宽)以下 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) -{ - int i,j; - - uint16 temp = 0; - ips200_address_set(0,0,width-1,height-1); - for(i=0;i0;j--) - { - temp = (*p_data>>(j-1)) & 0x01; - if(temp) ips200_wr_data16(color); - else ips200_wr_data16(IPS200_BGCOLOR); - } - p_data++; - } - p_data = p_data - temp2 + temp2*size; - } - } -} diff --git a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Example/UART_Demo/Libraries/doc/version.txt b/Example/UART_Demo/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Example/UART_Demo/Libraries/doc/version.txt +++ b/Example/UART_Demo/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Example/UART_Demo/Libraries/seekfree_libraries/headfile.h b/Example/UART_Demo/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Example/UART_Demo/Libraries/seekfree_libraries/headfile.h +++ b/Example/UART_Demo/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Example/UART_Demo/Libraries/seekfree_libraries/zf_spi.c b/Example/UART_Demo/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Example/UART_Demo/Libraries/seekfree_libraries/zf_spi.c +++ b/Example/UART_Demo/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param command 命令 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_reg(uint8 command) //写命令 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 8位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 16位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param com 命令 +// @param dat 数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 +{ + ips200_wr_reg(com); + ips200_wr_data(dat); +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) +{ + ips200_wr_reg(0x2a); + ips200_wr_data16(x1); + ips200_wr_data16(x2); + + ips200_wr_reg(0x2b); + ips200_wr_data16(y1); + ips200_wr_data16(y2); + + ips200_wr_reg(0x2c); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 2.0寸 IPS液晶初始化 +// @return type_select 并口或者串口选择 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_init(ips200_type_enum type_select) +{ + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } + IPS200_BL(1); + IPS200_RST(0); + systick_delay_ms(STM0, 5); + IPS200_RST(1); + systick_delay_ms(STM0, 5); + + ips200_wr_reg(0x11); + systick_delay_ms(STM0, 120); + + ips200_wr_reg(0x36); + if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); + else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); + else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); + else ips200_wr_data(0xA0); + + + ips200_wr_reg(0x3A); + ips200_wr_data(0x05); + + ips200_wr_reg(0xB2); + ips200_wr_data(0x0C); + ips200_wr_data(0x0C); + ips200_wr_data(0x00); + ips200_wr_data(0x33); + ips200_wr_data(0x33); + + ips200_wr_reg(0xB7); + ips200_wr_data(0x35); + + ips200_wr_reg(0xBB); + ips200_wr_data(0x29); //32 Vcom=1.35V + + ips200_wr_reg(0xC2); + ips200_wr_data(0x01); + + ips200_wr_reg(0xC3); + ips200_wr_data(0x19); //GVDD=4.8V + + ips200_wr_reg(0xC4); + ips200_wr_data(0x20); //VDV, 0x20:0v + + ips200_wr_reg(0xC5); + ips200_wr_data(0x1A);//VCOM Offset Set + + ips200_wr_reg(0xC6); + ips200_wr_data(0x01F); //0x0F:60Hz + + ips200_wr_reg(0xD0); + ips200_wr_data(0xA4); + ips200_wr_data(0xA1); + + ips200_wr_reg(0xE0); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x05); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0xE1); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0x21); + + ips200_wr_reg(0x29); + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶清屏函数 +// @param color 颜色设置 +// @return void +// @since v1.0 +// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 +//------------------------------------------------------------------------------------------------------------------- +void ips200_clear(uint16 color) +{ + uint16 i,j; + ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); + for(i=0;i>=1; + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示字符串 +// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) +// @param dat 需要显示的字符串 +// @return void +// @since v1.0 +// Sample usage: ips200_showstr(0,0,"seekfree"); +//------------------------------------------------------------------------------------------------------------------- +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) +{ + uint16 j; + + j = 0; + while(dat[j] != '\0') + { + ips200_showchar(x+8*j,y*16,dat[j]); + j++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int8 +// @return void +// @since v1.0 +// Sample usage: ips200_showint8(0,0,x);//x为int8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint8(uint16 x,uint16 y,int8 dat) +{ + uint8 a[3]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_showchar(x,y*16,' '); + + a[0] = dat/100; + a[1] = dat/10%10; + a[2] = dat%10; + i = 0; + while(i<3) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint8 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int16 +// @return void +// @since v1.0 +// Sample usage: ips200_showint16(0,0,x);//x为int16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint16(uint16 x,uint16 y,int16 dat) +{ + uint8 a[5]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_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) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint16 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示32位有符号(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint32(uint16 x,uint16 y,int 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示浮点数(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param w 图像宽度 +// @param l 图像高度 +// @param *p 图像数组地址 +// @return void +// @since v1.0 +// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) +{ + int i; + unsigned char picH,picL; + ips200_address_set(x,y,x+w-1,y+l-1); + for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; + coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 总钻风(灰度摄像头)液晶缩放显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) +// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) +// @return void +// @since v1.0 +// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + + ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风(二值化摄像头)液晶显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @return void +// @since v1.0 +// @note 图像分辨率需要设置在120(高)*160(宽)以下 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) +{ + int i,j; + + uint16 temp = 0; + ips200_address_set(0,0,width-1,height-1); + for(i=0;i0;j--) + { + temp = (*p_data>>(j-1)) & 0x01; + if(temp) ips200_wr_data16(color); + else ips200_wr_data16(IPS200_BGCOLOR); + } + p_data++; + } + p_data = p_data - temp2 + temp2*size; + } + } +} diff --git a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h new file mode 100644 index 0000000..df01216 --- /dev/null +++ b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h @@ -0,0 +1,199 @@ + +/*/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file 2.0寸IPS屏幕 + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software ADS v1.5.2 + * @Target core TC264 + * @Taobao https://seekfree.taobao.com/ + * @date 2020-05-07 + * @note + 接线定义: + ------------------------------------ +* 模块管脚 单片机管脚 +* // 双排排针 并口两寸屏 硬件引脚 +* RD 查看 SEEKFREE_IPS200.h 中 IPS200_RD_PIN_PARALLEL8 宏定义 +* WR 查看 SEEKFREE_IPS200.h 中 IPS200_WR_PIN_PARALLEL8 宏定义 +* RS 查看 SEEKFREE_IPS200.h 中 IPS200_RS_PIN_PARALLEL8 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_PARALLEL8 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_PARALLEL8 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_PARALLEL8 宏定义 +* D0-D7 查看 SEEKFREE_IPS200.h 中 IPS200_Dx_PIN_PARALLEL8 宏定义 +* // 单排排针 SPI 两寸屏 硬件引脚 +* SCL 查看 SEEKFREE_IPS200.h 中 IPS200_SCL_PIN_SPI 宏定义 +* SDA 查看 SEEKFREE_IPS200.h 中 IPS200_SDA_PIN_SPI 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_SPI 宏定义 +* DC 查看 SEEKFREE_IPS200.h 中 IPS200_DC_PIN_SPI 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_SPI 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_SPI 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 最大分辨率 320 * 240 +* ------------------------------------ + + ********************************************************************************************************************/ + +#ifndef _SEEKFREE_IPS200_H +#define _SEEKFREE_IPS200_H + +#include "common.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_assert.h" +#include "SEEKFREE_PRINTF.h" +#include "zf_spi.h" +#include "SEEKFREE_FUN.h" +#include "SEEKFREE_FONT.h" + + +//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- +//#define RED 0xF800 //红色 +//#define BLUE 0x001F //蓝色 +//#define YELLOW 0xFFE0 //黄色 +//#define GREEN 0x07E0 //绿色 +//#define WHITE 0xFFFF //白色 +//#define BLACK 0x0000 //黑色 +//#define GRAY 0X8430 //灰色 +//#define BROWN 0XBC40 //棕色 +//#define PURPLE 0XF81F //紫色 +//#define PINK 0XFE19 //粉色 + + +#define IPS200_BGCOLOR RGB565_WHITE //背景颜色 +#define IPS200_PENCOLOR RGB565_RED //画笔颜色 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_SPIN SPI_2 //定义使用的SPI号 +#define IPS200_SCL_PIN_SPI SPI2_SCLK_P15_3 //定义SPI_SCK引脚 +#define IPS200_SDA_PIN_SPI SPI2_MOSI_P15_5 //定义SPI_MOSI引脚 +#define IPS200_SDA_IN_PIN_SPI SPI2_MISO_P15_4 //定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 +#define IPS200_CS_PIN_SPI SPI2_CS0_P15_2 //定义SPI_CS引脚 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_RST_PIN_SPI P15_1 // 液晶复位引脚定义 +#define IPS200_DC_PIN_SPI P15_0 +#define IPS200_BL_PIN_SPI P15_4 + + +//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 +//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 +#define IPS200_RD_PIN_PARALLEL8 P15_3 +#define IPS200_WR_PIN_PARALLEL8 P15_5 +#define IPS200_RS_PIN_PARALLEL8 P15_1 +#define IPS200_RST_PIN_PARALLEL8 P15_0 +#define IPS200_CS_PIN_PARALLEL8 P15_2 +#define IPS200_BL_PIN_PARALLEL8 P15_4 + +//并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 +//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, +//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 +//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 +//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 +#define IPS200_D0_PIN_PARALLEL8 P11_9 +#define IPS200_D1_PIN_PARALLEL8 P11_10 +#define IPS200_D2_PIN_PARALLEL8 P11_11 +#define IPS200_D3_PIN_PARALLEL8 P11_12 +#define IPS200_D4_PIN_PARALLEL8 P13_0 +#define IPS200_D5_PIN_PARALLEL8 P13_1 +#define IPS200_D6_PIN_PARALLEL8 P13_2 +#define IPS200_D7_PIN_PARALLEL8 P13_3 + +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c deleted file mode 100644 index 3439d14..0000000 --- a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c +++ /dev/null @@ -1,896 +0,0 @@ -/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#include "stdlib.h" -#include "string.h" -#include "stdio.h" -#include "zf_stm_systick.h" -#include "zf_gpio.h" -#include "zf_assert.h" -#include "SEEKFREE_PRINTF.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_data(uint8 dat) //写数据 -{ - IPS200_DATAPORT1 = (dat << DATA_START_NUM1) | (IPS200_DATAPORT1 & ~((uint32)(0x0F << DATA_START_NUM1)) ); - IPS200_DATAPORT2 = ((dat>>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_reg(uint8 command) //写命令 -{ - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 -{ - ips200_wr_reg(com); - ips200_wr_data(dat); -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) -{ - ips200_wr_reg(0x2a); - ips200_wr_data16(x1); - ips200_wr_data16(x2); - - ips200_wr_reg(0x2b); - ips200_wr_data16(y1); - ips200_wr_data16(y2); - - ips200_wr_reg(0x2c); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 2.0寸 IPS液晶初始化 -// @return void -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) -{ - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - - IPS200_BL(1); - IPS200_RST(0); - systick_delay_ms(STM0, 5); - IPS200_RST(1); - systick_delay_ms(STM0, 5); - - ips200_wr_reg(0x11); - systick_delay_ms(STM0, 120); - - ips200_wr_reg(0x36); - if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); - else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); - else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); - else ips200_wr_data(0xA0); - - - - - - ips200_wr_reg(0x3A); - ips200_wr_data(0x05); - - ips200_wr_reg(0xB2); - ips200_wr_data(0x0C); - ips200_wr_data(0x0C); - ips200_wr_data(0x00); - ips200_wr_data(0x33); - ips200_wr_data(0x33); - - ips200_wr_reg(0xB7); - ips200_wr_data(0x35); - - ips200_wr_reg(0xBB); - ips200_wr_data(0x29); //32 Vcom=1.35V - - ips200_wr_reg(0xC2); - ips200_wr_data(0x01); - - ips200_wr_reg(0xC3); - ips200_wr_data(0x19); //GVDD=4.8V - - ips200_wr_reg(0xC4); - ips200_wr_data(0x20); //VDV, 0x20:0v - - ips200_wr_reg(0xC5); - ips200_wr_data(0x1A);//VCOM Offset Set - - ips200_wr_reg(0xC6); - ips200_wr_data(0x01F); //0x0F:60Hz - - ips200_wr_reg(0xD0); - ips200_wr_data(0xA4); - ips200_wr_data(0xA1); - - ips200_wr_reg(0xE0); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x05); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0xE1); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0x21); - - ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶清屏函数 -// @param color 颜色设置 -// @return void -// @since v1.0 -// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 -//------------------------------------------------------------------------------------------------------------------- -void ips200_clear(uint16 color) -{ - uint16 i,j; - ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); - for(i=0;i>=1; - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示字符串 -// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) -// @param dat 需要显示的字符串 -// @return void -// @since v1.0 -// Sample usage: ips200_showstr(0,0,"seekfree"); -//------------------------------------------------------------------------------------------------------------------- -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) -{ - uint16 j; - - j = 0; - while(dat[j] != '\0') - { - ips200_showchar(x+8*j,y*16,dat[j]); - j++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int8 -// @return void -// @since v1.0 -// Sample usage: ips200_showint8(0,0,x);//x为int8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint8(uint16 x,uint16 y,int8 dat) -{ - uint8 a[3]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_showchar(x,y*16,' '); - - a[0] = dat/100; - a[1] = dat/10%10; - a[2] = dat%10; - i = 0; - while(i<3) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint8 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int16 -// @return void -// @since v1.0 -// Sample usage: ips200_showint16(0,0,x);//x为int16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint16(uint16 x,uint16 y,int16 dat) -{ - uint8 a[5]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_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) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint16 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示32位有符号(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint32 -// @param num 需要显示的位数 最高10位 不包含正负号 -// @return void -// @since v1.0 -// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 -// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint32(uint16 x,uint16 y,int 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示浮点数(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型float或double -// @param num 整数位显示长度 最高10位 -// @param pointnum 小数位显示长度 最高6位 -// @return void -// @since v1.0 -// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 -// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, -// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, -// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param w 图像宽度 -// @param l 图像高度 -// @param *p 图像数组地址 -// @return void -// @since v1.0 -// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) -{ - int i; - unsigned char picH,picL; - ips200_address_set(x,y,x+w-1,y+l-1); - for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; - coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 总钻风(灰度摄像头)液晶缩放显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) -// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) -// @return void -// @since v1.0 -// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - - ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 小钻风(二值化摄像头)液晶显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @return void -// @since v1.0 -// @note 图像分辨率需要设置在120(高)*160(宽)以下 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) -{ - int i,j; - - uint16 temp = 0; - ips200_address_set(0,0,width-1,height-1); - for(i=0;i0;j--) - { - temp = (*p_data>>(j-1)) & 0x01; - if(temp) ips200_wr_data16(color); - else ips200_wr_data16(IPS200_BGCOLOR); - } - p_data++; - } - p_data = p_data - temp2 + temp2*size; - } - } -} diff --git a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt b/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt index c32b710..e1e33b4 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt +++ b/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt @@ -1,3 +1,5 @@ +V1.2.9 + 删除SEEKFREE_IPS200_PARALLEL8文件,新增SEEKFREE_IPS200,此文件包含原有的2寸屏并口驱动也包含最新的2寸屏串口驱动 V1.2.8 总钻风底层增加PCLK_MODE获取参数位 diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/headfile.h b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/headfile.h index 91dfef0..574155a 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/headfile.h +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/headfile.h @@ -61,7 +61,7 @@ #include "SEEKFREE_MMA8451.h" #include "SEEKFREE_L3G4200D.h" #include "SEEKFREE_WIRELESS.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" +#include "SEEKFREE_IPS200.h" #include "SEEKFREE_7725.h" #include "SEEKFREE_RDA5807.h" #include "SEEKFREE_7725_UART.h" diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_spi.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_spi.c index 6745f97..b7ffe13 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_spi.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_libraries/zf_spi.c @@ -24,7 +24,7 @@ #include "IfxQspi.h" #include "zf_assert.h" #include "zf_spi.h" - +#include "zf_gpio.h" #define MAX_BAUD 50000000 @@ -183,7 +183,62 @@ void spi_mux(SPIN_enum spi_n, SPI_PIN_enum sck_pin, SPI_PIN_enum mosi_pin, SPI_P } +uint8 get_spi_cs_pin(SPI_PIN_enum cs_pin) +{ + if (SPI0_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI0_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI0_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI0_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI0_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI0_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI0_CS6_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI0_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI0_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI0_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI0_CS13_P15_0 == cs_pin) return gpio_get(P15_0); + else if (SPI1_CS0_P20_8 == cs_pin) return gpio_get(P20_8); + else if (SPI1_CS1_P20_9 == cs_pin) return gpio_get(P20_9); + else if (SPI1_CS2_P20_13 == cs_pin) return gpio_get(P20_13); + else if (SPI1_CS3_P11_10 == cs_pin) return gpio_get(P11_10); + else if (SPI1_CS4_P11_11 == cs_pin) return gpio_get(P11_11); + else if (SPI1_CS5_P11_2 == cs_pin) return gpio_get(P11_2); + else if (SPI1_CS6_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI1_CS7_P33_5 == cs_pin) return gpio_get(P33_5); + else if (SPI1_CS8_P10_4 == cs_pin) return gpio_get(P10_4); + else if (SPI1_CS9_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI1_CS10_P10_0 == cs_pin) return gpio_get(P10_0); + else if (SPI2_CS0_P15_2 == cs_pin) return gpio_get(P15_2); + else if (SPI2_CS1_P14_2 == cs_pin) return gpio_get(P14_2); + else if (SPI2_CS2_P14_6 == cs_pin) return gpio_get(P14_6); + else if (SPI2_CS3_P14_3 == cs_pin) return gpio_get(P14_3); + else if (SPI2_CS5_P15_1 == cs_pin) return gpio_get(P15_1); + else if (SPI2_CS6_P33_13 == cs_pin) return gpio_get(P33_13); + else if (SPI2_CS7_P20_10 == cs_pin) return gpio_get(P20_10); + else if (SPI2_CS8_P20_6 == cs_pin) return gpio_get(P20_6); + else if (SPI2_CS9_P20_3 == cs_pin) return gpio_get(P20_3); + else if (SPI3_CS0_P02_4 == cs_pin) return gpio_get(P02_4); + else if (SPI3_CS1_P02_0 == cs_pin) return gpio_get(P02_0); + else if (SPI3_CS1_P33_9 == cs_pin) return gpio_get(P33_9); + else if (SPI3_CS2_P02_1 == cs_pin) return gpio_get(P02_1); + else if (SPI3_CS2_P33_8 == cs_pin) return gpio_get(P33_8); + else if (SPI3_CS3_P02_2 == cs_pin) return gpio_get(P02_2); + else if (SPI3_CS4_P02_3 == cs_pin) return gpio_get(P02_3); + else if (SPI3_CS4_P23_5 == cs_pin) return gpio_get(P23_5); + else if (SPI3_CS5_P02_8 == cs_pin) return gpio_get(P02_8); + else if (SPI3_CS6_P00_8 == cs_pin) return gpio_get(P00_8); + else if (SPI3_CS7_P00_9 == cs_pin) return gpio_get(P00_9); + else if (SPI3_CS7_P33_7 == cs_pin) return gpio_get(P33_7); + else if (SPI3_CS8_P10_5 == cs_pin) return gpio_get(P10_5); + else if (SPI3_CS11_P33_10 == cs_pin) return gpio_get(P33_10); + else if (SPI3_CS12_P22_2 == cs_pin) return gpio_get(P22_2); + else if (SPI3_CS13_P23_1 == cs_pin) return gpio_get(P23_1); + else + { + ZF_ASSERT(FALSE); + return 0;//如果进入这里说明CS引脚错误 + } +} //------------------------------------------------------------------------------------------------------------------- @@ -335,6 +390,7 @@ void spi_mosi(SPIN_enum spi_n, SPI_PIN_enum cs_pin, uint8 *modata, uint8 *midata while(moudle->STATUS.B.RXFIFOLEVEL == 0); *midata = (uint8)IfxQspi_readReceiveFifo(moudle); } + while(!get_spi_cs_pin(cs_pin)); } diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c index 9b4b650..070fde0 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_18TFT.c @@ -264,7 +264,7 @@ void lcd_init(void) lcd_writeData(0x05); lcd_writeIndex(0x29); - lcd_clear(WHITE);//全白 + lcd_clear(RGB565_WHITE);//全白 } @@ -550,7 +550,7 @@ void showimage(const unsigned char *p) { int i,j,k; unsigned char picH,picL; - lcd_clear(WHITE); //清屏 + lcd_clear(RGB565_WHITE); //清屏 for(k=0;k<4;k++) { @@ -716,8 +716,8 @@ void lcd_displayimage7725(uint8 *p, uint16 width, uint16 height) p++; for(j=0; j<8; j++) { - if( (temp<>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param command 命令 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_reg(uint8 command) //写命令 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + IPS200_DC(0); + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&command,NULL,1,1); + IPS200_DC(1); + } + else + { + IPS200_CS(0); + IPS200_RS(0); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(command); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 8位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,&dat,NULL,1,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data(dat); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param dat 16位数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 +{ + if(IPS200_TYPE_SPI == ips200_display_type) + { + uint8 dat1[2]; + dat1[0] = dat >> 8; + dat1[1] = (uint8)dat; + spi_mosi(IPS200_SPIN,IPS200_CS_PIN_SPI,dat1,NULL,2,1); + } + else + { + IPS200_CS(0); + IPS200_RS(1); + IPS200_RD(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat>>8)); + IPS200_WR(1); + IPS200_WR(0); + ips200_w_data((uint8)(dat)); + IPS200_WR(1); + IPS200_CS(1); + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 内部调用,用户无需关心 +// @param com 命令 +// @param dat 数据 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 +{ + ips200_wr_reg(com); + ips200_wr_data(dat); +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 设置显示区域 内部调用 +// @param x1 起始x轴坐标 +// @param y1 起始y轴坐标 +// @param x2 结束x轴坐标 +// @param y2 结束y轴坐标 +// @return +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) +{ + ips200_wr_reg(0x2a); + ips200_wr_data16(x1); + ips200_wr_data16(x2); + + ips200_wr_reg(0x2b); + ips200_wr_data16(y1); + ips200_wr_data16(y2); + + ips200_wr_reg(0x2c); +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 2.0寸 IPS液晶初始化 +// @return type_select 并口或者串口选择 +// @since v1.0 +// Sample usage: +//------------------------------------------------------------------------------------------------------------------- +void ips200_init(ips200_type_enum type_select) +{ + if(IPS200_TYPE_SPI == type_select) + { + ips200_display_type = IPS200_TYPE_SPI; + ips_rst_pin = IPS200_RST_PIN_SPI; + spi_init(IPS200_SPIN, IPS200_SCL_PIN_SPI, IPS200_SDA_PIN_SPI, IPS200_SDA_IN_PIN_SPI, IPS200_CS_PIN_SPI, 0, 30*1000*1000);//硬件SPI初始化 + + gpio_init(IPS200_BL_PIN_SPI,GPO,1,PUSHPULL); + gpio_init(IPS200_DC_PIN_SPI,GPO,0,PUSHPULL); + gpio_init(ips_rst_pin,GPO,0,PUSHPULL); + } + else + { + ips200_display_type = IPS200_TYPE_PARALLEL8; + ips_rst_pin = IPS200_RST_PIN_PARALLEL8; + gpio_init(IPS200_D0_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D1_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D2_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D3_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D4_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D5_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D6_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_D7_PIN_PARALLEL8, GPO, 0, PUSHPULL); + + gpio_init(IPS200_BL_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_CS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(ips_rst_pin, GPO, 0, PUSHPULL); + gpio_init(IPS200_RS_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_WR_PIN_PARALLEL8, GPO, 0, PUSHPULL); + gpio_init(IPS200_RD_PIN_PARALLEL8, GPO, 0, PUSHPULL); + } + IPS200_BL(1); + IPS200_RST(0); + systick_delay_ms(STM0, 5); + IPS200_RST(1); + systick_delay_ms(STM0, 5); + + ips200_wr_reg(0x11); + systick_delay_ms(STM0, 120); + + ips200_wr_reg(0x36); + if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); + else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); + else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); + else ips200_wr_data(0xA0); + + + ips200_wr_reg(0x3A); + ips200_wr_data(0x05); + + ips200_wr_reg(0xB2); + ips200_wr_data(0x0C); + ips200_wr_data(0x0C); + ips200_wr_data(0x00); + ips200_wr_data(0x33); + ips200_wr_data(0x33); + + ips200_wr_reg(0xB7); + ips200_wr_data(0x35); + + ips200_wr_reg(0xBB); + ips200_wr_data(0x29); //32 Vcom=1.35V + + ips200_wr_reg(0xC2); + ips200_wr_data(0x01); + + ips200_wr_reg(0xC3); + ips200_wr_data(0x19); //GVDD=4.8V + + ips200_wr_reg(0xC4); + ips200_wr_data(0x20); //VDV, 0x20:0v + + ips200_wr_reg(0xC5); + ips200_wr_data(0x1A);//VCOM Offset Set + + ips200_wr_reg(0xC6); + ips200_wr_data(0x01F); //0x0F:60Hz + + ips200_wr_reg(0xD0); + ips200_wr_data(0xA4); + ips200_wr_data(0xA1); + + ips200_wr_reg(0xE0); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x05); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0xE1); + ips200_wr_data(0xD0); + ips200_wr_data(0x08); + ips200_wr_data(0x0E); + ips200_wr_data(0x09); + ips200_wr_data(0x09); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x33); + ips200_wr_data(0x48); + ips200_wr_data(0x17); + ips200_wr_data(0x14); + ips200_wr_data(0x15); + ips200_wr_data(0x31); + ips200_wr_data(0x34); + + ips200_wr_reg(0x21); + + ips200_wr_reg(0x29); + ips200_clear(IPS200_BGCOLOR); //初始化为白屏 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶清屏函数 +// @param color 颜色设置 +// @return void +// @since v1.0 +// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 +//------------------------------------------------------------------------------------------------------------------- +void ips200_clear(uint16 color) +{ + uint16 i,j; + ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); + for(i=0;i>=1; + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示字符串 +// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) +// @param dat 需要显示的字符串 +// @return void +// @since v1.0 +// Sample usage: ips200_showstr(0,0,"seekfree"); +//------------------------------------------------------------------------------------------------------------------- +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) +{ + uint16 j; + + j = 0; + while(dat[j] != '\0') + { + ips200_showchar(x+8*j,y*16,dat[j]); + j++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int8 +// @return void +// @since v1.0 +// Sample usage: ips200_showint8(0,0,x);//x为int8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint8(uint16 x,uint16 y,int8 dat) +{ + uint8 a[3]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_showchar(x,y*16,' '); + + a[0] = dat/100; + a[1] = dat/10%10; + a[2] = dat%10; + i = 0; + while(i<3) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint8 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位有符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型int16 +// @return void +// @since v1.0 +// Sample usage: ips200_showint16(0,0,x);//x为int16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint16(uint16 x,uint16 y,int16 dat) +{ + uint8 a[5]; + uint8 i; + if(dat<0) + { + ips200_showchar(x,y*16,'-'); + dat = -dat; + } + else ips200_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) + { + ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); + i++; + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示16位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint16 +// @return void +// @since v1.0 +// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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) + { + ips200_showchar(x+(8*i),y*16,'0' + a[i]); + i++; + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示32位有符号(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型uint32 +// @param num 需要显示的位数 最高10位 不包含正负号 +// @return void +// @since v1.0 +// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 +// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showint32(uint16 x,uint16 y,int 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示浮点数(去除整数部分无效的0) +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param dat 需要显示的变量,数据类型float或double +// @param num 整数位显示长度 最高10位 +// @param pointnum 小数位显示长度 最高6位 +// @return void +// @since v1.0 +// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 +// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, +// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, +// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 +// 负数会显示一个 ‘-’号 正数显示一个空格 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; + + ips200_showstr(x, y, buff); //显示数字 +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 液晶显示8位无符号 +// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) +// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) +// @param w 图像宽度 +// @param l 图像高度 +// @param *p 图像数组地址 +// @return void +// @since v1.0 +// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 +//------------------------------------------------------------------------------------------------------------------- +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) +{ + int i; + unsigned char picH,picL; + ips200_address_set(x,y,x+w-1,y+l-1); + for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; + coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 总钻风(灰度摄像头)液晶缩放显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) +// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) +// @return void +// @since v1.0 +// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 +//------------------------------------------------------------------------------------------------------------------- +void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(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)); + ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + + ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); + if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); + + ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 + + for(j=0;j>8); + ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 +// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 +// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) +{ + uint32 i,j; + uint16 color = 0; + uint16 temp = 0; + + ips200_address_set(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)); + ips200_wr_data16(color); + } + } +} + + +//------------------------------------------------------------------------------------------------------------------- +// @brief 小钻风(二值化摄像头)液晶显示函数 +// @param *p 图像数组地址 +// @param width 图像宽度 +// @param height 图像高度 +// @return void +// @since v1.0 +// @note 图像分辨率需要设置在120(高)*160(宽)以下 +//------------------------------------------------------------------------------------------------------------------- +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) +{ + int i,j; + + uint16 temp = 0; + ips200_address_set(0,0,width-1,height-1); + for(i=0;i0;j--) + { + temp = (*p_data>>(j-1)) & 0x01; + if(temp) ips200_wr_data16(color); + else ips200_wr_data16(IPS200_BGCOLOR); + } + p_data++; + } + p_data = p_data - temp2 + temp2*size; + } + } +} diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h new file mode 100644 index 0000000..df01216 --- /dev/null +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IPS200.h @@ -0,0 +1,199 @@ + +/*/********************************************************************************************************************* + * COPYRIGHT NOTICE + * Copyright (c) 2020,逐飞科技 + * All rights reserved. + * 技术讨论QQ群:三群:824575535 + * + * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, + * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 + * + * @file 2.0寸IPS屏幕 + * @company 成都逐飞科技有限公司 + * @author 逐飞科技(QQ3184284598) + * @version 查看doc内version文件 版本说明 + * @Software ADS v1.5.2 + * @Target core TC264 + * @Taobao https://seekfree.taobao.com/ + * @date 2020-05-07 + * @note + 接线定义: + ------------------------------------ +* 模块管脚 单片机管脚 +* // 双排排针 并口两寸屏 硬件引脚 +* RD 查看 SEEKFREE_IPS200.h 中 IPS200_RD_PIN_PARALLEL8 宏定义 +* WR 查看 SEEKFREE_IPS200.h 中 IPS200_WR_PIN_PARALLEL8 宏定义 +* RS 查看 SEEKFREE_IPS200.h 中 IPS200_RS_PIN_PARALLEL8 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_PARALLEL8 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_PARALLEL8 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_PARALLEL8 宏定义 +* D0-D7 查看 SEEKFREE_IPS200.h 中 IPS200_Dx_PIN_PARALLEL8 宏定义 +* // 单排排针 SPI 两寸屏 硬件引脚 +* SCL 查看 SEEKFREE_IPS200.h 中 IPS200_SCL_PIN_SPI 宏定义 +* SDA 查看 SEEKFREE_IPS200.h 中 IPS200_SDA_PIN_SPI 宏定义 +* RST 查看 SEEKFREE_IPS200.h 中 IPS200_RST_PIN_SPI 宏定义 +* DC 查看 SEEKFREE_IPS200.h 中 IPS200_DC_PIN_SPI 宏定义 +* CS 查看 SEEKFREE_IPS200.h 中 IPS200_CS_PIN_SPI 宏定义 +* BL 查看 SEEKFREE_IPS200.h 中 IPS200_BL_PIN_SPI 宏定义 +* 电源引脚 +* VCC 3.3V电源 +* GND 电源地 +* 最大分辨率 320 * 240 +* ------------------------------------ + + ********************************************************************************************************************/ + +#ifndef _SEEKFREE_IPS200_H +#define _SEEKFREE_IPS200_H + +#include "common.h" +#include "stdlib.h" +#include "string.h" +#include "stdio.h" +#include "zf_stm_systick.h" +#include "zf_gpio.h" +#include "zf_assert.h" +#include "SEEKFREE_PRINTF.h" +#include "zf_spi.h" +#include "SEEKFREE_FUN.h" +#include "SEEKFREE_FONT.h" + + +//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- +//#define RED 0xF800 //红色 +//#define BLUE 0x001F //蓝色 +//#define YELLOW 0xFFE0 //黄色 +//#define GREEN 0x07E0 //绿色 +//#define WHITE 0xFFFF //白色 +//#define BLACK 0x0000 //黑色 +//#define GRAY 0X8430 //灰色 +//#define BROWN 0XBC40 //棕色 +//#define PURPLE 0XF81F //紫色 +//#define PINK 0XFE19 //粉色 + + +#define IPS200_BGCOLOR RGB565_WHITE //背景颜色 +#define IPS200_PENCOLOR RGB565_RED //画笔颜色 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_SPIN SPI_2 //定义使用的SPI号 +#define IPS200_SCL_PIN_SPI SPI2_SCLK_P15_3 //定义SPI_SCK引脚 +#define IPS200_SDA_PIN_SPI SPI2_MOSI_P15_5 //定义SPI_MOSI引脚 +#define IPS200_SDA_IN_PIN_SPI SPI2_MISO_P15_4 //定义SPI_MISO引脚 IPS没有MISO引脚,但是这里任然需要定义,在spi的初始化时需要使用 +#define IPS200_CS_PIN_SPI SPI2_CS0_P15_2 //定义SPI_CS引脚 + +// 如果使用的是单排排针的两寸屏幕 SPI 驱动控制引脚 可以修改 +#define IPS200_RST_PIN_SPI P15_1 // 液晶复位引脚定义 +#define IPS200_DC_PIN_SPI P15_0 +#define IPS200_BL_PIN_SPI P15_4 + + +//如果使用的是双排排针的两寸屏幕 并口驱动控制引脚 可以修改 +//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 +#define IPS200_RD_PIN_PARALLEL8 P15_3 +#define IPS200_WR_PIN_PARALLEL8 P15_5 +#define IPS200_RS_PIN_PARALLEL8 P15_1 +#define IPS200_RST_PIN_PARALLEL8 P15_0 +#define IPS200_CS_PIN_PARALLEL8 P15_2 +#define IPS200_BL_PIN_PARALLEL8 P15_4 + +//并口驱动数据引脚 可以修改 如果你的屏幕是双排排针 这里的引脚用得到 +//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, +//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 +//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 +//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 +#define IPS200_D0_PIN_PARALLEL8 P11_9 +#define IPS200_D1_PIN_PARALLEL8 P11_10 +#define IPS200_D2_PIN_PARALLEL8 P11_11 +#define IPS200_D3_PIN_PARALLEL8 P11_12 +#define IPS200_D4_PIN_PARALLEL8 P13_0 +#define IPS200_D5_PIN_PARALLEL8 P13_1 +#define IPS200_D6_PIN_PARALLEL8 P13_2 +#define IPS200_D7_PIN_PARALLEL8 P13_3 + +//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 +#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM1 (IPS200_D0_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + +#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 + +#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 +#define DATA_START_NUM2 (IPS200_D4_PIN_PARALLEL8&0x1f) //宏定义数据引脚的起始编号 + + + + +#define IPS200_BL(x) gpio_set(IPS200_BL_PIN_PARALLEL8,x) +#define IPS200_CS(x) gpio_set(IPS200_CS_PIN_PARALLEL8,x) +#define IPS200_RD(x) gpio_set(IPS200_RD_PIN_PARALLEL8,x) +#define IPS200_WR(x) gpio_set(IPS200_WR_PIN_PARALLEL8,x) +#define IPS200_RS(x) gpio_set(IPS200_RS_PIN_PARALLEL8,x) +#define IPS200_RST(x) gpio_set(ips_rst_pin,x) + +#define IPS200_DC(x) gpio_set(IPS200_DC_PIN_SPI,x) + +#define IPS200_W 240 +#define IPS200_H 320 + +typedef enum +{ + IPS200_TYPE_SPI, // SPI 驱动 + IPS200_TYPE_PARALLEL8, // 并口驱动 +}ips200_type_enum; + +//定义显示方向 +//0 竖屏模式 +//1 竖屏模式 旋转180° +//2 横屏模式 +//3 横屏模式 旋转180° +#define IPS200_DISPLAY_DIR 0 + +#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_W //液晶X方宽度 +#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 + +#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) +#define IPS200_X_MAX IPS200_H //液晶X方宽度 +#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 + +#else +#error "IPS200_DISPLAY_DIR 定义错误" + +#endif + + +void ips200_init(ips200_type_enum type_select); //初始化硬件 +void ips200_w_data(uint8 dat); +void ips200_wr_reg(uint8 com); +void ips200_wr_data(uint8 dat); +void ips200_wr_data16(uint16 dat); +void ips200_w_reg(uint8 com,uint8 dat); +void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); +void ips200_clear(uint16 color); +void ips200_drawpoint(uint16 x,uint16 y,uint16 color); +void ips200_showchar(uint16 x,uint16 y,const int8 dat); +void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); + + +void ips200_showint8(uint16 x,uint16 y,int8 dat); +void ips200_showuint8(uint16 x,uint16 y,uint8 dat); +void ips200_showint16(uint16 x,uint16 y,int16 dat); +void ips200_showuint16(uint16 x,uint16 y,uint16 dat); +void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); +void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); +void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); + +void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); +void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); +void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); +void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); +void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); + +#endif + diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c deleted file mode 100644 index 3439d14..0000000 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.c +++ /dev/null @@ -1,896 +0,0 @@ -/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#include "stdlib.h" -#include "string.h" -#include "stdio.h" -#include "zf_stm_systick.h" -#include "zf_gpio.h" -#include "zf_assert.h" -#include "SEEKFREE_PRINTF.h" -#include "SEEKFREE_IPS200_PARALLEL8.h" - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_data(uint8 dat) //写数据 -{ - IPS200_DATAPORT1 = (dat << DATA_START_NUM1) | (IPS200_DATAPORT1 & ~((uint32)(0x0F << DATA_START_NUM1)) ); - IPS200_DATAPORT2 = ((dat>>4) << DATA_START_NUM2) | (IPS200_DATAPORT2 & ~((uint32)(0x0F << DATA_START_NUM2)) ); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_reg(uint8 command) //写命令 -{ - IPS200_CS(0); - IPS200_RS(0); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(command); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data(uint8 dat) //向液晶屏写一个8位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data(dat); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_wr_data16(uint16 dat) //向液晶屏写一个16位数据 -{ - IPS200_CS(0); - IPS200_RS(1); - IPS200_RD(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat>>8)); - IPS200_WR(1); - IPS200_WR(0); - ips200_w_data((uint8)(dat)); - IPS200_WR(1); - IPS200_CS(1); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_w_reg(uint8 com,uint8 dat) //写寄存器 -{ - ips200_wr_reg(com); - ips200_wr_data(dat); -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 内部调用,用户无需关心 -// @param void -// @return -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2) -{ - ips200_wr_reg(0x2a); - ips200_wr_data16(x1); - ips200_wr_data16(x2); - - ips200_wr_reg(0x2b); - ips200_wr_data16(y1); - ips200_wr_data16(y2); - - ips200_wr_reg(0x2c); -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 2.0寸 IPS液晶初始化 -// @return void -// @since v1.0 -// Sample usage: -//------------------------------------------------------------------------------------------------------------------- -void ips200_init(void) -{ - gpio_init(IPS200_D0_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D1_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D2_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D3_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D4_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D5_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D6_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_D7_PIN, GPO, 0, PUSHPULL); - - gpio_init(IPS200_BL_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_CS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RST_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RS_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_WR_PIN, GPO, 0, PUSHPULL); - gpio_init(IPS200_RD_PIN, GPO, 0, PUSHPULL); - - IPS200_BL(1); - IPS200_RST(0); - systick_delay_ms(STM0, 5); - IPS200_RST(1); - systick_delay_ms(STM0, 5); - - ips200_wr_reg(0x11); - systick_delay_ms(STM0, 120); - - ips200_wr_reg(0x36); - if (IPS200_DISPLAY_DIR==0) ips200_wr_data(0x00); - else if (IPS200_DISPLAY_DIR==1) ips200_wr_data(0xC0); - else if (IPS200_DISPLAY_DIR==2) ips200_wr_data(0x70); - else ips200_wr_data(0xA0); - - - - - - ips200_wr_reg(0x3A); - ips200_wr_data(0x05); - - ips200_wr_reg(0xB2); - ips200_wr_data(0x0C); - ips200_wr_data(0x0C); - ips200_wr_data(0x00); - ips200_wr_data(0x33); - ips200_wr_data(0x33); - - ips200_wr_reg(0xB7); - ips200_wr_data(0x35); - - ips200_wr_reg(0xBB); - ips200_wr_data(0x29); //32 Vcom=1.35V - - ips200_wr_reg(0xC2); - ips200_wr_data(0x01); - - ips200_wr_reg(0xC3); - ips200_wr_data(0x19); //GVDD=4.8V - - ips200_wr_reg(0xC4); - ips200_wr_data(0x20); //VDV, 0x20:0v - - ips200_wr_reg(0xC5); - ips200_wr_data(0x1A);//VCOM Offset Set - - ips200_wr_reg(0xC6); - ips200_wr_data(0x01F); //0x0F:60Hz - - ips200_wr_reg(0xD0); - ips200_wr_data(0xA4); - ips200_wr_data(0xA1); - - ips200_wr_reg(0xE0); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x05); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0xE1); - ips200_wr_data(0xD0); - ips200_wr_data(0x08); - ips200_wr_data(0x0E); - ips200_wr_data(0x09); - ips200_wr_data(0x09); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x33); - ips200_wr_data(0x48); - ips200_wr_data(0x17); - ips200_wr_data(0x14); - ips200_wr_data(0x15); - ips200_wr_data(0x31); - ips200_wr_data(0x34); - - ips200_wr_reg(0x21); - - ips200_wr_reg(0x29); - ips200_clear(IPS200_BGCOLOR); //初始化为白屏 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶清屏函数 -// @param color 颜色设置 -// @return void -// @since v1.0 -// Sample usage: ips200_clear(YELLOW);// 全屏设置为黄色 -//------------------------------------------------------------------------------------------------------------------- -void ips200_clear(uint16 color) -{ - uint16 i,j; - ips200_address_set(0,0,IPS200_X_MAX-1,IPS200_Y_MAX-1); - for(i=0;i>=1; - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示字符串 -// @param x 坐标x方向的起点 参数范围 0 - (IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 - (IPS200_Y_MAX/16-1) -// @param dat 需要显示的字符串 -// @return void -// @since v1.0 -// Sample usage: ips200_showstr(0,0,"seekfree"); -//------------------------------------------------------------------------------------------------------------------- -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]) -{ - uint16 j; - - j = 0; - while(dat[j] != '\0') - { - ips200_showchar(x+8*j,y*16,dat[j]); - j++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int8 -// @return void -// @since v1.0 -// Sample usage: ips200_showint8(0,0,x);//x为int8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint8(uint16 x,uint16 y,int8 dat) -{ - uint8 a[3]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_showchar(x,y*16,' '); - - a[0] = dat/100; - a[1] = dat/10%10; - a[2] = dat%10; - i = 0; - while(i<3) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint8 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint8(0,0,x);//x为uint8类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位有符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型int16 -// @return void -// @since v1.0 -// Sample usage: ips200_showint16(0,0,x);//x为int16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint16(uint16 x,uint16 y,int16 dat) -{ - uint8 a[5]; - uint8 i; - if(dat<0) - { - ips200_showchar(x,y*16,'-'); - dat = -dat; - } - else ips200_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) - { - ips200_showchar(x+(8*(i+1)),y*16,'0' + a[i]); - i++; - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示16位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint16 -// @return void -// @since v1.0 -// Sample usage: ips200_showuint16(0,0,x);//x为uint16类型 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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) - { - ips200_showchar(x+(8*i),y*16,'0' + a[i]); - i++; - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示32位有符号(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型uint32 -// @param num 需要显示的位数 最高10位 不包含正负号 -// @return void -// @since v1.0 -// Sample usage: ips200_showint32(0,0,x,3);//x可以为int32 uint16 int16 uint8 int8类型 -// Sample usage: 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showint32(uint16 x,uint16 y,int 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示浮点数(去除整数部分无效的0) -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param dat 需要显示的变量,数据类型float或double -// @param num 整数位显示长度 最高10位 -// @param pointnum 小数位显示长度 最高6位 -// @return void -// @since v1.0 -// Sample usage: ips_showfloat(0,0,x,2,3);//显示浮点数 整数显示2位 小数显示三位 -// @note 特别注意当发现小数部分显示的值与你写入的值不一样的时候, -// 可能是由于浮点数精度丢失问题导致的,这并不是显示函数的问题, -// 有关问题的详情,请自行百度学习 浮点数精度丢失问题。 -// 负数会显示一个 ‘-’号 正数显示一个空格 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 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'; - - ips200_showstr(x, y, buff); //显示数字 -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 液晶显示8位无符号 -// @param x 坐标x方向的起点 参数范围 0 -(IPS200_X_MAX-1) -// @param y 坐标y方向的起点 参数范围 0 -(IPS200_Y_MAX/16-1) -// @param w 图像宽度 -// @param l 图像高度 -// @param *p 图像数组地址 -// @return void -// @since v1.0 -// Sample usage: ips200_showimage(0,0,10,20,&image);//图像起点(0,0)。宽10,高20。 -//------------------------------------------------------------------------------------------------------------------- -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p) -{ - int i; - unsigned char picH,picL; - ips200_address_set(x,y,x+w-1,y+l-1); - for(i=0;iIPS200_X_MAX?IPS200_X_MAX:width; - coord_y = height>IPS200_Y_MAX?IPS200_Y_MAX:height; - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 总钻风(灰度摄像头)液晶缩放显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @param dis_width 图像显示宽度 0 -(IPS200_X_MAX-1) -// @param dis_height 图像显示高度 0 -(IPS200_Y_MAX-1) -// @return void -// @since v1.0 -// Sample usage: ips200_displayimage032_zoom(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -// @note 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage032_zoom1(mt9v03x_csi_image[0], MT9V03X_CSI_W, MT9V03X_CSI_H, 0, 0, MT9V03X_CSI_W, MT9V03X_CSI_H)//显示灰度摄像头 图像 -//------------------------------------------------------------------------------------------------------------------- -void ips200_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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(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)); - ips200_wr_data16(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: ips200_displayimage8660_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240);//显示彩色摄像头 图像 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为0时,显示彩色图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - - ips200_address_set(0,0,dis_width-1,dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_zoom1(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 0, 0, 320, 240); -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_zoom1(uint16 *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)>IPS200_X_MAX) ZF_ASSERT(0); - if((start_y+dis_height)>IPS200_Y_MAX) ZF_ASSERT(0); - - ips200_address_set(start_x,start_y,start_x+dis_width-1,start_y+dis_height-1);//设置显示区域 - - for(j=0;j>8); - ips200_wr_data16(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: ips200_displayimage8660_grayscale_zoom(scc8660_csi_image[0], SCC8660_CSI_PIC_W, SCC8660_CSI_PIC_H, 320, 240)//显示彩色摄像头图像 显示Y分量 -// @note 此函数仅支持摄像头数据格式(SCC8660_DATA_FORMAT)设置为2时,提取Y分量显示灰度图像 -// 图像的宽度如果超过液晶的宽度,则自动进行缩放显示。这样可以显示全视野 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height) -{ - uint32 i,j; - uint16 color = 0; - uint16 temp = 0; - - ips200_address_set(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)); - ips200_wr_data16(color); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------- -// @brief 小钻风(二值化摄像头)液晶显示函数 -// @param *p 图像数组地址 -// @param width 图像宽度 -// @param height 图像高度 -// @return void -// @since v1.0 -// @note 图像分辨率需要设置在120(高)*160(宽)以下 -//------------------------------------------------------------------------------------------------------------------- -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height) -{ - int i,j; - - uint16 temp = 0; - ips200_address_set(0,0,width-1,height-1); - for(i=0;i0;j--) - { - temp = (*p_data>>(j-1)) & 0x01; - if(temp) ips200_wr_data16(color); - else ips200_wr_data16(IPS200_BGCOLOR); - } - p_data++; - } - p_data = p_data - temp2 + temp2*size; - } - } -} diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h deleted file mode 100644 index 1c7cddd..0000000 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_IPS200_PARALLEL8.h +++ /dev/null @@ -1,180 +0,0 @@ - -/*/********************************************************************************************************************* - * COPYRIGHT NOTICE - * Copyright (c) 2020,逐飞科技 - * All rights reserved. - * 技术讨论QQ群:三群:824575535 - * - * 以下所有内容版权均属逐飞科技所有,未经允许不得用于商业用途, - * 欢迎各位使用并传播本程序,修改内容时必须保留逐飞科技的版权声明。 - * - * @file 2.0寸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 - 接线定义: - ------------------------------------ - 模块管脚 单片机管脚 - D0 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D0_PIN 宏定义 - D1 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D1_PIN 宏定义 - D2 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D2_PIN 宏定义 - D3 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D3_PIN 宏定义 - D4 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D4_PIN 宏定义 - D5 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D5_PIN 宏定义 - D6 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D6_PIN 宏定义 - D7 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_D7_PIN 宏定义 - - BL 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_BL_PIN 宏定义 - CS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_CS_PIN 宏定义 - RD 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RD_PIN 宏定义 - WR 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_WR_PIN 宏定义 - RS 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RS_PIN 宏定义 - RST 查看SEEKFREE_IPS200_PARALLEL8.H文件内的IPS200_RST_PIN 宏定义 - - 电源引脚 - VCC 3.3V电源 - GND 电源地 - 最大分辨率240*320 - ------------------------------------ - - ********************************************************************************************************************/ - -#ifndef _SEEKFREE_IPS200PARALLEL8_H -#define _SEEKFREE_IPS200PARALLEL8_H - -#include "common.h" -#include "SEEKFREE_FONT.h" - - -//-------常用颜色在SEEKFREE_FONT.h文件中定义---------- -//#define RED 0xF800 //红色 -//#define BLUE 0x001F //蓝色 -//#define YELLOW 0xFFE0 //黄色 -//#define GREEN 0x07E0 //绿色 -//#define WHITE 0xFFFF //白色 -//#define BLACK 0x0000 //黑色 -//#define GRAY 0X8430 //灰色 -//#define BROWN 0XBC40 //棕色 -//#define PURPLE 0XF81F //紫色 -//#define PINK 0XFE19 //粉色 - - -#define IPS200_BGCOLOR WHITE //背景颜色 -#define IPS200_PENCOLOR RED //画笔颜色 - - -//引脚只能选择B C D这三个端口中的引脚,便于使用快速GPIO以提高显示速度 -#define IPS200_RD_PIN P15_3 -#define IPS200_WR_PIN P15_5 -#define IPS200_RS_PIN P15_1 -#define IPS200_RST_PIN P15_0 -#define IPS200_CS_PIN P15_2 -#define IPS200_BL_PIN P15_4 - - - - - -//D0-D3四个数据引脚必须连续 例如C0-C3,C1-C4等等, -//D4-D7四个数据引脚必须连续 例如B0-B3,B1-B4等等。 -//可以连接到不同端口的意思就是屏幕的D0-D3与C1-C4连接,D4-D7与B2-B5连接。 -//切换引脚后注意修改IPS200_DATA_PORT1和IPS200_DATA_PORT2宏定义 -#define IPS200_D0_PIN P11_9 -#define IPS200_D1_PIN P11_10 -#define IPS200_D2_PIN P11_11 -#define IPS200_D3_PIN P11_12 -#define IPS200_D4_PIN P13_0 -#define IPS200_D5_PIN P13_1 -#define IPS200_D6_PIN P13_2 -#define IPS200_D7_PIN P13_3 - -//定义数据端口所在PORT,切换引脚后务必根据引脚所在PORT进行更改 -#define IPS200_DATA_PORT1 3 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT1 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT1].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM1 (IPS200_D0_PIN&0x1f) //宏定义数据引脚的起始编号 - - -#define IPS200_DATA_PORT2 4 //0:P00端口 1:P02端口 2:P10端口 3:P11端口 4:P13端口 5:P14端口 6:P15端口 7:P20端口 8:P21端口 9:P22端口 10:P23端口 11:P32端口 12:P33端口 - -#define IPS200_DATAPORT2 (((Ifx_P *)IfxPort_cfg_indexMap[IPS200_DATA_PORT2].module)->OUT.U) //宏定义数据口GPIO的输出寄存器 -#define DATA_START_NUM2 (IPS200_D4_PIN&0x1f) //宏定义数据引脚的起始编号 - - - - - - - - - -#define IPS200_BL(x) gpio_set(IPS200_BL_PIN,x) -#define IPS200_CS(x) gpio_set(IPS200_CS_PIN,x) -#define IPS200_RD(x) gpio_set(IPS200_RD_PIN,x) -#define IPS200_WR(x) gpio_set(IPS200_WR_PIN,x) -#define IPS200_RS(x) gpio_set(IPS200_RS_PIN,x) -#define IPS200_RST(x) gpio_set(IPS200_RST_PIN,x) - - -#define IPS200_W 240 -#define IPS200_H 320 - - -//定义显示方向 -//0 竖屏模式 -//1 竖屏模式 旋转180° -//2 横屏模式 -//3 横屏模式 旋转180° -#define IPS200_DISPLAY_DIR 0 - -#if (0==IPS200_DISPLAY_DIR || 1==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_W //液晶X方宽度 -#define IPS200_Y_MAX IPS200_H //液晶Y方宽度 - -#elif (2==IPS200_DISPLAY_DIR || 3==IPS200_DISPLAY_DIR) -#define IPS200_X_MAX IPS200_H //液晶X方宽度 -#define IPS200_Y_MAX IPS200_W //液晶Y方宽度 - -#else -#error "IPS200_DISPLAY_DIR 定义错误" - -#endif - - -void ips200_init(void); //初始化硬件 -void ips200_w_data(uint8 dat); -void ips200_wr_reg(uint8 com); -void ips200_wr_data(uint8 dat); -void ips200_wr_data16(uint16 dat); -void ips200_w_reg(uint8 com,uint8 dat); -void ips200_address_set(uint16 x1,uint16 y1,uint16 x2,uint16 y2); -void ips200_clear(uint16 color); -void ips200_drawpoint(uint16 x,uint16 y,uint16 color); -void ips200_showchar(uint16 x,uint16 y,const int8 dat); -void ips200_showstr(uint16 x,uint16 y,const int8 dat[]); - - -void ips200_showint8(uint16 x,uint16 y,int8 dat); -void ips200_showuint8(uint16 x,uint16 y,uint8 dat); -void ips200_showint16(uint16 x,uint16 y,int16 dat); -void ips200_showuint16(uint16 x,uint16 y,uint16 dat); -void ips200_showint32(uint16 x,uint16 y,int dat,uint8 num); -void ips200_showfloat(uint16 x,uint16 y,double dat,int8 num,int8 pointnum); -void ips200_showimage(uint16 x,uint16 y,uint16 w,uint16 l,const unsigned char *p); - -void ips200_displayimage032(uint8 *p, uint16 width, uint16 height); -void ips200_displayimage032_zoom(uint8 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage032_zoom1(uint8 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_zoom1(uint16 *p, uint16 width, uint16 height, uint16 start_x, uint16 start_y, uint16 dis_width, uint16 dis_height); -void ips200_displayimage8660_grayscale_zoom(uint16 *p, uint16 width, uint16 height, uint16 dis_width, uint16 dis_height); -void ips200_displayimage7725(uint8 *p, uint16 width, uint16 height); -void ips200_display_chinese(uint16 x, uint16 y, uint8 size, const uint8 *p, uint8 number, uint16 color); - -#endif - diff --git a/Seekfree_TC264_Opensource_Library/USER/Cpu0_Main.c b/Seekfree_TC264_Opensource_Library/USER/Cpu0_Main.c index 27cf584..d30805e 100644 --- a/Seekfree_TC264_Opensource_Library/USER/Cpu0_Main.c +++ b/Seekfree_TC264_Opensource_Library/USER/Cpu0_Main.c @@ -34,7 +34,7 @@ int core0_main(void) { get_clk();//获取时钟频率 务必保留 //用户在此处调用各种初始化函数等 - + //等待所有核心初始化完毕 IfxCpu_emitEvent(&g_cpuSyncEvent); IfxCpu_waitEvent(&g_cpuSyncEvent, 0xFFFF);