找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9864|回复: 4
打印 上一主题 下一主题
收起左侧

STC8G1K08T单片机触摸按键应用程序与原理图

  [复制链接]
跳转到指定楼层
楼主

  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited -------------------------------*/
  3. /* --- STC 1T Series MCU RC Demo -----------------------------------*/
  4. /* If you want to use the program or the program referenced in the  */
  5. /* article, please specify in which data and procedures from STC    */
  6. /*------------------------------------------------------------------*/


  7. /*********************************************************/

  8. #define MAIN_Fosc        11059200L        //定义主时钟

  9. #include        "..\..\STC8Gxxx.h"


  10. /*************        功能说明        **************
  11. 请先别修改程序, 直接下载HEX文件测试, 下载时选择主频11.0592MHz.

  12. 本程序支持11个按键, 触摸按键简单处理和识别:

  13. P1.0(TK07)   P1.1(TK06)   P1.3(TK04)   P1.4(TK03)   P1.5(TK02)   P1.6(TK01)   P5.4(TK00)
  14. P3.2(TK13)   P3.3(TK12)   P3.4(TK11)   P3.5(TK10)

  15. P3.6为触摸指示, 当按键触摸时, 输出低电平点亮LED, 不触摸时LED灭.
  16. P3.0 P3.1为串口1, 当有触摸动作时, 串口返回触摸的键码(ASCII码 00~15 对应TK00~TK15).
  17. 往串口发送字符'R'或'r', 返回各个按键的读数值.

  18. 本例测试板的参考电容为333(0.033uF), TK00~TK07触摸时读数会降低2000左右, TK08~TK15触摸时读数会降低3000左右.
  19. 上电后先读键200次但不处理键, 然后将此时的读数作为0点.


  20. ******************************************/


  21. /*************        本地常量声明        **************/



  22. /*************        本地变量声明        **************/
  23. bit        B_TX1_Busy;        // 发送忙标志

  24. u16        idata TK_cnt[16];
  25. u8        read_cnt;
  26. u8        cmd;
  27. u16        idata TK_zero[16];


  28. /*************        本地函数声明        **************/
  29. void        UART1_config(u32 brt, u8 io);        // brt: 通信波特率. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7, =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
  30. void         UART1_PrintString(u8 *puts);
  31. void         UART1_TxByte(u8 dat);
  32. void        ReturnValue(u8 ch);
  33. void         Readkey(void);



  34. /****************  外部函数声明和外部变量声明 *****************/


  35. /******************** 主函数 **************************/
  36. void main(void)
  37. {
  38.         u8        i;
  39.         
  40.         P3n_standard(0xc3);
  41.         UART1_config(115200L, 0);                // brt: 通信波特率. io=0: 串口1切换到P3.0 P3.1
  42.         EA = 1;                //允许全局中断
  43.         UART1_PrintString("11个触摸按键测试程序\r\n");

  44.         P_SW2 |= 0x80;        //允许访问XSF

  45. //        XOSCCR = 0xc0;                              //启动外部晶振
  46. //        while (!(XOSCCR & 1));                      //等待时钟稳定
  47. //        CLKDIV = 0x00;                              //时钟不分频
  48. //        CKSEL = 0x01;                               //选择外部晶振

  49.         TSRT = 0x00;                //没有LED分时扫描
  50.         TSCHEN1 = 0xdf;        //TK00~TK04, TK05, TK06, TK07
  51.         TSCHEN2 = 0x3c;        //TK10~TK13
  52.         TSCFG1  = (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
  53.         TSCFG2  = 1;                        //配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)  1(1/2)  2(5/8)  3(3/4)
  54.         TSCTRL = (1<<7);                        //开始自动扫描, 无平均, B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
  55. //        TSCTRL = (1<<7) + (1<<6);        //开始单次扫描, 无平均
  56. //        TSCTRL = (1<<7) + (1<<6)+3;        //开始单次扫描, 4次平均
  57. //        TSCTRL = (1<<7) + (1<<6)+1;        //开始单次扫描, 2次平均
  58.         
  59. //        P_SW2 &= ~0x80;                //禁止访问xsf


  60.         for(read_cnt=0; read_cnt<200; )        Readkey();                //读200次键, 将此值作为未触摸时的0点, 要求上电时不要触摸按键
  61.         for(i=0; i<16; i++)                TK_zero[i] = TK_cnt[i];        //保存0点

  62.         
  63.         while (1)
  64.         {
  65.                 Readkey();
  66.                 if(read_cnt >= 50)        //控制检测按键的速度
  67.                 {
  68.                         read_cnt = 0;
  69.                         P36 = 1;        //灭LED
  70.                         for(i=0; i<8; i++)
  71.                         {
  72.                                 if(TK_cnt[i] <= (TK_zero[i]-1000))        //TK00~TK07触摸时读数会降低2000左右, 则(0点-1000)为判断键的阈值.
  73.                                 {
  74.                                         if(i != 5)        //TK05无效
  75.                                         {
  76.                                                 UART1_TxByte(i/10+'0');                //键按下, 则返回键号
  77.                                                 UART1_TxByte(i%10+'0');
  78.                                                 UART1_TxByte(0x0d);
  79.                                                 UART1_TxByte(0x0a);
  80.                                                 P36 = 0;        //亮LED
  81.                                         }
  82.                                 }
  83.                         }
  84.                         for(i=10; i<14; i++)
  85.                         {
  86.                                 if(TK_cnt[i] <= (TK_zero[i]-1500))                //TK08~TK15触摸时读数会降低3000左右, 则(0点-1000)为判断键的阈值.
  87.                                 {
  88.                                         UART1_TxByte(i/10+'0');                //键按下, 则返回键号
  89.                                         UART1_TxByte(i%10+'0');
  90.                                         UART1_TxByte(0x0d);
  91.                                         UART1_TxByte(0x0a);
  92.                                         P36 = 0;        //亮LED
  93.                                 }
  94.                         }
  95.                 }
  96.                
  97.                
  98.                 if((cmd == 'R') || (cmd == 'r'))        //串口请求返回信息
  99.                 {
  100.                         for(i=0; i<16; i++)        ReturnValue(i);        //返回各个通道的读数
  101.                         cmd  = 0;
  102.                 }
  103.         }
  104. }
  105. /**********************************************/
  106.   
  107. //========================================================================
  108. // 函数: void        ReturnValue(u8 ch)
  109. // 描述: 返回一个通道的读数。
  110. // 参数: ch: 通道数.
  111. // 返回: none.
  112. // 版本: VER1.0
  113. // 日期: 2010-12-15
  114. // 备注:
  115. //========================================================================
  116. void        ReturnValue(u8 ch)
  117. {
  118.         u16        j;
  119.         j = TK_cnt[ch];
  120.         UART1_TxByte('K');
  121.         UART1_TxByte(ch/10+'0');
  122.         UART1_TxByte(ch%10+'0');
  123.         UART1_TxByte('=');
  124.         UART1_TxByte(j / 10000 + '0');
  125.         UART1_TxByte((j % 10000)/1000 + '0');
  126.         UART1_TxByte((j % 1000)/100 + '0');
  127.         UART1_TxByte((j % 100)/10 + '0');
  128.         UART1_TxByte(j % 10 + '0');
  129.         UART1_TxByte(0x0d);
  130.         UART1_TxByte(0x0a);
  131. }

  132. //========================================================================
  133. // 函数: void Readkey(void)
  134. // 描述: 读一个键的读数。
  135. // 参数: none.
  136. // 返回: none.
  137. // 版本: VER1.0
  138. // 日期: 2010-12-15
  139. // 备注:
  140. //========================================================================
  141. void Readkey(void)
  142. {
  143.         u8        j;

  144.         j = TSSTA2;

  145.         if(j & 0x40)        //数据溢出, 错误处理(略)
  146.         {
  147.                 TSSTA2 |= 0x40;        //写1清零
  148.         }
  149.         if(j & 0x80)        //扫描完成
  150.         {
  151.                 TSSTA2 |= 0x80;        //写1清零
  152.                 TK_cnt[j & 0x0f] = TSDAT;        //保存某个通道的读数
  153.                 read_cnt++;                //读次数+1, 用于延时或读键计数
  154.         }
  155. }


  156. //========================================================================
  157. // 函数: void        UART1_config(u32 brt, u8 timer, u8 io)
  158. // 描述: UART1初始化函数。
  159. // 参数:   brt: 通信波特率.
  160. //       timer: 波特率使用的定时器, timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率.
  161. //          io: 串口1切换到的IO,  io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7, =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
  162. // 返回: none.
  163. // 版本: VER1.0
  164. // 日期: 2018-4-2
  165. // 备注:
  166. //========================================================================
  167. void        UART1_config(u32 brt, u8 io)        // brt: 通信波特率,  timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7, =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
  168. {
  169.         brt = 65536UL - (MAIN_Fosc / 4) / brt;
  170.         TR1 = 0;
  171.         AUXR &= ~0x01;                //S1 BRT Use Timer1;
  172.         AUXR |=  (1<<6);        //Timer1 set as 1T mode
  173.         TMOD &= ~(1<<6);        //Timer1 set As Timer
  174.         TMOD &= ~0x30;                //Timer1_16bitAutoReload;
  175.         TH1 = (u8)(brt >> 8);
  176.         TL1 = (u8)brt;
  177.         ET1 = 0;                        // 禁止Timer1中断
  178.         INT_CLKO &= ~0x02;        // Timer1不输出高速时钟
  179.         TR1  = 1;                        // 运行Timer1

  180. //                 if(io == 1)        {S1_USE_P32P33();        P3n_standard(0x0c);}        //切换到 P3.2 P3.3        用于8脚MCU
  181. //        else if(io == 2)        {S1_USE_P54P53();        P5n_standard(0x18);}        //切换到 P5.4 P5.3        用于8脚MCU
  182.                  if(io == 1)        {S1_USE_P36P37();        P3n_standard(0xc0);}        //切换到 P3.6 P3.7
  183.         else if(io == 2)        {S1_USE_P16P17();        P1n_standard(0xc0);}        //切换到 P1.6 P1.7
  184.         else if(io == 3)        {S1_USE_P43P44();        P4n_standard(0x18);}        //切换到 P4.3 P4.4
  185.         else                                {S1_USE_P30P31();        P3n_standard(0x03);}        //切换到 P3.0 P3.1

  186.         SCON = (SCON & 0x3f) | (1<<6);        // 8位数据, 1位起始位, 1位停止位, 无校验
  187. //        PS  = 1;        //高优先级中断
  188.         ES  = 1;        //允许中断
  189.         REN = 1;        //允许接收
  190. }



  191. //========================================================================
  192. // 函数: void UART1_TxByte(u8 dat)
  193. // 描述: 串口1发送一个字节函数
  194. // 参数: dat: 要发送的数据.
  195. // 返回: none.
  196. // 版本: VER1.0
  197. // 日期: 2018-4-2
  198. // 备注:
  199. //========================================================================
  200. void UART1_TxByte(u8 dat)
  201. {
  202.         B_TX1_Busy = 1;                //标志发送忙
  203.         SBUF = dat;                        //发一个字节
  204.         while(B_TX1_Busy);        //等待发送完成
  205. }

  206. //========================================================================
  207. // 函数: void UART1_PrintString(u8 *puts)
  208. // 描述: 串口1字符串打印函数
  209. // 参数: puts: 字符串指针.
  210. // 返回: none.
  211. // 版本: VER1.0
  212. // 日期: 2018-4-2
  213. // 备注:
  214. //========================================================================
  215. void UART1_PrintString(u8 *puts)
  216. {
  217.     for (; *puts != 0;        puts++)
  218.         {
  219.                 UART1_TxByte(*puts);
  220.         }
  221. }


  222. //========================================================================
  223. // 函数: void UART1_int (void) interrupt UART1_VECTOR
  224. // 描述: 串口1中断函数
  225. // 参数: none.
  226. // 返回: none.
  227. // 版本: VER1.0
  228. // 日期: 2018-4-2
  229. // 备注:
  230. //========================================================================
  231. void UART1_int (void) interrupt UART1_VECTOR
  232. {
  233.         if(RI)
  234.         {
  235.                 RI = 0;
  236.                 cmd = SBUF;
  237.         }

  238.         if(TI)
  239.         {
  240.                 TI = 0;
  241.                 B_TX1_Busy = 0;
  242.         }
  243. }
复制代码

Keil代码工程下载: STC8G1K08T-触摸按键与LED自动扫描相关程序.7z (154.73 KB, 下载次数: 203)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1035652 发表于 2022-6-20 12:13 | 只看该作者
支持楼主,666,下载下来看看。
回复

使用道具 举报

板凳
ID:64253 发表于 2022-7-15 15:40 | 只看该作者
支持,下来看看具体内容
回复

使用道具 举报

地板
ID:405591 发表于 2022-9-5 11:03 | 只看该作者
感谢,正在调试这块
回复

使用道具 举报

5#
ID:1016023 发表于 2022-9-26 14:29 | 只看该作者
您好,请教一下写代码的思路?   用STC8T1K08T这颗芯片触摸开关  控制WS2812 RGB灯的颜色
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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