雅特力车规级MCU-AT32A403A开发板评测 06 GC9A01 SPI-LCD 1.28圆形屏幕

雅特力车规级MCU-AT32A403A开发板评测 06 GC9A01 SPI-LCD 1.28圆形屏幕

硬件平台

  1. AT32A403A Board开发板

  2. 1.28寸圆形彩色TFT显示屏高清IPS 模块240X240 SPI接口GC9A01

    在这里插入图片描述

产品介绍

推荐一个屏幕资料参考网站 http://www.lcdwiki.com/1.28inch_IPS_Module

在这里插入图片描述

  • 1.28寸圆形IPS彩屏,支持 RGB 65K色显示,显示色彩丰富
  • 240X240分辨率,显示清晰
  • IPS全视角面板,超宽可视范围
  • 采用4线制SPI串行总线,只需几个IO即可点亮
  • 提供丰富的Arduino、STM32、C51以及MSP430示例程序
  • 军工级工艺标准,长期稳定工作
  • 提供底层驱动技术支持

产品参数

名称参数
显示颜色RGB 65K 彩色
SKUMSP1281
尺寸1.28(inch)
面板材质TFT
驱动芯片GC9A01
分辨率240*240 (Pixel)
显示接口4-line SPI interface
有效显示区域(AA区)直径:32.40 (mm)
触摸屏类型无触摸屏
触摸IC无触摸IC
模块PCB底板尺寸38.03x45.80(mm)
视角全角度
工作温度-10℃~60℃
存储温度-20℃~70℃
工作电压3.3V

接口定义

序号模块引脚引脚说明
1GND液晶屏电源地
2VCC液晶屏电源正(3.3V/5V)
3SCL液晶屏SPI总线时钟信号
4SDA液晶屏SPI总线写数据信号
5RES液晶屏复位控制信号(低电平复位,模块有复位电路,该引脚可不接)
6DC液晶屏寄存器/数据选择控制信号(低电平:寄存器,高电平:数据)
7CS液晶屏片选控制信号(低电平使能)
8BLK液晶屏背光控制信号(高电平点亮,如不需要控制,请接3.3V)
模拟SPI移植LCD屏幕驱动
  1. 建立工程模板,添加相关驱动文件
 //lcd_gc9a01 硬件驱动层代码lcd_gc9a01.clcd_gc9a01.h//lcd_gc9a01 软件应用层代码lcd_guiclcd_gui.hlcd_font.h//lcd_gc9a01 软件测试代码lcd_example.clcd_example.h

在这里插入图片描述

  1. 配置引脚
    选择引脚,进入工程开始编写屏幕引脚初始化代码。为了方便后续移植,我在lcd_gc9a01.h处宏定义了每一个引脚,后续根据需要进行修改即可。
#define LCD_GPIO_PORT       GPIOD
#define LCD_GPIO_PORT_CLK   CRM_GPIOD_PERIPH_CLOCK#define SCL_GPIO_PORT       GPIOD
#define SCL_GPIO_PIN        GPIO_PINS_8
#define SCL_GPIO_PORT_CLK   CRM_GPIOD_PERIPH_CLOCK#define SDA_GPIO_PORT       GPIOD
#define SDA_GPIO_PIN        GPIO_PINS_9
#define SDA_GPIO_PORT_CLK   CRM_GPIOD_PERIPH_CLOCK#define RES_GPIO_PORT       GPIOD
#define RES_GPIO_PIN        GPIO_PINS_10
#define RES_GPIO_PORT_CLK   CRM_GPIOD_PERIPH_CLOCK#define DC_GPIO_PORT        GPIOD
#define DC_GPIO_PIN         GPIO_PINS_11
#define DC_GPIO_PORT_CLK    CRM_GPIOD_PERIPH_CLOCK#define CS_GPIO_PORT        GPIOD
#define CS_GPIO_PIN         GPIO_PINS_12
#define CS_GPIO_PORT_CLK    CRM_GPIOD_PERIPH_CLOCK#define BLK_GPIO_PORT        GPIOD
#define BLK_GPIO_PIN         GPIO_PINS_13
#define BLK_GPIO_PORT_CLK    CRM_GPIOD_PERIPH_CLOCK
  1. 屏幕GPIO端口初始化配置
void lcd_gpio_init(void)
{gpio_init_type gpio_init_struct;/* enable the gpioa clock */crm_periph_clock_enable(LCD_GPIO_PORT_CLK, TRUE);/* set default parameter */gpio_default_para_init(&gpio_init_struct);/* configure the gpio */gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;gpio_init_struct.gpio_pins = SDA_GPIO_PIN |SCL_GPIO_PIN|RES_GPIO_PIN|DC_GPIO_PIN|CS_GPIO_PIN|BLK_GPIO_PIN;gpio_init_struct.gpio_pull = GPIO_PULL_NONE;gpio_init(LCD_GPIO_PORT, &gpio_init_struct);}
  1. SPI 接口宏定义设置
#define	SPI_SCLK_SET    gpio_bits_set(SCL_GPIO_PORT,SCL_GPIO_PIN)
#define	SPI_SCLK_CLR    gpio_bits_reset(SCL_GPIO_PORT,SCL_GPIO_PIN)#define	SPI_MOSI_SET    gpio_bits_set(SDA_GPIO_PORT,SDA_GPIO_PIN)
#define	SPI_MOSI_CLR    gpio_bits_reset(SDA_GPIO_PORT,SDA_GPIO_PIN)#define	LCD_RES_SET     gpio_bits_set(RES_GPIO_PORT,RES_GPIO_PIN)
#define	LCD_RES_CLR     gpio_bits_reset(RES_GPIO_PORT,RES_GPIO_PIN)#define	LCD_DC_SET      gpio_bits_set(DC_GPIO_PORT,DC_GPIO_PIN)
#define	LCD_DC_CLR      gpio_bits_reset(DC_GPIO_PORT,DC_GPIO_PIN)#define	LCD_CS_SET      gpio_bits_set(CS_GPIO_PORT,CS_GPIO_PIN)
#define	LCD_CS_CLR      gpio_bits_reset(CS_GPIO_PORT,CS_GPIO_PIN)#define	LCD_BLK_SET     gpio_bits_set(BLK_GPIO_PORT,BLK_GPIO_PIN) 
#define	LCD_BLK_CLR     gpio_bits_reset(BLK_GPIO_PORT,BLK_GPIO_PIN) 
  1. 软件SPI代码实现

    /****************************************************************************** @name       :void  SPI_WriteByte(uint8_t Data)* @function   :Write a byte of data using STM32's Software SPI* @parameters :Data:Data to be written* @retvalue   :None
    ******************************************************************************/
    void SPI_WriteByte(uint8_t Data)
    {unsigned char i=0;for(i=8;i>0;i--){if(Data&0x80)	SPI_MOSI_SET; //输出数据elseSPI_MOSI_CLR;SPI_SCLK_CLR;       SPI_SCLK_SET;Data<<=1; }
    }/****************************************************************************** @name       :void LCD_WR_REG(uint8_t data)* @function   :Write an 8-bit command to the LCD screen* @parameters :data:Command value to be written* @retvalue   :None
    ******************************************************************************/
    void LCD_WR_REG(uint8_t data)
    { LCD_CS_CLR;     LCD_DC_CLR;	  SPI_WriteByte(data);LCD_CS_SET;	
    }/****************************************************************************** @name       :void LCD_WR_DATA(uint8_t data)* @function   :Write an 8-bit data to the LCD screen* @parameters :data:data value to be written* @retvalue   :None
    ******************************************************************************/
    void LCD_WR_DATA(uint8_t data)
    {LCD_CS_CLR;LCD_DC_SET;SPI_WriteByte(data);LCD_CS_SET;
    }
    

    如果传输的数据位为1,则将SPI数据引脚拉高;传输的数据位为0,则将SPI数据引脚拉低。每次传输一个字节数据,高位在前,每个时钟上升沿传输1位数据。

  2. LCD初始化函数

/*****************************************************************************
* @name       :void LCD_Init(void)
* @date       :2018-08-09 
* @function   :Initialization LCD screen
* @parameters :None
* @retvalue   :None
******************************************************************************/	 	 
void LCD_Init(void)
{  lcd_gpio_init();								 LCD_RESET(); //LCD 复位
//************* GC9A01初始化**********//	LCD_WR_REG(0xEF);LCD_WR_REG(0xEB);LCD_WR_DATA(0x14); LCD_WR_REG(0xFE);			 LCD_WR_REG(0xEF); LCD_WR_REG(0xEB);	LCD_WR_DATA(0x14); LCD_WR_REG(0x84);			LCD_WR_DATA(0x40); LCD_WR_REG(0x85);			LCD_WR_DATA(0xFF); LCD_WR_REG(0x86);			LCD_WR_DATA(0xFF); LCD_WR_REG(0x87);			LCD_WR_DATA(0xFF);LCD_WR_REG(0x88);			LCD_WR_DATA(0x0A);LCD_WR_REG(0x89);			LCD_WR_DATA(0x21); LCD_WR_REG(0x8A);			LCD_WR_DATA(0x00); LCD_WR_REG(0x8B);			LCD_WR_DATA(0x80); LCD_WR_REG(0x8C);			LCD_WR_DATA(0x01); LCD_WR_REG(0x8D);			LCD_WR_DATA(0x01); LCD_WR_REG(0x8E);			LCD_WR_DATA(0xFF); LCD_WR_REG(0x8F);			LCD_WR_DATA(0xFF); LCD_WR_REG(0xB6);LCD_WR_DATA(0x00);LCD_WR_DATA(0x20);LCD_WR_REG(0x36);LCD_WR_DATA(0x08);LCD_WR_REG(0x3A);			LCD_WR_DATA(0x05); LCD_WR_REG(0x90);			LCD_WR_DATA(0x08);LCD_WR_DATA(0x08);LCD_WR_DATA(0x08);LCD_WR_DATA(0x08); LCD_WR_REG(0xBD);			LCD_WR_DATA(0x06);LCD_WR_REG(0xBC);			LCD_WR_DATA(0x00);	LCD_WR_REG(0xFF);			LCD_WR_DATA(0x60);LCD_WR_DATA(0x01);LCD_WR_DATA(0x04);LCD_WR_REG(0xC3);			LCD_WR_DATA(0x13);LCD_WR_REG(0xC4);			LCD_WR_DATA(0x13);LCD_WR_REG(0xC9);			LCD_WR_DATA(0x22);LCD_WR_REG(0xBE);			LCD_WR_DATA(0x11); LCD_WR_REG(0xE1);			LCD_WR_DATA(0x10);LCD_WR_DATA(0x0E);LCD_WR_REG(0xDF);			LCD_WR_DATA(0x21);LCD_WR_DATA(0x0c);LCD_WR_DATA(0x02);LCD_WR_REG(0xF0);   LCD_WR_DATA(0x45);LCD_WR_DATA(0x09);LCD_WR_DATA(0x08);LCD_WR_DATA(0x08);LCD_WR_DATA(0x26);LCD_WR_DATA(0x2A);LCD_WR_REG(0xF1);    LCD_WR_DATA(0x43);LCD_WR_DATA(0x70);LCD_WR_DATA(0x72);LCD_WR_DATA(0x36);LCD_WR_DATA(0x37);  LCD_WR_DATA(0x6F);LCD_WR_REG(0xF2);   LCD_WR_DATA(0x45);LCD_WR_DATA(0x09);LCD_WR_DATA(0x08);LCD_WR_DATA(0x08);LCD_WR_DATA(0x26);LCD_WR_DATA(0x2A);LCD_WR_REG(0xF3);   LCD_WR_DATA(0x43);LCD_WR_DATA(0x70);LCD_WR_DATA(0x72);LCD_WR_DATA(0x36);LCD_WR_DATA(0x37); LCD_WR_DATA(0x6F);LCD_WR_REG(0xED);	LCD_WR_DATA(0x1B); LCD_WR_DATA(0x0B); LCD_WR_REG(0xAE);			LCD_WR_DATA(0x77);LCD_WR_REG(0xCD);			LCD_WR_DATA(0x63);		LCD_WR_REG(0x70);			LCD_WR_DATA(0x07);LCD_WR_DATA(0x07);LCD_WR_DATA(0x04);LCD_WR_DATA(0x0E); LCD_WR_DATA(0x0F); LCD_WR_DATA(0x09);LCD_WR_DATA(0x07);LCD_WR_DATA(0x08);LCD_WR_DATA(0x03);LCD_WR_REG(0xE8);			LCD_WR_DATA(0x34);LCD_WR_REG(0x62);			LCD_WR_DATA(0x18);LCD_WR_DATA(0x0D);LCD_WR_DATA(0x71);LCD_WR_DATA(0xED);LCD_WR_DATA(0x70); LCD_WR_DATA(0x70);LCD_WR_DATA(0x18);LCD_WR_DATA(0x0F);LCD_WR_DATA(0x71);LCD_WR_DATA(0xEF);LCD_WR_DATA(0x70); LCD_WR_DATA(0x70);LCD_WR_REG(0x63);			LCD_WR_DATA(0x18);LCD_WR_DATA(0x11);LCD_WR_DATA(0x71);LCD_WR_DATA(0xF1);LCD_WR_DATA(0x70); LCD_WR_DATA(0x70);LCD_WR_DATA(0x18);LCD_WR_DATA(0x13);LCD_WR_DATA(0x71);LCD_WR_DATA(0xF3);LCD_WR_DATA(0x70); LCD_WR_DATA(0x70);LCD_WR_REG(0x64);			LCD_WR_DATA(0x28);LCD_WR_DATA(0x29);LCD_WR_DATA(0xF1);LCD_WR_DATA(0x01);LCD_WR_DATA(0xF1);LCD_WR_DATA(0x00);LCD_WR_DATA(0x07);LCD_WR_REG(0x66);			LCD_WR_DATA(0x3C);LCD_WR_DATA(0x00);LCD_WR_DATA(0xCD);LCD_WR_DATA(0x67);LCD_WR_DATA(0x45);LCD_WR_DATA(0x45);LCD_WR_DATA(0x10);LCD_WR_DATA(0x00);LCD_WR_DATA(0x00);LCD_WR_DATA(0x00);LCD_WR_REG(0x67);			LCD_WR_DATA(0x00);LCD_WR_DATA(0x3C);LCD_WR_DATA(0x00);LCD_WR_DATA(0x00);LCD_WR_DATA(0x00);LCD_WR_DATA(0x01);LCD_WR_DATA(0x54);LCD_WR_DATA(0x10);LCD_WR_DATA(0x32);LCD_WR_DATA(0x98);LCD_WR_REG(0x74);			LCD_WR_DATA(0x10);	LCD_WR_DATA(0x85);	LCD_WR_DATA(0x80);LCD_WR_DATA(0x00); LCD_WR_DATA(0x00); LCD_WR_DATA(0x4E);LCD_WR_DATA(0x00);					LCD_WR_REG(0x98);			LCD_WR_DATA(0x3e);LCD_WR_DATA(0x07);LCD_WR_REG(0x35);	LCD_WR_REG(0x21);LCD_WR_REG(0x11); delay_ms(120); LCD_WR_REG(0x29); 	LCD_direction(USE_HORIZONTAL);//设置LCD显示方向LCD_BLK_SET;//点亮背光	 LCD_Clear(WHITE);//清全屏白色
}
  1. 驱动完整代码见仓库代码
    在这里插入图片描述
    在这里插入图片描述

屏幕测试

  1. 主程序
#include "main.h"/*** @brief  main function.* @param  none* @retval none*/
int main(void)
{
//  unsigned char count_num; system_clock_config();at32_board_init();uart_print_init(115200);module_smg_gpio_iint();LCD_Init();/* output a message on hyperterminal using printf function *///printf("usart printf example: retarget the c library printf function to the usart\r\n");printf("Hardware_Init [ok] \r\n");printf("at_start_a403a board testing 2024-02-13\r\n");printf("at_start_a403a board module softspi lcd \r\n");while(1){printf("lcd_example_test [start] \r\n");main_test(); 		   menu_test();			   English_Font_test();     Chinese_Font_test();    printf("lcd_example_test [end] \r\n"); }
}
  1. 测试效果

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/745620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言——动态内存分配

前言&#xff1a;通过前面的学习&#xff0c;我们知道C语言中在内存中开辟空间的方法有&#xff1a;变量和数组。既然拥有了开辟空间的方法&#xff0c;我们为什么还要学习动态内存分配呢&#xff1f; int val 20; //在内存中开辟四个字节的空间 int arr[10] { 0 }; //在内…

【金三银四】掌趣科技24.3.7 H项目 服务端开发笔试题

考试题型&#xff1a; 不定项选择题 10 道 &#xff0c; 填空题 10 道 &#xff0c; 问答题 2 道 &#xff0c; 编程题 4 道 目录 不定项选择题 10 道填空题 10 道问答题 2 道编程题 4 道 不定项选择题 10 道 在TCP协议中&#xff0c;发送方的窗口大小是由两个关键因素共同决定…

鸿蒙 Harmony 初体验

前言 看现在网上传得沸沸扬扬的鸿蒙&#xff0c;打算弄个 hello world 玩一下, 不然就跟不上时代的发展了 环境安装 我的环境 Windows 11 家庭中文版HarmonyOS SDK (API 9)DevEco Studio (3.1.1 Release)Node.js (16.19.1) 开发IDE下载 官方下载链接 配置 nodejs 这里帮…

Opencascade基础教程(9):切换视图

1、切换视图 1、1 增加视图切换按钮&#xff0c;并添加消息响应函数。 void COCCDemoView::OnButtonFrontview() {//前视图m_View->SetProj(V3d_Yneg);m_View->FitAll(); }void COCCDemoView::OnButtonRearview() {//后视图m_View->SetProj(V3d_Ypos);m_View->Fit…

【华为Datacom数通认证】HCIA-HCIP-HCIE

华为认证课程概述 华为认证是华为技术有限公司(简称"华为")基于"平台生态"战略&#xff0c;围绕"云-管-端"协同的新ICT技术架构&#xff0c;打造的业界覆盖ICT领域最广的认证体系&#xff0c;包含"ICT技术架构认证"、"ICT开发者…

学习JAVA的二十二天(基础)

目录 网络编程 三要素&#xff1a; IP InetAddress类 端口号 协议 UDP协议 TCP协议 前言&#xff1a;学习JAVA的第二十一天&#xff08;基础&#xff09;-CSDN博客 网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序,进行的数据传输。 三要素&#xff1a;…

installation of package ‘RDocumentation’ had non-zero exit status

installation of package ‘RDocumentation’ had non-zero exit status Warning in install.packages :installation of package ‘httr’ had non-zero exit status Warning in install.packages :installation of package ‘openssl’ had non-zero exit status 由于项目需…

蓝桥杯(1):python排序

1 基础 1.1 输出 1.1.1 去掉输出的空格 print("Hello","World",123,sep"") print("hello",world,123,sep) print(hello,world,123) #输出结果 #HelloWorld123 #helloworld123 #hello world 123 1.1.2 以不同的方式结尾 print(&quo…

Ubuntu Flask 运行 gunicorn+Nginx 部署

linux Ubuntu 下运行python 程序出现killed 原因&#xff1a;CPU或内存限制&#xff1a;在华为云上&#xff0c;你可能有CPU或内存使用的限制。例如&#xff0c;如果你使用的是一个固定大小的实例&#xff0c;那么超过该实例的CPU或内存限制可能会导致进程被杀死。 参考&am…

Python Web开发记录 Day10:Django part4 靓号管理与优化

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、数据库准备2、靓号列表3、新建靓号4、编辑靓…

Vue手写模拟步骤条

效果图&#xff1a; 如果要使用element的步骤条就需要强行修改样式&#xff0c;参考之前的那篇步骤条。这里我采用手写div 代码&#xff1a; 思路是给最外层的div一个左边框&#xff0c;给里面的step-item设置左边框为图片&#xff0c;通过定位来移动。 <div class"m…

Canal实现mysql与缓存同步

什么是Canal Canal是阿里巴巴旗下的一款开源项目, 基于java开发. Canal是基于mysql的主从同步来实现的. github地址: https://github.com/alibaba/canal Canal把自己伪装成MySQL的一个slave节点, 从而监听master的binary log变化. 再把得到的变化信息通知给Canal的客户端, 进而…

个人简历主页搭建系列-02:github 仓库作为联系方式

这篇文章暂时没有开始正式搭建网站。首先是最重要的注意事项&#xff1a;隐私。 真实姓名如果大家自己不介意的话其实我觉得还好&#xff0c;现在在互联网上想扒个姓名挺简单的&#xff0c;而且很多人都实名上网hh&#xff08;比如我的几位田径队学弟笑&#xff09;。 电话&a…

小程序学习3 goods-card

pages/home/home home.wxml <goods-listwr-class"goods-list-container"goodsList"{{goodsList}}"bind:click"goodListClickHandle"bind:addcart"goodListAddCartHandle"/> <goods-list>是一个自定义组件&#xff0c;它具…

[抽象]工厂模式([Abstract] Factory)——创建型模式

[抽象]工厂模式——创建型模式 什么是抽象工厂&#xff1f; 抽象工厂模式是一种创建型设计模式&#xff0c;让你能够保证在客户端程序中创建一系列有依赖的对象组时&#xff0c;无需关心这些对象的类型。 具体来说&#xff1a; 对象的创建与使用分离&#xff1a; 抽象工厂模…

信号与系统学习笔记——信号的分类

目录 一、确定与随机 二、连续与离散 三、周期与非周期 判断是否为周期函数 离散信号的周期 结论 四、能量与功率 定义 结论 五、因果与反因果 六、阶跃函数 定义 性质 七、冲激函数 定义 重要关系 作用 一、确定与随机 确定信号&#xff1a;可以确定时间函数…

uniapp移动端 IOS系统下无法与webview通信

不知道有没有人遇到过这个问题 我的页面嵌套了一个webview&#xff08;文件位于项目的hybrif/html&#xff09;目录下 使用evalJS与webview进行通信 代码如下 在安卓里运行是没问题的&#xff0c;但在苹果手机上一直无法通信 连接真机&#xff0c;打印evalJS是个方法&#xf…

C语言中内存函数的使用

memcpy函数的使用和模拟实现 memcpy的使用 函数使用说明&#xff1a; • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 • 这个函数在遇到 \0 的时候并不会停下来。 • 如果source和destination有任何的重叠&#xff0c;复制的结…

【python】centos 8新装python3.10.0

1.python源码包准备 2.gcc环境安装 如果系统已具备&#xff0c;可以略过。 有的已经自带了gcc&#xff0c;但是如果编译时启动优化的话&#xff0c;如果gcc版本过老就必须要升级。 3.make环境安装 如果系统已具备&#xff0c;可以略过。 4.更新openssl版本&#xff08;很重…

C# 根据两点名称,寻找两短路程的最优解,【有数据库设计,完整代码】

前言 如果我们遇到路径问题&#xff0c;可以使用点点连线&#xff0c;给定一个点&#xff0c;可以到达另外几个点&#xff0c;寻找最优解 例&#xff1a;如下图所示&#xff0c;如果要从A1-C1,可以有三条路 1.A1-B1-C1 2.A1-B2-C1 3.A1-B3-C1 最优解肯定是A1-B1-C1&#xff0c…