
簡介這是一份基于Holtek BS84C12C單片機的觸摸按鍵開發資源包面向需要快速實現觸摸輸入的嵌入式開發者與電子工程師。BS84C12C為8位低功耗觸摸MCU資源包采用官方LIBV413庫提供從底層驅動到應用層的完整參考適合作為觸控產品研發或學習合泰單片機時的基礎工程。壓縮包共51個文件體積僅77KB包含asm/inc等匯編與頭文件、h/c源文件、obj/lst編譯中間文件、pjt/opt工程配置以及map/dbg調試信息覆蓋項目從編輯、編譯到調試的完整鏈路便于直接移植或二次修改。已有671人學習下載主要面向需要快速驗證觸摸按鍵方案的中高級開發者也可作為初學者熟悉BS84C12C內部結構與庫函數的入門范例。資源中保留了主程序、UART測試及觸摸庫的工程組織關系可幫助理解合泰觸摸檢測、參數配置和中斷處理的實現思路節省從零搭建工程的時間。1. 觸摸按鍵比想象中更依賴庫的邊界拿到 BS84C12C_20180221_LIBV413_V3 這個包第一反應可能是一個普通例程實際上它是合泰官方針對 BS84C12C 觸摸檢測功能發布的完整軟件庫工程。BS84C12C 是帶電容觸摸模擬前端的 8 位單片機硬件上只要接出感應焊盤和串聯電阻觸摸檢測這件事就交給內部外設完成。但外設怎么配置掃描周期、怎么濾除電源紋波、怎么跟蹤環境溫漂這部分邏輯如果全自己寫工作量不比業務邏輯小。LIBV413 V3 的價值在于把觸摸掃描狀態機、基線更新、按鍵閾值比較都封裝成了庫函數用戶工程只需要關心通道映射、事件讀取和靈敏度修正。這個包適合兩類開發者一類是用 BS84C12C 做智能家電觸控面板想盡快把觸摸鍵跑起來另一類是已經在用 Holtek 其他觸摸 MCU想看 V3 庫相對老版本在掃描時序和濾波參數上有什么變化。下面直接從工程文件的真實結構拆起。2. LIBV413 庫文件結構與觸摸通道初始化2.1 工程目錄里哪些文件不能動把壓縮包解開后能看到 BS84C12C_LIBRARY.pjw 和 USER_PROGRAM 兩個并行部分。pjw是 Holtek HT-IDE3000 的工程文件雙擊它會載入整個觸摸庫工程。這里先要分清庫區和用戶區的邊界。文件或目錄歸屬作用BS84C12C_LIBRARY.pjw / .pjt庫工程觸摸庫主工程編譯后生成庫文件BS84B12C_LIBRARY.OPT / .pjt庫配置工程選項與編譯器配置TKS_GLOBE_VARIES.inc庫核心觸摸全局變量、常量和通道使能定義TKS_GLOBE_VARIES.H庫接口給 C 語言調用頭文件聲明觸摸數據緩沖startup1_l.asm庫啟動復位后初始化 RAM、堆棧和寄存器USER_PROGRAM / UART_TEST用戶區示例主程序包含 UART 測試代碼OUTPUT編譯輸出生成的 .OD、.HTB 等燒錄文件TKS_GLOBE_VARIES.inc和TKS_GLOBE_VARIES.H是觸摸庫的“全局數據契約”不要擅自改名。startup1_l.asm屬于庫啟動部分普通用戶不用改真正要動的是 USER_PROGRAM 下的主程序。我一般會把工程里的庫部分保持原樣只在用戶區寫自己的應用邏輯。這樣后續如果合泰放出 LIBV413 的補丁版本可以直接替換庫文件夾業務代碼不受影響。2.2 TKS_GLOBE_VARIES.inc 中的通道宏定義觸摸通道不是拿到板子就能全部工作的BS84C12C 的觸摸輸入通道需要先在TKS_GLOBE_VARIES.inc里把對應位打開。這個文件看起來像普通匯編頭文件但它同時影響庫內部的中斷向量和掃描表生成。以下是一個常見配置寫法; TKS_GLOBE_VARIES.inc 局部片段 ; 觸摸通道使能位1 使能0 關閉 TKS_CH0_EN EQU 01H ; KEY0 - PA0 TKS_CH1_EN EQU 02H ; KEY1 - PA1 TKS_CH2_EN EQU 04H ; KEY2 - PA2 TKS_CH4_EN EQU 10H ; KEY4 - PA4跳過PA3不用 ; 匯總到通道使能寄存器 TKS_CH_ENABLE EQU TKS_CH0_EN | TKS_CH1_EN | TKS_CH2_EN | TKS_CH4_EN這里的邏輯是每個觸摸通道對應一個位TKS_CH_ENABLE決定庫掃描哪些通道。未使能的通道不會參與掃描也不會出現在觸摸數據緩沖里。這樣能降低掃描周期對功耗敏感的設備尤其關鍵。需要提醒的是PA3 如果用作其他功能比如 ADC 采樣就必須把對應位置 0否則庫每次掃描都會占用這個引腳導致外部功能沖突。修改完這個文件后重新編譯庫工程再編譯用戶工程觸摸通道的掃描表才會更新。2.3 從 startup1_l.asm 到 TKS_Timer 的初始化順序BS84C12C 的觸摸庫不是一調用就立即出結果它依賴一個周期性的調度源。startup1_l.asm在復位后先完成 RAM 清零和堆棧指針設置然后跳轉到主程序的main。觸摸庫的初始化在主程序里通常遵循固定順序// main.c 中觸摸庫初始化順序 void main(void) { WDT_Disable(); // 先關看門狗防止長初始化過程被復位 System_Clock_Config(); // 配置 HIRC觸摸掃描需要穩定時鐘 TKS_Initial(); // 1. 觸摸庫初始化配置掃描引腳和內部寄存器 TKS_Baseline_Capture(); // 2. 捕獲上電基線值 TKS_Scan_Start(); // 3. 啟動周期掃描 UART_Init(115200); // 串口用于調試輸出 ENABLE_GLOBAL_INT; // 觸摸掃描依賴定時中斷調度 while(1) { DEBUG_Task(); // 用戶主循環讀取鍵值、上報數據 } }這段代碼里TKS_Initial負責把TKS_CH_ENABLE里的通道配置到硬件寄存器同時初始化內部狀態機。TKS_Baseline_Capture是很多人容易漏掉的一步它會在上電后一段時間內連續采樣每個通道形成初始基準線。如果不調用庫會以零值為基線第一次觸摸就會被誤判為環境突變。TKS_Scan_Start之后觸摸掃描由庫內部的定時器中斷驅動主循環不需要干預掃描過程。這樣設計的好處是觸摸采樣周期穩定在毫秒級不會因為主循環里有耗時的串口發送而抖動。3. 觸摸掃描寄存器配置與事件讀取3.1 原始觸摸值存在哪LIBV413 庫會把每個通道的原始觸摸值、基準值和當前差值都放在TKS_GLOBE_VARIES.H聲明的全局數組中。用戶程序直接引用這些變量不需要關心觸摸外設寄存器地址。以下是常用數據項// TKS_GLOBE_VARIES.H 中觸摸數據緩沖相關聲明 extern volatile uint16_t TKS_CH0_DATA; // 通道0當前原始值 extern volatile uint16_t TKS_CH0_BASE; // 通道0當前基線值 extern volatile uint16_t TKS_CH0_DIFF; // 通道0差值 原始值 - 基線值 extern volatile uint8_t TKS_KEY_STATUS; // 觸摸鍵狀態位bit0對應通道0TKS_CH0_DATA是電容充放電時間計數值數值越大說明感應到的電容越大。手指靠近焊盤時對地電容增大TKS_CH0_DATA會比TKS_CH0_BASE高出幾十到幾百。TKS_CH0_DIFF是庫里做按鍵判斷的直接依據它已經減去了基線。我在調試時會把這三個值同時通過串口發出來光看位狀態很難判斷閾值設置是否合理。3.2 輪詢和中斷兩種取鍵方式觸摸庫產生按鍵事件后用戶代碼有兩種方式拿結果。最簡單的辦法是主循環輪詢TKS_KEY_STATUS// 主循環輪詢方式讀取觸摸按鍵 while(1) { uint8_t key TKS_KEY_STATUS; // 讀取當前鍵狀態位圖 if(key 0x01) { LED_On(0); // 通道0按下 } else { LED_Off(0); } if(key 0x02) { LED_On(1); // 通道1按下 } else { LED_Off(1); } Delay_Ms(5); }輪詢適合按鍵數量少、掃描周期快的場景。TKS_KEY_STATUS不是電平信號它是由觸摸庫在每次掃描結束后按“差值超過閾值”的條件刷新。所以即使庫內部沒有做防抖這個值也已經包含了一次完整的掃描判斷。另一種方式是讓觸摸庫在按鍵狀態變化時觸發中斷標記然后在中斷里置位用戶標志位主循環只處理變化事件。這種方式能減少主循環頻繁讀取全局變量的開銷適合同時處理多個觸摸鍵和 UART 協議控制的場景。3.3 防抖、閾值與基線更新參數LIBV413 V3 庫里與靈敏度相關的參數通常在TKS_GLOBE_VARIES.inc頂部集中定義。V3 版本相比早期 Lib 包的改進是增加了基線自動跟隨的濾波深度選項以下參數是量產時會反復調整的參數名典型值范圍作用TKS_THRESHOLD_LEVEL20 ~ 200觸摸判定閾值基于差值絕對值TKS_DEBOUNCE_CNT2 ~ 6連續多少次掃描才確認按鍵有效TKS_BASELINE_FILTER8 / 16 / 32基線更新濾波深度越大越抗漂移TKS_NOISE_THRESHOLD5 ~ 30小于該差值視為噪聲不觸發狀態變化閾值并不是越大越穩定。閾值設大手指離開焊盤后差值回落慢容易產生長按誤判閾值設小電源紋波和61Hz 干擾可能直接穿過防抖窗口。我一般先設置TKS_THRESHOLD_LEVEL 60、TKS_DEBOUNCE_CNT 3然后把板子放在正常桌面上跑 10 分鐘觀察原始差值峰值。如果基線在不觸摸時漂移超過 20就把TKS_BASELINE_FILTER從 16 改到 32讓基線跟隨得更慢。這里有個容易混淆的點基線濾波變慢剛上電時穩定到真實環境的時間也會變長所以TKS_Baseline_Capture階段的時間也要相應延長。4. 從觸摸值到串口調試改造 UART_TEST 工程4.1 UART_TEST 工程是現成的調試起點壓縮包里帶了 USER_PROGRAM/UART_TEST 這個獨立工程它不是觸摸示例而是 BS84C12C 的硬件 UART 通信測試代碼。因為觸摸庫的最終表現要看原始值和差值UART 就成了最直接的調試輸出通道。UART_TEST 工程里的串口初始化代碼可以直接復用到觸摸項目里。BS84C12C 的 UART 使用內部高中頻時鐘作為波特率發生器初始化時要注意 Baund 參數的誤差。115200 波特率在大部分批次里誤差小于 1%跑調試日志足夠如果要做低功耗產品調試版建議用 9600 或者干脆只在測試板上啟串口。4.2 把觸摸原始數據通過串口定時上報改造 UART_TEST 工程時我會把每秒輸出固定字符串的測試代碼刪掉換成定時上報觸摸差值。下面是一段可用的發送函數// 串口格式化發送觸摸鍵值 void Debug_Send_TouchData(void) { char buf[32]; sprintf(buf, K0:%05u/%05u/%05d\r\n, (unsigned int)TKS_CH0_DATA, (unsigned int)TKS_CH0_BASE, (int)TKS_CH0_DIFF); // 打印原始值、基線值、差值 UART_SendString(buf); }這段代碼放在主循環里定時調用比如每 20ms 調用一次。輸出格式用字符串拼接上位機可以直接用串口助手打開也可以接入串口波形工具。注意%05d格式化有符號差值時負號會占一位所以只保留三位差值位寬更合適。如果串口發送耗時較長可以在發送前后關閉全局中斷避免觸摸掃描中斷被長時間阻塞。觸摸庫的掃描中斷如果被卡住超過一個掃描周期基線更新會異常按鍵響應會突然變慢。4.3 實際調參時看的幾個關鍵指標把觸摸差值實時打出來后重點觀察三條曲線。第一是按下瞬間的差值上升率好的焊盤設計在 10ms 內差值從 0 沖到 100 以上如果上升斜率很緩說明串聯電阻太大或焊盤面積偏小。第二是松開后的回落值差值應回到基線附近如果回不到零說明手指殘留電荷或 PCB 表面有水分。第三是不觸摸時基線本身的波動正常情況下波動幅值應該低于觸摸閾值的五分之一。看到基線階梯狀跳變時優先檢查電源BS84C12C 的觸摸掃描對 VDD 紋波很敏感開關電源供電時需要把觸摸供電引腳單獨加 100nF 4.7uF 濾波電容。UART 發送線上的振鈴也會耦合到觸摸電極調試時盡量用短線連接 USB 轉串口工具。5. 用 HXT_Editor_V100 校準觸摸靈敏度5.1 校準文件從哪里得到庫工程里附帶的 HXT_Editor_V100 是合泰觸摸校準工具它的作用是根據實際 PCB 焊盤和覆蓋介質生成一份靈敏度修正參數。運行 HXT_Editor 前先把編譯好的燒錄文件下載到 BS84C12C保持觸摸感應面朝上不要用手指碰觸。打開 HXT_Editor 后選擇對應的 COM 口點擊 Connect工具會通過 UART 讀取庫內部校準參數。這個過程要求 MCU 側的 UART_TEST 工程里保留接收命令的處理代碼否則工具無法和庫通信。5.2 校準對閾值系數的修正校準界面一般會讓操作者按順序點擊每個觸摸鍵工具會自動記錄每個通道按下時最大差值、松開后最小差值和環境噪聲。校準完成后HXT_Editor 會輸出一組修正系數這組系數是乘到每個通道差值上的。為什么要乘系數而不是直接改閾值因為不同通道的焊盤走線長度不同導致靈敏度天然不一致走線長的通道差值衰減大走線短的通道差值偏大。修正系數把各通道差值拉到同一水平之后用統一的TKS_THRESHOLD_LEVEL才有意義。校準完成后生成的數據通常以頭文件或寄存器值數組形式保存我會把它復制到用戶工程中在TKS_Initial之后覆蓋對應通道的校準寄存器。5.3 批量生產時把校準參數固化到 Flash單板校準只適合測試階段量產時不可能每塊板都打開 HXT_Editor 人工校準。我一般會在產線燒錄時做一次“免校準”處理先用標準覆蓋介質厚度比如 2mm 亞克力做一塊樣板把所有通道的校準參數保存到 MCU 的 Data Flash 區域。對于觸摸按鍵數量固定的產品直接把這些參數作為常量表寫入程序每塊板出廠時的靈敏度一致性完全取決于 PCB 加工公差。如果 PCB 廠家的板厚和綠油厚度批次波動大可以在測試工裝上跑一段自動校準腳本用串口命令觸發TKS_Baseline_Capture和閾值系數回讀再把回讀值寫入 Data Flash。這樣生產現場只需要治具不需要人工敲鍵盤。觸摸庫在這種模式下仍然正常工作因為庫啟動時會讀取 Data Flash 中的修正系數而不是重新捕獲一組臨時參數。本文還有配套的精品資源點擊獲取