[活动专区] 【赛元95F】+8.DIY拓展6:我要玩触控了第四步

[复制链接]
659|7
 楼主| 一路向北lm 发表于 2020-4-8 22:57 | 显示全部楼层 |阅读模式
高灵敏度触控库的调试
在调试之前需要 设定 Code Range和XDATALEN,在BL51 Locate界面,设定CodeRange为0x100,需要将Use Memory Layout from Target Dialog 的对号去掉。
991815e8de649b6b03.png
 楼主| 一路向北lm 发表于 2020-4-8 22:57 | 显示全部楼层
设定 XDATALEN,分别将IDATALEN和XDATALEN的堆栈设置为200H和400H。
397735e8de67134994.png
 楼主| 一路向北lm 发表于 2020-4-8 22:58 | 显示全部楼层
使用触控功能需要对触控库提供进行初始化,在main.c中需要对调用TouchKeyInit()函数
  1. TouchKeyInit(); //触控按键初始化
  2. Lcd1602_Delay(10000);
  3. DisplayListChar(0, 1, "                ");
  4. DisplayListChar(0, 1, "Touch Init..OK!");


 楼主| 一路向北lm 发表于 2020-4-8 22:58 | 显示全部楼层
如果让触控按键可以迅速响应,需要开始中断,对其进行间隔扫描,这里我开启了定时器0中断,每10ms扫描一次。
  1. //定时器0中断函数
  2. void timer0() interrupt 1
  3. {
  4.         unsigned int count1,count2;
  5.     TL0 = (65536 - 16000)%256;
  6.         TH0 = (65536 - 16000)/256;       
  7.     count1++;count2++;
  8.         if(count1 == 10)   //每10ms一次
  9.         {
  10.             count1 = 0;
  11.                   tk_flag = 1;      //扫描一次触控按键       
  12.          }               
  13.         if(count2 == 1000)   //每1000ms一次
  14.         {
  15.             count2 = 0;
  16.             Led_Toggle(LED_B); //LED状态提示
  17.          }               
  18. }

 楼主| 一路向北lm 发表于 2020-4-8 22:59 | 显示全部楼层
设置tk_flag标志位,在主循环中不断检测tk_flag标志位,调用Sys_Scan()函数对触控按键的扫描检测和一系列的处理操作
  1. while(1)
  2.         {               
  3.            if(tk_flag==1) //每10ms 扫描处理一下触控
  4.            {
  5.                           tk_flag=0;                               
  6.                           Sys_Scan();                                                                                                                
  7.            }
  8. }


 楼主| 一路向北lm 发表于 2020-4-8 23:00 | 显示全部楼层
Sys_Scan函数中主要实现了对TK通道扫描功能,这里的SOCAPI_TouchKeyStatus 是触控按键状态标志位,是一个32bit的变量,最高位为1表示有触控按键被按下,从bit0到bit30位表示TK的每一个通道的状态,在sys_Scan函数中先对SOCAPI_TouchKeyStatus的最高位进行判断,确定是否有触控按键按下,满足条件后立刻对最高位进行清0,即&=0x7f操作,然后再执行TouchKeyScan()按键数据处理函数,将读取到按键TK通道输出到SOCAPI_TouchKeyStatus变量,我自己又添加了一个ReadTouchKeyValue 函数,用于一些简单的处理,最后调用TouchKeyRestart函数,启动下一轮转换。
  1. /**************************************************
  2. *函数名称: void Sys_Scan(void)
  3. *函数功能:扫描 TK
  4. *入口参数: void
  5. *出口参数: void
  6. **************************************************/
  7. void Sys_Scan(void)
  8. {
  9.        
  10.         if(SOCAPI_TouchKeyStatus&0x80) //触摸键扫描一轮标志,是否调用 TouchKeyScan()一定要根据此标志位置起后
  11.         {
  12.                 SOCAPI_TouchKeyStatus &= 0x7f; //清除标志位, 需要外部清除。
  13.                 exKeyValueFlag = TouchKeyScan();//按键数据处理函数
  14.                 ReadTouchKeyValue();            //读取触控键值
  15.                 TouchKeyRestart();              //启动下一轮转换
  16.         }
  17. }


 楼主| 一路向北lm 发表于 2020-4-8 23:00 | 显示全部楼层
ReadTouchKeyValue 函数主要是读取触控键值,并进行简单操作,这里以我自己DIY的板子为例,主要是TK12、TK13,TK14,TK15.
  1. /**************************************************
  2. *函数名称: void ReadTouchKeyvalue()
  3. *函数功能:  读取触控键值,并进行操作
  4. *入口参数: void
  5. *出口参数: void
  6. **************************************************/
  7. void ReadTouchKeyValue()
  8. {
  9.           if(exKeyValueFlag &0x1000)
  10.                 {
  11.                         Lcd1602_Delay(1000);      //延时消抖
  12.                         if(exKeyValueFlag &0x1000)
  13.                         {
  14.                                 Lcd1602_Delay(1000);  //延时消抖
  15.                                 exKeyValueFlag &= 0x0;
  16.                             DisplayListChar(0, 1, "TK12  is  Touch!");  //Lcd显示
  17.                                 TkFlag =~ TkFlag;
  18.                                 if(TkFlag)
  19.                                 {
  20.                                   Led_Toggle(TK1_R);  //LED翻转
  21.                                   BuzzerWork();      //蜂鸣
  22.                                 }                                           
  23.                         }                                 
  24.                 }
  25.                 if(exKeyValueFlag &0x2000)
  26.     {
  27.                         Lcd1602_Delay(1000);
  28.                         if(exKeyValueFlag &0x2000)
  29.                         {
  30.                                 Lcd1602_Delay(1000);
  31.                                 exKeyValueFlag &= 0x0;
  32.                           DisplayListChar(0, 1, "TK13  is  Touch!");
  33.                                 TkFlag =~ TkFlag;
  34.                                 if(TkFlag)
  35.                                 {
  36.                                          Led_Toggle(TK2_R);
  37.                                    BuzzerWork();
  38.                                 }       
  39.                         }                       
  40.                 }
  41.     if(exKeyValueFlag &0x4000)
  42.     {
  43.                          Lcd1602_Delay(1000);
  44.                         if(exKeyValueFlag &0x4000)
  45.                         {
  46.                                 Lcd1602_Delay(1000);
  47.                                 exKeyValueFlag &= 0x0;
  48.                           DisplayListChar(0, 1, "TK14  is  Touch!");
  49.                           TkFlag =~ TkFlag;
  50.                                 if(TkFlag)
  51.                                 {
  52.                                          Led_Toggle(TK3_R);
  53.                                    BuzzerWork();
  54.                                 }       
  55.                         }                       
  56.                 }
  57.                 if(exKeyValueFlag &0x8000)
  58.     {
  59.                         Lcd1602_Delay(1000);
  60.                         if(exKeyValueFlag &0x8000)
  61.                         {
  62.                                 Lcd1602_Delay(1000);
  63.                                 exKeyValueFlag &= 0x0;
  64.                           DisplayListChar(0, 1, "TK15  is  Touch!");
  65.                           TkFlag =~ TkFlag;
  66.                                 if(TkFlag)
  67.                                 {
  68.                                          Led_Toggle(TK4_R);
  69.                                    BuzzerWork();
  70.                                 }       
  71.                         }                       
  72.                 }       
  73. }


 楼主| 一路向北lm 发表于 2020-4-8 23:01 | 显示全部楼层
最后编译可以实现触控按键TK12、TK13、TK14、TK15的检测和对应的触发响应,发两张图片意思一下:

665125e8de754377ea.png 392915e8de762c7c16.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

粉丝
快速回复 在线客服 返回列表 返回顶部