找回密码
 立即注册
查看: 21|回复: 2

请教一下大佬们关于STC8H的触摸按键是如何配置使用的?

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-06-28 11:57:34
已绑定手机

1

主题

1

回帖

11

积分

新手上路

积分
11
发表于 昨天 11:57 | 显示全部楼层 |阅读模式
我按照数据手册配置好相关寄存器之后,从触摸按键中断返回TSDAT寄存器的值,但是使用串口输出显示的都是0,这是为什么呢?

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:454
  • 最近打卡:2025-06-28 21:18:20
已绑定手机

40

主题

2079

回帖

7167

积分

论坛元老

积分
7167
发表于 昨天 21:20 | 显示全部楼层
这个帖子里有例子跟配套的使用演示视频可参考:
https://www.stcaimcu.com/forum.p ... =3971&pid=51046
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:481
  • 最近打卡:2025-06-29 12:34:20
已绑定手机

80

主题

5218

回帖

9317

积分

超级版主

DebugLab

积分
9317
发表于 17 分钟前 | 显示全部楼层
初始化:
打开EAXFR
P_SW2|=EAXFR;
设置IO模式,触摸按键IO设置为高阻(以“AI8H4K64TLCD-触摸按键段式LCD实验板”为例,具体值需要根据硬件修改)
P0M0=0x00;
P0M1=0xFF;
P1M0=0x02;
P1M1=0xFC;
P2M0=0x00;
P2M1=0xFF;
P3M0=0x02;
P3M1=0xFC;
P4M0=0x00;
P4M1=0xFF;
P5M0=0x00;
P5M1=0xFF;
P6M0=0xE8;
P6M1=0x07;
P7M0=0x00;
P7M1=0xFF;
启动外部32768Hz晶振(也可使用内部32K时钟,如果使用外部晶振,前面的IO设置,晶振IO也要设置为高阻,如需要进入省电模式,还要关闭数字输入)
X32KCR=0xC0; //启动外部32768晶振,设置高增益
while(!(X32KCR&0x01)); //等待时钟稳定
设置触摸按键通道使能
TSCHEN1=0xFC; //TK00~TK07
TSCHEN2=0xFC; //TK08~TK15
设置LED分时扫描
TSRT=0x00;                //没有LED分时扫描
设置触摸按键配置寄存器
TSCFG1=0x73;        //开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1)),放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
TSCFG2=0x03;        //配置触摸按键控制器的内部参考电压(AVCC的分压比),0(1/4)  1(1/2)  2(5/8)  3(3/4)

设置触摸按键控制寄存器
TSCTRL=0x33;        //重复扫描模式,完成一轮扫描暂停,低功耗模式时钟为外部32768晶振,关闭数字比较器,关闭低功耗唤醒,4次平均,B7: TSGO,B6: SINGLE,B5: TSWAIT,B4: TSWUCS,B3: TSDCEN,B2: TSWUEN,B1 B0: TSSAMP
设置触摸按键控制寄存器,开始扫描
TSCTRL|=0x80;        //开始扫描
启用触摸中断
IE2|=0x80;                //启用触摸中断
启用总中断
EA=1;                        //启用总中断
中断:
具体功能看注释
void TKSU_Isr(void) interrupt TKSU_VECTOR
{
        unsigned char temp;
        temp=TSSTA2;
        if(temp&0x40)                                                                //数据溢出, 错误处理
        {
                TSSTA2|=0x40;                                                        //写1清零
        }
        else if(temp&0x80)                                                        //扫描完成
        {
                TS_Scan=temp&0x0f;
                if(TS_Map[TS_Scan]!=0xFF)                                //如果通道正确
                {
                        TS_Buf[0][TS_Map[TS_Scan]]=TSDAT;        //保存某个通道的读数
                        TS_Flag=1;
                }
        }
        TSSTA2|=0x80;                                                                //写1清零
}




DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-29 12:51 , Processed in 0.145211 second(s), 59 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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