问答

汇集网友智慧,解决技术难题

21ic问答首页 - 赛元单片机触摸没反应,新手求带。。。

触摸 单片机 ST TI timer

赛元单片机触摸没反应,新手求带。。。

fzhlpp2020-12-19
按照指南操作静态码调试正常,在我的板子上从Touch key Tool Menu图表窗口可以看到手触摸的时候波形变化,也成功变成绿色,但是不知道怎么调试动态,因为静态是用的他们官网下载的静态码直接烧录就可以了,而动态没有直接烧录的码,要从自己的代码里面做进去,就复杂了,按照他们指南操作下来弄了一天硬是一点反应没有,求大哥大姐指导: //************************************************************
//  Copyright (c) 深圳市赛元微电子有限公司
//        文件名称        : main.c
//        作者                : Yanni
//        模块功能        : SC91F8311触控DEMO
//  最后更正日期:
//         版本                : 2015-12-25:
//              :  
//*************************************************************
#include "h\SC92F836XB_C.h"
#include<intrins.h>
#include "h\data_type.h"
#include "lib\SensorMethod.h"
#define _TOUCHKEY_DEBUG_
#ifdef _TOUCHKEY_DEBUG_
#include "SOC_DebugTouchKey_Lib\SOC_DebugTouchKey.h"
#endif
#define nop  _nop_();         //???
//*****************全局变量区***************************************************
INT32U exKeyValueFlag = 0;                //当前轮按键标志
INT8U  Timercount = 0;                        //定时器计数
//BOOL   TimerFlag_1ms = 0;                //定时器1MS标志
uchar a,b,c;
//*****************全局变量区***************************************************

BOOL   TimerFlag_1s,TimerFlag_1ms,TimerFlag_10s = 0;                //定时器1MS标志
INT8U  Flag_1s ,Flag_1ms,Flag_10s=0;
INT8U  gTkIsValid = 0;                         //按键有效标志
INT8U  exKeyValue = 0;                        //当前轮按键键值
INT8U  KeyValue = 0;                        //按键键值


sbit sda=P2^5;           //TM1640???
sbit scl=P2^6;           //TM1640???
uchar  dis[]={0xFE,0x30,0xD5,0x75,0x39,0x6F,0xEF,0x34,0xFF,0x7F,0xBF,0xFF,0xCE,0xF3,0xCF,0x8F,0xFF,0xff};//???
//                //0    1    2    3    4     5    6    7    8   9    a    b    c    d    e     f  ??        ??
void delay(INT16U z)                  //?????
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=487;y>0;y--);
}
//*********START***********************************************
void start()                  //1640??
{
        sda=1;
        nop        nop  
        scl=1;       
        nop        nop        
        sda=0;       
}
//**************************************************************
void stop()                         //1640??
{
        scl=0;
        nop        nop            
        sda=0;
        scl=1;
        nop        nop         
        sda=1;
        nop        nop       
}
//***********************************************************
void write(uchar date)                  //1640???
{
        uchar i;
        for(i=0;i<8;i++)
        {         
                scl=0;
                if(date&0x01)               
                                {
                                sda=1;
                                nop        nop                                 
                                }
                else
                                {
                                sda=0;
                                nop        nop                                  
                                }
                scl=1;
                nop
                date=date>>1;
        }               
}
//**************?TM1640??????***************************
void send(uchar T,uchar time,uchar led)                  
{
    uchar i;
        start();
        write(0x44);       //设置芯片工作模式,这里选地址自动加1
        stop();
        start();
        write(0xc0);//设置首地址,数码管的位选值
        for(i=0;i<16;i++)//地址自加不必每次都写地址,传输显示数据,最多16字节不能多写
        {       
        if(i==0)write(dis[T/100]);         //GRID1
        if(i==1)write(dis[T/10%10]);  //GRID2
        if(i==2)write(dis[T%10]);         //GRID3

        if(i==3)write(dis[time/10]);                 //GRID4
        if(i==4)write(dis[time%10]);                  //GRID5

        if(i==5)write(led&0xff);           //GRID6
        if(i==6)write(0x00);
        if(i==7)write(0x00);
        if(i==8)write(led&0xff); //GRID9
        if(i==9)write(0x00);
        if(i==10)write(0x00);
        if(i==11)write(0x00);
        if(i==12)write(0x00);
        if(i==13)write(0x00);
        if(i==14)write(0x00);
        if(i==15)write(led&0xff);//GRID16

        delay(20);
        }   
         stop();
         start();
         write(0x89);       //亮度选择
         stop();                   
}  
/**************************************************
*函数名称:void TimerInit(void)
*函数功能:定时器初始化
*入口参数:void
*出口参数:void
**************************************************/
void TimerInit(void)
{
        TMCON = (TMCON&0xfe)|(0<<0);                //bit0: 0为FOSC/12,1为FOSO

        TMOD = TMOD&0xf0;                                          //设置定时0,工作方式0
        TMOD = TMOD|0x00;
        TH0=(8192-1000)/32;                               //1000*1=1000us        ,1MS
        TL0=(8192-1000)%32;
        TF0 = 0;                                                    //清中断标志
        TR0=0;                                                                //关定时器0
           ET0=1;                                                                //使能定时器0中断
        TR0=1;
}

/**************************************************
*函数名称:void timer0()interrupt 1
*函数功能:定时器中断服务函数
*入口参数:void
*出口参数:void
**************************************************/
void timer0()interrupt 1
{
        TH0 = (8192-1000)/32;                               //2000*1/4us=500us
        TL0 = (8192-1000)%32;       
        TimerFlag_1ms = 1;       
}
/**************************************************
*函数名称:void  Sys_Init(void)
*函数功能:系统初始化
*入口参数:void
*出口参数:void  
**************************************************/
void  Sys_Init(void)
{       
        WDTCON  = 0x10;                                    //1--1 -- 00    开WDT,WDT清0,WDT 524.288ms溢出;烧录时,可Code Option选择ENWDT
        //TK对应的IO设置为强推挽输出1
        P0CON = 0xFF;
        P0PH  = 0xFF;       
        P1CON = 0xFF;
        P1PH  = 0xFF;
        P2CON = 0xFF;
        P2PH  = 0xFF;
        P0 = 0xFF;
        P1 = 0xFF;
        P2 = 0xFF;
        P5 = 0x00;        
                  
        EA = 1;                                                //开总中断       
    TimerInit();                                 //定时器初始化
}
/**************************************************
*函数名称:void ChangeTouchKeyvalue(void)
*函数功能:转换TK键值
*入口参数:void
*出口参数:void
**************************************************/
void ChangeTouchKeyvalue(void)
{
        switch(exKeyValueFlag)
        {               
                //不同间距不同大小的按键
        case 0x00000001:exKeyValue = 1;break;       
                case 0x00000002:exKeyValue = 2;break;
                case 0x00000004:exKeyValue = 3;break;
                case 0x00000006:exKeyValue = 4;break;       
                case 0x0000001f:exKeyValue = 5;break;
               
            default:exKeyValue = 0xff;break;                        
        }
}
/**************************************************
*函数名称:void UpdateLcdBufFunc(void)
*函数功能:更新显示数据函数
*入口参数:void
*出口参数:void
**************************************************/
void UpdateLcdBufFunc(void)
{
        if(exKeyValue != 0xff)
        {a++;
                if(gTkIsValid == 0)                        //松手前只出一次键
                {               
                        gTkIsValid = 1;
                        KeyValue=exKeyValue;
            switch(KeyValue)
            {               
                //不同间距不同大小的按键
                case 1:a++; //break;
                case 2:b=55;break;
                case 3:c=11;break;
                                                                case 4:b=26;break;
                case 5:c=1;break;                                                         
                default:exKeyValue = 0xff;break;                        
            }
                }                                                        
        }
        else
        {
                gTkIsValid = 0;        
        }
}
/**************************************************
*函数名称:void  Sys_Scan(void)
*函数功能:扫描TK和显示
*入口参数:void
*出口参数:void  
**************************************************/
/*
void Sys_Scan(void)
{                                     
        if(SOCAPI_TouchKeyStatus&0x80)            //重要步骤2:  触摸键扫描一轮标志,是否调用TouchKeyScan()一定要根据此标志位置起后
         {                                                                                                                                                  
                SOCAPI_TouchKeyStatus &= 0x7f;        //重要步骤3: 清除标志位, 需要外部清除。                                                                                                            
                exKeyValueFlag = TouchKeyScan();//按键数据处理函数  
                TouchKeyRestart();                                //启动下一轮转换                                                                                                                                                                                                                                                                        
        }                         
}
*/
/**************************************************
*函数名称:void  Sys_Scan(void)
*函数功能:扫描TK和显示
*入口参数:void
*出口参数:void  
**************************************************/
void Sys_Scan(void)
{                                     
        if(SOCAPI_TouchKeyStatus&0x80)            //重要步骤2:  触摸键扫描一轮标志,是否调用TouchKeyScan()一定要根据此标志位置起后
         {                                                                                                                                                  
                SOCAPI_TouchKeyStatus &= 0x7f;        //重要步骤3: 清除标志位, 需要外部清除。                                                                                                            
                exKeyValueFlag = TouchKeyScan();//按键数据处理函数
                ChangeTouchKeyvalue();                   //转换键值
        UpdateLcdBufFunc();                 //更新显示数据   
                TouchKeyRestart();                                //启动下一轮转换                                                                                                                                                                                                                                                                        
        }                            
}
/**************************************************
*函数名称:void main(void)                                                                  
*函数功能:主函数
*入口参数:void
*出口参数:void  
**************************************************/
void main(void)
{                                       
        Sys_Init();//触控按键初始化
       
                #ifdef _TOUCHKEY_DEBUG_SOCAPI_
        DeBugTouchKey_Init();
        #endif
        TouchKeyInit();

        while(1)
        {
           WDTCON  = 0x10;
               
                        send(a,b,c);       
                //if(exKeyValueFlag==0)
               
               
           if(TimerFlag_1ms==1)
           {
                        TimerFlag_1ms=0;       
                        Timercount++;
                        if(Timercount>10)
                        {
                                Timercount=0;
                                Sys_Scan();
                        }                                                                                                        
           }
                                  
        }
}

回答 +关注 7
903人浏览 4人回答问题 分享 举报
4 个回答
  • 一路向北lm 发表于 2020-12-20 14:16
    参考一下我写过的帖子 ,以前评测说赛元的触摸

    虽然没有找到但还是要谢谢你的回复,去你空间看了是有好多有关赛元的,也有关按键操作的,但不是触摸,我现在遇到的是触摸单击功能可以,想不出怎么实现触摸长按功能。
  • 参考一下我写过的帖子 ,以前评测说赛元的触摸
  • 今天都休息了没人理我,现在也弄好了,原来是我IO口设置问题,要设置强推挽,现在新问题了,就是怎么判断长按弹簧连加...现在还不知道怎么判断.有知道的吗,求赐教!
  • 有用过赛元触摸功能的吗,说说看你们开始弄这功能的时候有没有遇到过这样的问题,动态调试没反应,随时转到烧静态码是正常的,芯片应该是好的。会不会是我代码里面哪个需要的代码没弄上去?

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