LT7689 串口屏相关功能代码详解

LT7689 是一款结合了 Cortex-M4 MCU2D图形加速器 的控制芯片,旨在提供高效的串口通信和显示功能。它的主要用途是通过简单的串口指令将显示内容传输到 TFT屏幕 上,适合嵌入式系统的显示控制需求。

Cortex-M4 MCU 内核,支持高达 150MHz 的主频,拥有 508KB Flash256KB SRAM 存储,提供了足够的计算和存储空间用于嵌入式应用。

2D图形加速器 用于提升图形显示的效率,减少主控MCU处理显示所需的时间。支持图形加速、几何图形绘制、图形混合等功能,极大地提高了显示操作的性能。

功能/特性描述
支持的显示分辨率支持 320x240 (QVGA)1280x1024 (SXGA) 分辨率的显示屏。支持 16位18位24位 的 RGB 接口显示屏。
内置显示内存128Mb 的显示内存用于存储图片、动画、UI元素等显示内容。
图形加速和硬件支持内置 图形加速器(BTE),支持 旋转镜像效果画中画(PIP)几何图形绘制 等硬件加速功能,减少MCU负担,提升显示效率。
UART串口通信通过 UART 串口进行与主控MCU的通信。支持多个 SCI(UART)接口,可连接如 蓝牙模块WiFi模块 等其他通信模块。
外设接口提供 USB接口SD卡(SPI)接口音频输出DAC接口模拟输入AINPWM接口INT中断接口 等接口,可作为普通GPIO进行配置。
UI界面开发支持 UI_Editor-IIUI_Emulator-II 软件,开发者可在PC上进行UI设计和模拟,支持图片显示、GIF动画、进度条、菜单、时钟、二维码等UI元素。
UI功能支持 图片显示进度条滑动菜单字符串显示中英文键盘数字键盘模拟时钟数字时钟指针显示二维码生成多国语言音效播放变量控制 等功能。
存储与处理能力内部具备 508KB Flash256KB SRAM,可直接在内部存储器中执行和存储显示内容,减少对外部存储的依赖。支持 SPI Flash接口 用于存储外部资源。
主控MCU功能除了显示控制功能外,LT7689 还可作为 主控MCU 使用,具有 高容量Flash和SRAM,内置 图形加速引擎(BTE和几何引擎),能独立处理显示任务。
应用场景适用于各种嵌入式产品,如 智能家电汽车仪表盘摩托车面板多功能事务机工业控制设备医疗美容设备智能音箱充电设备水电表 等。

接下来就是相关代码分析,供大家学习乐升的板载资源作为参考。

    uint16_t cx, cy;
	uint8_t w_temp, h_temp;

	NVIC_SetVectorTable(0x800A000, 0);
	PeripheralInit();
	
	WDT_Init(0x4786*2);	

定义了两个 16位无符号整数 变量 cxcy,表示 x坐标y坐标,存储图形显示中的坐标位置。

两个 8位无符号整数 变量 w_temph_temp,用于存储临时 宽度高度,用图形或区域的尺寸。

NVIC_SetVectorTable(0x800A000, 0);:此函数调用设置 中断向量表 的地址。在ARM架构的嵌入式系统中,中断向量表 是存放中断服务例程(ISR)的表格,控制CPU如何处理中断请求。

0x800A000中断向量表的地址,它是存放中断服务例程的基地址。

第二个参数 0 通常表示将向量表设置到该地址之后的偏移位置。一般情况下,0 表示从地址 0x800A000 开始加载向量表。

PeripheralInit 外设初始化函数的调用,它负责初始化和配置系统中的外设。

WDT_Init(0x4786*2);:此函数调用用于初始化 看门狗定时器(WDT)。看门狗定时器是一种用于监控系统健康状态的外设。如果系统在设定的时间内没有重置看门狗定时器,系统就会认为出现故障,并进行复位或其他预设的动作。

0x4786*2:这是给定的看门狗定时器的 计时值,它是 0x4786 (即 18310)乘以 2,所以实际的值是 36620。这个值会决定看门狗计时器的超时周期。该值可能表示看门狗触发复位的时间,单位可能是毫秒或其他时间单位,具体取决于系统时钟配置。

		WDT_FeedDog(); //Clear watchdog
        #if !IIC_BUS
        #if (UARTBUS_OPTION == 0)
		Main_From_UartRxBuff();
		if (gUsartRx.Flag)
			LT_ReceiveCmd(gUsartRx.Buf);

WDT_FeedDog();用于 喂狗,即清除 看门狗定时器。看门狗定时器用于确保系统在预定时间内执行某些操作。

#if !IIC_BUS 表示当 IIC_BUS 不是宏定义时(即 IIC_BUS0 或未定义时),编译器将包括接下来的代码块。如果 IIC_BUS 被定义了或为非零值,则跳过接下来的代码块。若不使用 I2C 总线,则执行后续代码,否则跳过。

#if (UARTBUS_OPTION == 0) 是一个条件编译指令,当 UARTBUS_OPTION 的值等于 0 时,编译器将包括该块代码。UARTBUS_OPTION是一个配置选项,用来控制程序使用的串口总线模式。

Main_From_UartRxBuff(); 是一个函数调用,用于从 UART 接收缓冲区 中提取数据并进行处理。

if (gUsartRx.Flag):检查全局变量 gUsartRx.Flag 的状态,通常 Flag 用来标记是否接收到有效的数据。如果 Flag 被设置为真,说明有数据从串口接收缓冲区中成功读取。

LT_ReceiveCmd(gUsartRx.Buf);:如果接收标志 Flag 为真,则调用 LT_ReceiveCmd(gUsartRx.Buf),处理接收到的数据。gUsartRx.Buf 是一个缓冲区,存储了从 UART 接收到的数据,LT_ReceiveCmd() 函数可能用于解析并执行命令或处理接收到的信息。

        if(UI_update == 1)
		{ 
			while(1)
			{
				WDT_FeedDog(); //Clear watchdog;
				Main_From_UartRxBuff();
				if (gUsartRx.Flag)
				LT_ReceiveCmd(gUsartRx.Buf);
				
				if(UI_update == 0) break;
			}
		}

标记界面是否需要更新,如果更新,进入 while(1) 无限循环,表示代码将不断地执行循环体内的操作,直到条件满足 break 跳出循环。WDT_FeedDog() 函数用于清除看门狗定时器,防止系统在此循环中被看门狗重置。如果看门狗定时器没有被及时喂养(清除),系统会复位。所以每次进入循环时都需要调用该函数来保持系统正常运行。Main_From_UartRxBuff() 函数用于从 UART 接收缓冲区读取数据。根据函数名,将接收到的数据从缓冲区中提取并放入相应的处理队列或缓存中,等待进一步处理。if (gUsartRx.Flag) 检查是否有有效的 UART 数据接收标志。如果 gUsartRx.Flag 被置为真,说明有数据被成功接收到并存储在 gUsartRx.Buf 中。LT_ReceiveCmd(gUsartRx.Buf); 函数用于处理接收到的数据(存储在 gUsartRx.Buf 中)。它可能解析数据并执行相关命令。在每次循环结束时,检查 UI_update 的值。如果 UI_update 被置为 0,则执行 break 语句跳出 while 循环,终止数据接收和处理的过程。这意味着只有在 UI_update1 时才会持续进入这个循环,直到 UI_update 变为 0,才能退出循环。

		if (var[0x700e * 2 + 1])
			BackLight_control(); // Backlight control

		if (page_refreshing > 20)
		{
			page_refreshing = 0;
			Get_date_variable_Id_Regular_update(pic_id);
		}
		if(Count_reg_num > 0)
		{
			Count_reg_num--;
			reg_operation(Count_reg[Count_reg_num]);
		}
		if (gWavFlag == 1 || gWavType == 1)
			LT_PlayWav_DAC();

var[0x700e * 2 + 1] 这一行从 var 数组中获取一个特定的值,地址为 0x700e * 2 + 1,这个地址对应的是一个配置值。如果这个值不为 0(即为真),调用 BackLight_control() 函数来控制屏幕的背光亮度。此函数会调整屏幕的亮度或开启/关闭背光。page_refreshing 变量用于跟踪页面刷新的计数。if (page_refreshing > 20) 判断如果页面刷新计数超过 20,则:将 page_refreshing 重置为 0,表示已经完成了一次刷新操作。调用 Get_date_variable_Id_Regular_update(pic_id) 函数,执行定期更新操作,传入 pic_id 作为参数,用于更新某个图像或数据。Count_reg_num 变量记录了待处理的寄存器操作数。if(Count_reg_num > 0) 判断如果还有未操作的寄存器操作:Count_reg_num--,减少操作计数。调用 reg_operation(Count_reg[Count_reg_num]) 执行当前寄存器操作,Count_reg[Count_reg_num] 可能是当前操作的寄存器地址或操作参数。if (gWavFlag == 1 || gWavType == 1) 判断是否有音频播放需求:gWavFlag == 1gWavType == 1 为真时,表示需要播放音频。如果条件成立,调用 LT_PlayWav_DAC() 函数,会通过 DAC(数字到模拟转换器)播放 WAV 文件。

        show_gif();				// gif
		show_Clock();	 		// Analog clock
		show_RTC();		 		// Digital clock
		scroll_text();	 		// Text scroll1
		Display_Curve(); 		// Curve
		show_Count();			// Time counter
		Check_Var_Count();
		Check_Pointer();

show_gif();该函数用于显示 GIF 动画。它负责在屏幕上显示一个动画图片,通常用于展示动态图像或动态效果。

show_Clock();show_Clock() 是一个模拟时钟的显示函数。它会在屏幕上绘制一个模拟时钟,显示类似于传统指针式时钟的界面。

show_RTC();该函数用于显示数字时钟,通常基于 RTC(实时时钟)模块读取当前时间并以数字形式显示,通常表现为类似于 "12:34:56" 这样的时间格式。

scroll_text();scroll_text() 函数用于实现滚动文本的效果。通常,它会将一段文字从屏幕的一侧滚动到另一侧,常用于显示新闻、通知或者长文本信息。

Display_Curve();Display_Curve() 函数显示一条曲线,可能是在屏幕上绘制数据曲线(如实时数据的变化、传感器读数等)或者其他图形曲线。

show_Count();show_Count() 函数是一个时间计数器的显示功能。它会在屏幕上显示一个计数器,可能用于倒计时、计时器功能或者显示其他计数类信息。

Check_Var_Count();Check_Var_Count() 函数看起来是一个检查变量计数的函数。它可能会对某个或某些计数变量进行检查和更新,确保数据的正确性。

Check_Pointer();Check_Pointer() 函数是用来检查指针状态或位置的。它可能涉及触摸屏的触摸点、鼠标指针的位置,或者某些指针数据结构的状态检查。

        Basic_touch();			// Basic touch control
		Adj_touch();			// Variable adjustment
		Progress_bar_sliding();	// Sliding progress bar
		data_input();			// Data input
		slideMune();			// Slide menu
		RingSld_touch();		// Ring progress bar with touch
		Ascii_input();			// ASCII keyboard
		GBK_input();			// GBK keyboard
		VarKey_touch();			// Multivariable adjustment
		pop_up_touch();			// Pop-up window

Basic_touch();该函数是基本的触摸控制功能,用于检测用户的触摸输入并响应基础的交互操作,比如触摸屏的点击、滑动等。

Adj_touch();Adj_touch() 函数用于调整某些变量或界面元素,例如调整亮度、音量、颜色等。它可能允许用户通过触摸界面上的滑块或按钮来调整设置。

Progress_bar_sliding();该函数用于显示和控制滑动进度条。用户通过触摸屏滑动进度条来调整某个进度或者参数的值,例如音量、进度等。

data_input();data_input() 函数涉及通过触摸屏进行数据输入,例如用户输入数字或文本,可能用于输入设置值、数字、日期等。

slideMune();slideMune() 函数是用于滑动菜单的控制。当用户通过滑动屏幕来导航菜单时,这个函数会处理菜单的显示和隐藏操作。

RingSld_touch();RingSld_touch() 函数控制一个环形的进度条或滑动条,用户通过触摸屏控制进度条的位置或状态,通常用于显示某个量的进度,类似于音量调节、亮度调节等。

Ascii_input();Ascii_input() 函数用于显示和处理 ASCII 键盘输入,允许用户通过触摸界面输入英文字符、数字或其他 ASCII 字符。

GBK_input();GBK_input() 函数用于支持 GBK 编码的输入,通常是中文输入法的实现,用户可以通过触摸屏输入中文字符。这可能是通过选择拼音或者字形的方式来进行。

VarKey_touch();VarKey_touch() 函数用于多变量调整功能,用户可以通过触摸屏来调整多个参数值。这可能是一个综合调节界面,用户可以控制多个滑块或旋钮来调整多个变量。

pop_up_touch();pop_up_touch() 函数显示和控制弹出窗口(Pop-up Window)。当用户执行某个操作时,这个函数会负责显示一个弹出窗口,用于提示信息、确认操作或者进行额外的设置。

        /**** Screen test ****/
		if (scr_flag == 1 && scr_time > 100)
		{
			scr_time = 0;
			Detection_screen(scr_flag) ;
		}
		else if (scr_flag == 2)
		{
			if (gTpInfo.sta) // press down
			{
				scr_key = 1;
			}
			if (gTpInfo.sta == 0 &&scr_key == 1)
			{
				scr_key = 0;
				Detection_screen(scr_flag) ;
			}
		}
		
		/****Keyboard cursor display****/
		if (Cusor_time > 60)
		{
			Cusor_time = 0;
			if (DioKb_flag == 1)
			{
				if (Screen_DIR == 0)
				{
					if (gDio_Info[Dio_num].Alig == 0)
						cx = cur_x + input_w;
					else
						cx = cur_x;
					cy = cur_y;
					w_temp = cur_w;
					h_temp = gDio_Info[Dio_num].zk_h;
				}
				else if (Screen_DIR == 1)
				{
					if (gDio_Info[Dio_num].Alig == 0)
						cy = cur_y + input_w;
					else
						cy = cur_y;
					cx = cur_x;
					w_temp = gDio_Info[Dio_num].zk_h;
					h_temp = cur_w;
				}
				else if (Screen_DIR == 2)
				{
					if (gDio_Info[Dio_num].Alig == 0)
						cx = cur_x - input_w;
					else
						cx = cur_x;
					cy = cur_y;
					w_temp = cur_w;
					h_temp = gDio_Info[Dio_num].zk_h;
				}
				else if (Screen_DIR == 3)
				{
					if (gDio_Info[Dio_num].Alig == 0)
						cy = cur_y - input_w;
					else
						cy = cur_y;
					cx = cur_x;
					w_temp = gDio_Info[Dio_num].zk_h;
					h_temp = cur_w;
				}
			}

这段代码的核心功能是处理触摸屏输入光标显示,并通过不同的键盘输入标志(如 DioKb_flagAioKb_flagGBKioKb_flag)来决定光标的显示与位置更新。每当满足一定条件时(如每 60 次 Cusor_time),程序会定期刷新光标的位置并显示在屏幕上。通过屏幕方向(Screen_DIR)、对齐方式(gDio_Info[Dio_num].Alig)等因素的综合判断,程序确保光标能够正确地显示在屏幕的不同位置。此外,Detection_screen(scr_flag) 的调用用于屏幕检测或触摸按键的响应,确保用户与设备的交互能够顺利进行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

7yewh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值