数码之家

 找回密码
 立即注册
搜索
查看: 7336|回复: 14

[C51] STC8H单片机硬件触摸按键的简单实现(1)——官方例程与配置软件

[复制链接]
发表于 2022-11-9 12:15:19 | 显示全部楼层 |阅读模式
本帖最后由 慕名而来 于 2022-11-10 12:47 编辑

一直在玩STC单片机,最近看数据手册发现STC8H系列单片机中有3款尾缀带T的型号含有硬件触摸按键功能,型号分别是STC8H4K64TLCD、STC8H4K64TL、STC8H1K08T;而我最近用来驱动TFT屏的STC8H4K64TL正是其中的一款,于是开始试着玩一下,于是在网上下载了一个资料包,于是开始了各种测试。
网来资料如下:


资料里有一个例程看注释貌似官方例程,但我在STC8资料手册中并没有找到,既然找到了例程那么这个触摸按键就应该很容易实现了吧,于是开始读例程,结果越看头约大,前后弄了三四天虽然配合数据手册看懂了一些必要的配置步骤,但仍然有很多东西不懂用意。另外,资料里还有一个触摸按键的配置软件,这个软件的使用方法在资料手册中是有详细介绍的,原本以为搭好电路、设置好各个选项就可以通过这个软件获取相应参数了,但不幸的是我无论怎弄都无法获取数据,(详见下图)百度了好久竟然找不到有关这个软件的使用案例。
资料手册中的样例是这样的:



不会使用配置软件无法获取数据时是这样的:



如果有高手懂得这个软件的用法也真心的希望能指点一下,先谢了。

既然搞不懂例程、也玩不转配置软件,就只能自己写代码了,感觉既然是触摸按键,那么按键的触摸与否势必会有不同的数据变化,只要找出这个数据变化的规律也就可以实现按键的状态查询了,至于配置软件中的0值、差值等等参数既然搞不懂就先搁置算了,按键电路如下图:



我的电路中:C?=103瓷片电容,R?=1K,触摸按键焊盘用φ8mm的LED灯盘磁贴脚代替。

接下来编写按键配置代码和串口通讯代码封装成一个按键测试工程来检查按键的键值:
代码如下:

  1. #include "STC8H.h" //包含了u8、u16、u32的定义
  2. #include <intrins.h>

  3. sbit led=P1^0;
  4. u16 key_data;
  5. u8 dat_H,dat_L;
  6. //-------------------------------------------
  7. void delay_ms(u16 value)
  8. {
  9.     u8 i,j;
  10.     while(value>0)
  11.     {
  12.         _nop_();
  13.         _nop_();
  14.         _nop_();
  15.         i = 11;
  16.         j = 190;
  17.         do
  18.         {
  19.             while (--j);
  20.         }
  21.         while (--i);
  22.         value--;
  23.     }
  24. }
  25. //----串口初始化函数--------------------------
  26. //本函数由STC_ISP软件生成
  27. void UART_Init()
  28. {
  29. //9600bps@11.0592MHz
  30.     SCON = 0x50;                //8位数据,可变波特率
  31.     AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  32.     AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  33.     TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
  34.     TL1 = 0xE0;                //设定定时初值
  35.     TH1 = 0xFE;                //设定定时初值
  36.     ET1 = 0;                //禁止定时器1中断
  37.     TR1 = 1;                //启动定时器1

  38. }
  39. //----串口发送数据函数---------------------
  40. void SendASC(unsigned char mydata)
  41. {
  42.     SBUF=mydata;
  43.     while(!TI);
  44.     TI=0;
  45. }

  46. //----触摸按键初始化函数-------------------
  47. void key_init()
  48. {
  49.     P_SW2 |= 0x80;                //允许访问XFR
  50.     TSRT = 0x00;//没有LED分时扫描
  51.     TSCHEN1 = 0x02;//仅使能TK01(P1.1)
  52.     TSCHEN2 = 0x00;//其他按键没有使用
  53.     TSCFG1  = 0x77;//01110111=放电时间7500个时钟//(7<<4) + 6;          //开关电容工作频率 = fosc/(2*(TSCFG1[6:4]+1)), 放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
  54.     TSCFG2  = 2;//配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)  1(1/2)  2(5/8)  3(3/4)
  55.     TSCTRL = 0x80;//使能触摸按键功能、自动重复扫描按键、不等待标志清零、使用内部32K晶振、不使能16位比较器、不使能低功耗唤醒、单次扫描1次
  56. //B7:TSGO=1使能触摸按键
  57. //B6:SINGLE=1单次扫描模式、=0自动重复扫描
  58. //B5:TSWAIT=1完成一轮扫描后、TSIF 被硬件置 1,此时触摸按键控制器会暂停扫描,直到 TSIF 标志位被清 0后才开始下一轮的扫描
  59. //B4:TSWUCS=0使用内部32K晶振
  60. //B3:TSDCEN=0不使能16位比较器
  61. //B2:TSWUEN=1使能低功耗唤醒功能
  62. //B1B0:TSSAMP=11单次按键扫描4次
  63.     P_SW2 &= ~0x80;                   //禁止访问XFR
  64.    // IE2 |= 0x80;
  65. }
  66. //----触摸按键键值采集函数------------------
  67. //本案实测未触摸值大于5、触摸后值小于1
  68. void Read_Key_value(void)
  69. {
  70.     u8 j;
  71.     u16 i;
  72.     P_SW2 |= 0x80;
  73.     j = TSSTA2;
  74.     if(j & 0x40)        //数据溢出, 错误处理(略)
  75.     {
  76.         TSSTA2 |= 0x40; //写1清零
  77.     }
  78.     if(j & 0x80)        //扫描完成
  79.     {
  80.         TSSTA2 |= 0x80; //写1清零
  81.         for(i=0; i<500; i++)
  82.         {
  83.             key_data=TSDAT;
  84.         }
  85.         dat_H=key_data>>8;        //获取键值的高8位数值
  86.                 dat_L=key_data;                //获取键值的低8位数值
  87.     }
  88.     P_SW2 &= ~0x80;
  89. }
  90. //----主函数-----------------------------
  91. void main(void)
  92. {

  93.     P1M1=0x00;
  94.     P1M0=0x00;
  95.     P3M1=0x00;
  96.     P3M0=0x00;
  97.     P5M1=0x00;
  98.     P5M0=0x00;
  99.     UART_Init();
  100.         key_init();
  101.     led=1;
  102.     while(1)
  103.     {
  104.         Read_Key_value();
  105.         SendASC(0xFF); //发送数据头标志
  106.             delay_ms(10);
  107.         SendASC(dat_H);//发送高8位数据
  108.             delay_ms(10);
  109.         SendASC(dat_L);//发送低8位数据
  110.         delay_ms(200);
  111.     }
  112. }
复制代码



检测结果如下图:



看上述串口数据中按键被触摸和按键未被触摸时数据是有变化的,如果纠结于整体16位数据的变化会发现很少有完全一致的重复数据,那么通过那个范围的数据来判断按键的状态呢?且看
下一篇文字:“STC8H单片机硬件触摸按键的简单实现(2)——代码分享”。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +10 收起 理由
玛德陛下 + 10 謝謝分享

查看全部打赏

 楼主| 发表于 2022-11-9 12:27:10 | 显示全部楼层
如果测试上述代码,请在头文件中添加如下定义:

  1. typedef unsigned char u8;
  2. typedef unsigned int u16;
  3. typedef unsigned long u32;
复制代码



回复 支持 反对

使用道具 举报

发表于 2022-11-9 13:19:47 | 显示全部楼层
遗憾的是我不会单片机,羡慕会的人
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-9 13:52:46 | 显示全部楼层
wxhjsr 发表于 2022-11-9 13:19
遗憾的是我不会单片机,羡慕会的人

我也是因为感兴趣就百度资料学习了一点单片机的简单应用,不是干专业的也学不了太深,其实简单应用挺好上手的。
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2022-11-9 14:05:10 | 显示全部楼层
可以参考下,官网STC  AI的视频演示区域:触摸按键串口配置例程及配套上位机软件使用演示
回复 支持 反对

使用道具 举报

发表于 2022-11-9 14:43:08 来自手机浏览器 | 显示全部楼层
这系列直接上图形化拖拽就可以实现了…
回复 支持 反对

使用道具 举报

发表于 2022-11-9 16:18:00 | 显示全部楼层
好东西,不知道什么时候投放市场考验考验?
回复 支持 反对

使用道具 举报

发表于 2022-11-9 16:32:44 | 显示全部楼层
做点有意思的东西,时钟,日历 的啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-9 22:17:24 | 显示全部楼层
疯狂的兔子来了 发表于 2022-11-9 14:05
可以参考下,官网STC  AI的视频演示区域:触摸按键串口配置例程及配套上位机软件使用演示 ...

我在官网上没能找到你说的区域,可否提供一个连接或者在www.STCMCUDATA.com中进入该版块的方法。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-9 22:19:52 | 显示全部楼层
触景情伤 发表于 2022-11-9 14:43
这系列直接上图形化拖拽就可以实现了…

也是我闲来无事玩玩这个触摸按键,发现它挺简单的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-9 22:25:14 | 显示全部楼层
dengdai510 发表于 2022-11-9 16:18
好东西,不知道什么时候投放市场考验考验?

我就是某宝买了几片STC8H的20脚芯片玩的。最近STC有免费申请活动的,感兴趣的话可以去试试。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-9 22:36:04 | 显示全部楼层
玛德陛下 发表于 2022-11-9 16:32
做点有意思的东西,时钟,日历 的啊

哈哈真是老朋友了,都知道我就喜欢玩日历、时钟这些,或许这个触摸按键真的可以用到时钟日历上,但现在做的wifi授时时钟可以免按键了。
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2022-11-10 09:56:45 | 显示全部楼层
慕名而来 发表于 2022-11-9 22:36
哈哈真是老朋友了,都知道我就喜欢玩日历、时钟这些,或许这个触摸按键真的可以用到时钟日历上, ...

硬件LCD段码驱动显示程序,硬件实时时钟演示程序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-10 12:43:03 | 显示全部楼层
疯狂的兔子来了 发表于 2022-11-10 09:56
硬件LCD段码驱动显示程序,硬件实时时钟演示程序

多谢你分享的资料,只是我在此前已经调通了STC8H4K64TL芯片的内部RTC并且在TFT上也可以正常运行了,稍后也会分享代码的。
回复 支持 反对

使用道具 举报

发表于 2023-4-18 21:28:21 | 显示全部楼层


现在触摸按键MCU, STC8H4K64TL是演示程序多了些

深圳国芯人工智能有限公司-核心功能实验板 (stcai.com)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-4 02:06 , Processed in 0.234001 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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