找回密码
 立即注册
查看: 716|回复: 7

求助:STC8H1K08T触摸进不了中断函数

[复制链接]

4

主题

5

回帖

54

积分

注册会员

积分
54
发表于 2024-4-24 14:40:10 | 显示全部楼层 |阅读模式
本帖最后由 qiu_ 于 2024-4-24 15:20 编辑

求助:STC8H1K08T触摸进不了中断函数,按键值通过串口输出永远是0X6e6e。不知道是哪些设置错误了,还是我硬件设计有问题。请大佬指点。程序见附件
截图202404241438399341.jpg

240411.zip

158.54 KB, 下载次数: 85

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-4-24 17:08:12 | 显示全部楼层
本帖最后由 乘风飞扬 于 2024-4-24 17:09 编辑

触摸按键寄存器是扩展寄存器,你把扩展寄存器访问使能关闭了,后续对触摸按键功能配置的代码都是无效的:
截图202404241706396722.jpg
回复 支持 反对

使用道具 举报 送花

4

主题

5

回帖

54

积分

注册会员

积分
54
发表于 2024-4-25 16:41:27 | 显示全部楼层
乘风*** 发表于 2024-4-24 17:08
触摸按键寄存器是扩展寄存器,你把扩展寄存器访问使能关闭了,后续对触摸按键功能配置的代码都是无效的:
...

谢谢指点!
回复 支持 反对

使用道具 举报 送花

4

主题

5

回帖

54

积分

注册会员

积分
54
发表于 2024-4-25 16:45:10 | 显示全部楼层
乘风*** 发表于 2024-4-24 17:08
触摸按键寄存器是扩展寄存器,你把扩展寄存器访问使能关闭了,后续对触摸按键功能配置的代码都是无效的:
...

请问下,为什么,我串口输出按键值和零点值都是0

#include "main.h"
sbit LED_W = P3^3;
sbit LED_R = P3^4;
sbit BEE = P5^4;
unsigned int sys_tick=0;
unsigned int t0_count=0;
unsigned int t1_count=0;
unsigned int t2_count=0;
volatile bit busy;
unsigned char buffer;

u16        xdata TK_cnt;        // 按键计数值, 16位
u16        xdata TK_zero;        // 按键0点值, 16位
bit        KeyState;                        // 按键状态, 每个bit对应一个键, 1为按下, 0为释放
u8        read_cnt;                        // 读次数
bit        B_TK_Lowpass;                // 低通允许, 1允许, 0禁止

u8        cmd;        //串口命令
u8        T_KEY_FLAG = 0;        // 串口发送忙标志

u16 code T_KeyPress=1300;        //触摸后的变化值
u16 code T_KeyState=0x0001;        //16个键对应的状态, 0为未触摸,1为触摸



/***********************************************************
* @brief  串口1中断函数,串口1用于调试
* @return Null
***********************************************************/
void UartIsr() interrupt 4
{
    if (TI){
        TI = 0;
        busy = 0;
    }
    if (RI){
        RI = 0;
//        buffer= SBUF;
    }
}

//========================================================================
// 函数: void        TKSU_ISR(void) interrupt TKSU_VECTOR
// 描述: 触摸按键中断服务函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2023-10-11
// 备注:
u8        isr_index;

void        AUXR_ISR(void) interrupt 13
{
        u8 j;
        j=TSSTA2;

        if(j & 0x40)        //数据溢出, 错误处理(略)
        {
                TSSTA2 |= 0x40;        //写1清零
                T_KEY_FLAG |= 2;
        }
        else T_KEY_FLAG &= ~0x02;
       
        if(j & 0x80)        //扫描完成
        {
                TK_cnt = TSDAT;        //保存通道的读数        1.1us @24MHz               

                TSSTA2 |= 0x80;        //写1清零
                T_KEY_FLAG |= 0x08;
               
                LED_W = 0;//开灯
        }
        else {T_KEY_FLAG &= ~0x08;LED_W = 1;}
}

void main()
{
        P_SW2 |= 0x80;        //允许访问XSF(特殊功能寄存器)               
        P3n_push_pull(0x18);        //P3.3~P3.4线设置为推挽输出
        P5n_push_pull(0x10);        //P5.4线设置为推挽输出
        P1n_pure_input(0x01);        //P1.0 Touch Key设置为高阻
       
        Timer_Init();
       
       
        TSCHEN1 = 0x01;        //TK00~TK07       
        TSCHEN2 = 0x00;        //TK00~TK07               
        TSRT = 0x00;                //没有LED分时扫描       

        TSCFG1  = (3<<4) + 3;        //开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1)), 放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
        TSCFG2  = 1;//配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)  1(1/2)  2(5/8)  3(3/4)
        TSCTRL = 0x80;        //开始自动扫描, 无平均, B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
//        TSTH00H = 0xff;

        IE2 |= 0x80;                        //使能触摸中断       
        delay_ms(50);                //延时一下
       
//        key_init();
        EA = 1;          //开总中断
//    P_SW2 = 0x00;                   //这个一定要关掉不了会导致程序不能运行       
       
        B_TK_Lowpass = 0;        //禁止低通滤波       
        BEE = 0;       
        for(read_cnt=0; read_cnt<5; read_cnt++)        //扫描10次键, 将此值作为未触摸时的0点, 要求上电时不要触摸按键
        {
        //        TSCTRL = (1<<7) + (1<<6) +3;        //开始扫描, 4次平均
                TSCTRL = (1<<7) + (1<<6);                //开始扫描, 无平均
                delay_ms(50);        //延时一下, 等待扫描完成
        }
        TK_zero= TK_cnt;        //保存0点
        B_TK_Lowpass = 1;        //允许低通滤波
        KeyState = 0;
        read_cnt = 0;       
        printf("零点值:%u\n",TK_zero);       
        TSCTRL = 1<<7;                //开始扫描, 无平均       
        while(1)
        {
                delay_ms(500);                //延时一下, 根据实际扫描速度调整
                printf("按键值:%u\n",TSDAT);               
                printf("按键值:%u\n",TK_cnt);

                if(T_KEY_FLAG & 0x02)printf("数据溢出\n");       
                if(T_KEY_FLAG & 0x08)printf("扫描完成\n");                       
       
        }
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-4-25 16:51:26 | 显示全部楼层
qi*** 发表于 2024-4-25 16:45
请问下,为什么,我串口输出按键值和零点值都是0

#include "main.h"

用这个帖子里的例程试试吧,也是串口打印触摸值的。
https://www.stcaimcu.com/forum.p ... =3971&pid=51046
回复 支持 反对

使用道具 举报 送花

4

主题

5

回帖

54

积分

注册会员

积分
54
发表于 2024-4-25 17:06:59 | 显示全部楼层
乘风*** 发表于 2024-4-25 16:51
用这个帖子里的例程试试吧,也是串口打印触摸值的。
https://www.stcaimcu.com/forum.php?mod=redirect&g ...

不对的,他给的例程里面没有触摸例程
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-4-25 17:24:46 | 显示全部楼层
qi*** 发表于 2024-4-25 17:06
不对的,他给的例程里面没有触摸例程

这个例子本就是演示如何通过串口绘图工具描绘触摸按键值曲线的,怎么会没有触摸例程?你再仔细看看例子。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2024-5-6 11:36:33 | 显示全部楼层
请使用我的例程测试,中断读取的。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:46 , Processed in 0.169958 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表