打印
[活动专区]

【赛元95F】+8.DIY拓展6:我要玩触控了第四步

[复制链接]
507|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
一路向北lm|  楼主 | 2020-4-8 22:57 | 只看该作者
设定 XDATALEN,分别将IDATALEN和XDATALEN的堆栈设置为200H和400H。

使用特权

评论回复
板凳
一路向北lm|  楼主 | 2020-4-8 22:58 | 只看该作者
使用触控功能需要对触控库提供进行初始化,在main.c中需要对调用TouchKeyInit()函数
TouchKeyInit(); //触控按键初始化
Lcd1602_Delay(10000);
DisplayListChar(0, 1, "                ");
DisplayListChar(0, 1, "Touch Init..OK!");


使用特权

评论回复
地板
一路向北lm|  楼主 | 2020-4-8 22:58 | 只看该作者
如果让触控按键可以迅速响应,需要开始中断,对其进行间隔扫描,这里我开启了定时器0中断,每10ms扫描一次。
//定时器0中断函数
void timer0() interrupt 1
{
        unsigned int count1,count2;
    TL0 = (65536 - 16000)%256;
        TH0 = (65536 - 16000)/256;       
    count1++;count2++;
        if(count1 == 10)   //每10ms一次
        {
            count1 = 0;
                  tk_flag = 1;      //扫描一次触控按键       
         }               
        if(count2 == 1000)   //每1000ms一次
        {
            count2 = 0;
            Led_Toggle(LED_B); //LED状态提示
         }               
}

使用特权

评论回复
5
一路向北lm|  楼主 | 2020-4-8 22:59 | 只看该作者
设置tk_flag标志位,在主循环中不断检测tk_flag标志位,调用Sys_Scan()函数对触控按键的扫描检测和一系列的处理操作
while(1)
        {               
           if(tk_flag==1) //每10ms 扫描处理一下触控
           {
                          tk_flag=0;                               
                          Sys_Scan();                                                                                                                
           }
}


使用特权

评论回复
6
一路向北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函数,启动下一轮转换。
/**************************************************
*函数名称: void Sys_Scan(void)
*函数功能:扫描 TK
*入口参数: void
*出口参数: void
**************************************************/
void Sys_Scan(void)
{
       
        if(SOCAPI_TouchKeyStatus&0x80) //触摸键扫描一轮标志,是否调用 TouchKeyScan()一定要根据此标志位置起后
        {
                SOCAPI_TouchKeyStatus &= 0x7f; //清除标志位, 需要外部清除。
                exKeyValueFlag = TouchKeyScan();//按键数据处理函数
                ReadTouchKeyValue();            //读取触控键值
                TouchKeyRestart();              //启动下一轮转换
        }
}


使用特权

评论回复
7
一路向北lm|  楼主 | 2020-4-8 23:00 | 只看该作者
ReadTouchKeyValue 函数主要是读取触控键值,并进行简单操作,这里以我自己DIY的板子为例,主要是TK12、TK13,TK14,TK15.
/**************************************************
*函数名称: void ReadTouchKeyvalue()
*函数功能:  读取触控键值,并进行操作
*入口参数: void
*出口参数: void
**************************************************/
void ReadTouchKeyValue()
{
          if(exKeyValueFlag &0x1000)
                {
                        Lcd1602_Delay(1000);      //延时消抖
                        if(exKeyValueFlag &0x1000)
                        {
                                Lcd1602_Delay(1000);  //延时消抖
                                exKeyValueFlag &= 0x0;
                            DisplayListChar(0, 1, "TK12  is  Touch!");  //Lcd显示
                                TkFlag =~ TkFlag;
                                if(TkFlag)
                                {
                                  Led_Toggle(TK1_R);  //LED翻转
                                  BuzzerWork();      //蜂鸣
                                }                                           
                        }                                 
                }
                if(exKeyValueFlag &0x2000)
    {
                        Lcd1602_Delay(1000);
                        if(exKeyValueFlag &0x2000)
                        {
                                Lcd1602_Delay(1000);
                                exKeyValueFlag &= 0x0;
                          DisplayListChar(0, 1, "TK13  is  Touch!");
                                TkFlag =~ TkFlag;
                                if(TkFlag)
                                {
                                         Led_Toggle(TK2_R);
                                   BuzzerWork();
                                }       
                        }                       
                }
    if(exKeyValueFlag &0x4000)
    {
                         Lcd1602_Delay(1000);
                        if(exKeyValueFlag &0x4000)
                        {
                                Lcd1602_Delay(1000);
                                exKeyValueFlag &= 0x0;
                          DisplayListChar(0, 1, "TK14  is  Touch!");
                          TkFlag =~ TkFlag;
                                if(TkFlag)
                                {
                                         Led_Toggle(TK3_R);
                                   BuzzerWork();
                                }       
                        }                       
                }
                if(exKeyValueFlag &0x8000)
    {
                        Lcd1602_Delay(1000);
                        if(exKeyValueFlag &0x8000)
                        {
                                Lcd1602_Delay(1000);
                                exKeyValueFlag &= 0x0;
                          DisplayListChar(0, 1, "TK15  is  Touch!");
                          TkFlag =~ TkFlag;
                                if(TkFlag)
                                {
                                         Led_Toggle(TK4_R);
                                   BuzzerWork();
                                }       
                        }                       
                }       
}


使用特权

评论回复
8
一路向北lm|  楼主 | 2020-4-8 23:01 | 只看该作者
最后编译可以实现触控按键TK12、TK13、TK14、TK15的检测和对应的触发响应,发两张图片意思一下:



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

274

主题

3760

帖子

75

粉丝