觸摸按鈕執(zhí)行自定義任務(wù)組件
項目簡介本項目基于RT8H8K001開發(fā)板 + RT6809CNN01開發(fā)板 + TFT顯示屏(1024x600) + GT911觸摸屏實現(xiàn)了一個多功能觸摸按鈕組件。系統(tǒng)具備按鈕控制后執(zhí)行任務(wù)的功能,可用于各類觸摸屏人機交互場景。
硬件平臺- MCU: STC8H8K64U(51單片機)(注:51 / ARM等單片機皆可)
- 顯示控制器: 瑞佑科技 RA8889或者RA6809
- 顯示屏: TFT 1024x600分辨率
- 觸摸屏: GT911電容觸摸屏
- MCU--顯示控制器的通信方式: SPI-4
軟件架構(gòu)軟件主要包含以下幾個模塊: - 主程序模塊: 實現(xiàn)系統(tǒng)初始化、主循環(huán)和事件處理
- 按鈕控件模塊: 實現(xiàn)按鈕的創(chuàng)建、繪制和交互處理
- 觸摸屏模塊: 實現(xiàn)觸摸事件的掃描和處理
- 擴展:文字滾動模塊: 實現(xiàn)文字的滾動顯示效果
主要功能系統(tǒng)提供四種測試按鈕,分別實現(xiàn)不同的功能: - Flat Button: 平面按鈕,點擊后執(zhí)行繪圖,顯示字符串兩個任務(wù)
- Round Button: 圓角按鈕,點擊后執(zhí)行繪圖,顯示字符串兩個任務(wù)
- Disabled Button: 禁用按鈕,禁用后按鈕不可使用的顯示狀態(tài)
- Standard Button: 標準按鈕,3D效果,點擊后執(zhí)行彈跳球動畫與滾動顯示的字符串兩個任務(wù)
功能流程圖
1. 主程序流程
2. 文字滾動功能流程 (Test_Click4)
代碼詳解
1. 主程序初始化主程序在初始化階段完成以下工作: - 配置MCU的I/O口
- 初始化SPI通信
- 初始化RA8889/RA6809顯示控制器
- 初始化GT911觸摸屏
- 加載背景圖像
- 創(chuàng)建和配置按鈕控件
- 顯示提示信息
- void main()
- {
- // 聲明按鈕指針
- BUTTON* btn1;
- BUTTON* btn2;
- BUTTON* btn3;
- BUTTON* btn4;
-
- // MCU I/O口配置
- P0M0 = 0xff & cClrb5; // 設(shè)置P0.5為雙向口模式(SPI_MISO)
- P0M1 = 0x00;
- // 更多I/O配置...
-
- // SPI初始化
- SPI4_Init();
-
- // RA8889硬件復(fù)位和初始化
- RA8889_RST = 1;
- delay_ms(1);
- RA8889_RST = 0;
- delay_ms(1);
- RA8889_RST = 1;
- RA8889_Initial();
-
- // 初始化觸摸屏
- GT911_Init();
-
- // 加載背景圖像
- SPI_NOR_initial_JPG_AVI(1,0,BUS1,CS1,1);
- JPG_NOR(BINARY_INFO[0].start_addr, BINARY_INFO[0].img_size, canvas_image_width, 0,0);
-
- // 顯示PNG圖片
- SPI_NOR_initial_DMA (4,BUS1,CS1,1,0);
- SPI_NOR_DMA_png (BINARY_INFO[2].start_addr,Layer1,0,BINARY_INFO[2].img_width,BINARY_INFO[2].img_height);
- BTE_alpha_blending_32bit_Pixel_mode(BINARY_INFO[2].img_width,BINARY_INFO[2].img_width,BINARY_INFO[2].img_height,
- 800,530,Layer0,canvas_image_width,
- 800,530,Layer0,canvas_image_width,
- Layer1);
-
- // 顯示標題文字
- Foreground_color_16M(color16M_white);
- Select_Font_Height_WxN_HxN_ChromaKey_Alignment(24,2,2,1,0);
- Goto_Text_XY(280,20);
- Show_String("Button Control Example");
-
- // 初始化按鈕控件
- Button_Init();
-
- // 創(chuàng)建并配置4個按鈕
- // ...創(chuàng)建按鈕代碼...
-
- // 繪制所有按鈕
- Button_DrawAll();
-
- // 顯示提示信息
- // ...顯示提示代碼...
-
- // 主循環(huán)
- while(1) {
- // 檢測觸摸屏
- if(CTP_INT == 0){
- GT911_Scan();
- }
- // 處理按鈕觸摸
- Button_HandleTouch();
- // 延時
- delay_ms(10);
- }
- }
復(fù)制代碼
使用說明程序操作流程
- 程序啟動后,會顯示四個按鈕和提示信息
- 點擊不同的按鈕可以進入不同的功能模式:
- Flat Button: 繪圖和顯示一串字符
- Round Button: 繪圖和顯示一串字符
- Disabled Button: 繪圖和顯示一串字符
- Standard Button: 顯示彈跳球和滾動文字效
文字滾動模式使用說明- 點擊"Standard Button"進入文字滾動和彈跳球模式
- 觀察文字從左向右滾動效果和彈跳球動畫
- 觸摸屏幕任意位置可以退出該模式
- void Test_Click4(void)
- {
- // 變量聲明
- char str[] = " Button 4 custom function executed!";
- char display_buffer[100]; // 滾動文本緩沖區(qū)
- char temp[41]; // 臨時緩沖區(qū)
- int str_len; // 字符串長度
- int display_width = 40; // 顯示區(qū)域?qū)挾?br />
- int start_pos = -display_width + 5; // 起始位置
- int i, j;
- int x, y, dir_x, dir_y; // 球的位置和方向
- // 初始化文本和區(qū)域
- // ...初始化代碼...
-
- // 準備滾動文本:原文本 + 10空格 + 原文本
- str_len = strlen(str);
- strcpy(display_buffer, str);
-
- // 添加空格
- for(i = str_len; i < str_len + 10; i++) {
- display_buffer[i] = ' ';
- }
-
- // 添加第二段文本
- strcpy(&display_buffer[str_len + 10], str);
- display_buffer[str_len * 2 + 10] = '\0';
-
- // 初始化彈跳球參數(shù)
- x = 38;
- y = 15;
- dir_x = 1;
- dir_y = 1;
- i = 0;
-
- // 動畫循環(huán)
- while(1){
- // 清空區(qū)域
- BTE_Solid_Fill(0,canvas_image_width,0,LCD_Height,color16M_white,300,150);
-
- // 更新球位置并繪制
- // ...球位置更新代碼...
-
- // 顯示滾動文本
- memset(temp, ' ', display_width); // 用空格填充臨時緩沖區(qū)
- temp[display_width] = '\0'; // 確保字符串正確終止
-
- // 處理負值的start_pos
- if(start_pos < 0) {
- // 先填充部分空格
- for(j = 0; j < -start_pos && j < display_width; j++) {
- temp[j] = ' ';
- }
- // 再填充可見的字符串部分
- for(; j < display_width && j + start_pos < strlen(display_buffer); j++) {
- temp[j] = display_buffer[j + start_pos];
- }
- } else {
- // 正常填充
- for(j = 0; j < display_width && j + start_pos < strlen(display_buffer); j++) {
- temp[j] = display_buffer[j + start_pos];
- }
- }
- temp[display_width] = '\0'; // 確保字符串終止
-
- // ...顯示文本代碼...
-
- // 更新滾動位置
- start_pos++;
- if(start_pos > str_len + 10) {
- start_pos = -display_width + 5;
- }
-
- // 檢測退出條件
- if(CTP_INT == 0) break;
- }
- }
復(fù)制代碼
注意事項- 觸摸坐標可能需要根據(jù)實際屏幕分辨率進行換算
- 文字滾動功能中,如果出現(xiàn)末尾顯示多余字符的問題,請檢查temp緩沖區(qū)的初始化和終止符設(shè)置
范例演示介紹
https://www.bilibili.com/video/BV12nRzYPEH4/?share_source=copy_web&vd_source=c0cd4c87f6dcc19bcebab2f4cf3c40db
|