前言:
该系列将教你超快速实现触摸按键的开发,而你并不需要过多过硬的软硬件细节基础。不夸张的说,实现基础的触摸按下检测开发只需30分钟。
开发前,需要知道以下内容或准备好相关设备。
触摸原理:分布在芯片端口的电容因为手指的接触,使电容发生了改变,经芯片处理后能将微小的电容变化转化成电压信号的变化,再通过软件AD采集端口电压,根据电压的变化实现触摸的识别。说白了,就是芯片AD读端口电压,经软件处理后识别是否按下,就这么简单,当然之所以这么简单,得益于芯片的设计之外,还得益后期软件算法的处理。
1、芯片:芯片使用PIC的PIC16F18876-E/PTVAO型号芯片,这是PIC专门针对触摸按键开发的芯片,集成度很高。
2、开发环境:
本人使用MPLAB X IDE v5.20
3、编译工具:
选择使用XC8(2.05),这里必须要用2.0以上的,因为之后的配置工具MCC的mtouch模块需要2.0以上的编译工具支持,否则编译通不过。
4、配置工具:
MPLAB Code Configurator 简称MCC,版本v3.75,一个配置工具,之所以快,就因为它的存在。
5、仿真器:
使用ICD3,烧写口是5线的。当然PIC的其他仿真器也可,如PICkit3。
这样基本的所有工具都齐了。以上相关软件下载均在官网PIC官网可以下载。
1、左边为触摸膜的排线接口,右边就是将接口接到芯片的IO口上。
2、芯片的8个触摸按键的输入,一个按键对应一个IO口,对应关系如下:为(RC0 RA6 RA7 RE2 RE1 RE0 RA5 RA4)
3、为了能够在PC上显示触摸按键状态,我专门使用了UART将触摸信息反馈在串口工具上,使用了如下一个通信脚(LIN_TXD RC6脚),当然你没有TTL转USB的设备也可以直接仿真打断点看触摸是否触发,或者使用led指示灯。
而芯片其他的电路设计只要最小系统就好了,就是芯片能工作就可以了。1、打开MPLAB X IDE
2、创建工程 FileàNew Project,如图选择后点击Next
3、如图选择PIC16F18876,点击Next
4、烧写工具选择你自己的工具,我是使用了ICD3。点击Next
5、编译器就选XC8,这里必须2.0以上,否则后期编译通不过。点击Next
6、给工程命名以及工程位置,点击Finish,这样工程就建完了。
按下图数据配置端口,因为在硬件设计我们知道触摸输入口有RC0 RA6 RA7 RE2 RE1 RE0 RA5 RA4这8个口,将这几个口锁住(绿色),如下 4、ButtonsàCreate New Button,填8个,最后点击Add 5、选择对应的IO口
6、以上完成后,点击Generate生成代码
7、为了将触摸信号显示在PC上,本人多配置一个USART,波特率9600,当然这个不是必须的。 配置如下:同样需要再次点击Generate 这样整个代码的配置就完成了,不要惊讶,就是这么简单。当然下一章教你怎么调函数,才能真正实现
我们需要的函数很简单,只有2个
1、bool MTOUCH_Service_Mainloop(void),运行主函数
2、bool MTOUCH_Button_isPressed(enum mtouch_button_names name) 获取触摸状态函数
主函数设计如下:
本人的代码如下,即触摸触发时,发出触发的端口标号,否则发出0x00;代码如下
#include "mcc_generated_files/mcc.h"/* Main application */static unsigned int xx = 2000;static unsigned int y = 5;void main(void){ // initialize the device SYSTEM_Initialize(); // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits // Use the following macros to: // Enable the Global Interrupts INTERRUPT_GlobalInterruptEnable(); // Enable the Peripheral Interrupts INTERRUPT_PeripheralInterruptEnable(); // Disable the Global Interrupts //INTERRUPT_GlobalInterruptDisable(); // Disable the Peripheral Interrupts //INTERRUPT_PeripheralInterruptDisable(); while (1) { MTOUCH_Service_Mainloop(); xx--; if(xx==0) { y--; xx=2000; } if(y==0) { xx=2000; y=5; { unsigned char i; for(i=0;i<=7;i++) { if(MTOUCH_Button_isPressed(i)==true) { //触摸触发处理 EUSART_Write(0xaa); EUSART_Write(i); EUSART_Write(0xaa); } else { //触摸未触发处理 EUSART_Write(0x00); } } } } // Add your application code }}/** End of File*/
--------------------END---------------