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

开启数码管扫功能,触摸键不扫描了(已解决)

[复制链接]
已绑定手机

5

主题

8

回帖

53

积分

注册会员

积分
53
发表于 2025-2-14 11:33:23 | 显示全部楼层 |阅读模式
您好,我现在开启数码管扫功能,触摸键不扫描了。单独测试数码管功能,和触摸键功能都是ok的。可能是哪里的问题?

数码管初始化



    P2n_push_pull(0x3f);    //COM0~COM5线设置为推挽输出
    P4n_push_pull(0xff);    //SEG0~SEG7(P4.0~P4.7)线设置为推挽输出
    P0n_push_pull(0x07);    //SEG8~SEG10(P0.0~P0.2)线设置为推挽输出

    P2DR &= ~0x3f;    //配置为大电流输出,否则数值闪烁时,状态灯会有亮度变化
    COMEN  = 0x3f;    //允许  COM0~COM5
    SEGENL = 0xff;    //允许8个SEG 低字节
    SEGENH = 0x07;    //允许3个SEG 高字节
    LEDCTRL = 0x80 + (1<<4) + 5;    //屏蔽这个触摸键正常
    LEDCKS = 40; //扫码频率70hz


触摸按键初始化

       P1n_pure_input(0x1B);        //Touch Key设置为高阻   p1.0-tk0 p1.1-tk1 p1.3-tk3 p1.4-tk4
        P5n_pure_input(0x10);   //Touch Key设置为高阻   p5.4-tk2
       P1IE = ~0x1B;                        //禁止触摸按键的数字输入
        P5IE = ~0x10;                        //禁止触摸按键的数字输入
   
        TSCHEN1 = 0x1f;     //TK00~TK07 (低功耗模式建议只保留一个触摸按键做唤醒用,其它按键的触摸功能禁用以降低功耗)
        TSCHEN2 = 0x00;     //TK08~TK15
        TSCFG1  = (7<<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  = 2;//配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)  1(1/2)  2(5/8)  3(3/4)
        TSCTRL = (1<<7);//开始自动扫描, 无平均, B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
    TSRT = 0x00;                //没有LED分时扫描
    TSWUTC = 128;        //唤醒频率 = F32K/(32*8*TSWUTC[7:0]) = 128/TSWUTC[7:0] Hz, TSWUTC = 1~255
        IE2 |= 0x80;                //使能触摸中断
    IRC32KCR = 0x80;                            //启动内部32K IRC
    while (!(IRC32KCR & 1));                    //等待时钟稳定

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-2-14 14:16:13 | 显示全部楼层
您好,请提供原理图PDF(以确定数码管和触摸按键的扫描方式),截图也可,请保证完整且清晰,不要使用手机拍屏幕
受PCB设计影响较大的功能(如ADC和触摸按键)和可能存在生产、制造、结构、焊接等问题的,请提供PCB图或实物照片

DebugLab
回复 支持 反对

使用道具 举报 送花

已绑定手机

5

主题

8

回帖

53

积分

注册会员

积分
53
发表于 2025-2-14 15:00:00 | 显示全部楼层
Debu*** 发表于 2025-2-14 14:16
您好,请提供原理图PDF(以确定数码管和触摸按键的扫描方式),截图也可,请保证完整且清晰,不要使用手机 ...

原理图如下,触摸键用到TK0-TK4。数码管用到COM0-COM5,SEG0-SEG10。目前这个两个功能单独调试都没问题,开了LED扫描,触摸按键的中断就进不去了,导致触摸按键就没法用了。

主控和触摸按键

主控和触摸按键

数码管

数码管

点评

没有使用IO复用分时扫描,LED驱动器和触摸按键不应该冲突  详情 回复 发表于 2025-2-14 15:14
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-2-14 15:14:37 | 显示全部楼层
mor*** 发表于 2025-2-14 15:00
原理图如下,触摸键用到TK0-TK4。数码管用到COM0-COM5,SEG0-SEG10。目前这个两个功能单独调试都没问题,开 ...

没有使用IO复用分时扫描,LED驱动器和触摸按键不应该冲突
DebugLab
回复 支持 反对

使用道具 举报 送花

已绑定手机

5

主题

8

回帖

53

积分

注册会员

积分
53
发表于 2025-2-14 15:45:11 | 显示全部楼层
Debu*** 发表于 2025-2-14 15:14
没有使用IO复用分时扫描,LED驱动器和触摸按键不应该冲突

是的,就是不知道哪里出了问题,开LED,触摸按键就用不了

点评

我当时试过这个功能,没有问题的,就是开了LED驱动后对触摸按键干扰大了点,但也是可以使用的,我去找找程序给您参考一下  详情 回复 发表于 2025-2-14 16:06
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-2-14 16:06:23 | 显示全部楼层
mor*** 发表于 2025-2-14 15:45
是的,就是不知道哪里出了问题,开LED,触摸按键就用不了

我当时试过这个功能,没有问题的,就是开了LED驱动后对触摸按键干扰大了点,但也是可以使用的,我去找找程序给您参考一下
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-2-14 16:36:07 | 显示全部楼层
  1. #include <STC8H.H>
  2. #include "define.h"
  3. #include <intrins.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <absacc.h>
  7. #define LED0 P50
  8. #define LED1 P51
  9. #define LED2 P04
  10. #define LED3 P52
  11. #define LED4 P07
  12. #define LED5 P06
  13. #define LED6 P05
  14. #define LED7 P53
  15. #define TSK0 P54
  16. #define TSK1 P13
  17. #define TSK2 P17
  18. #define TSK3 P16
  19. #define TSK4 P15
  20. #define TSK5 P14
  21. #define TSK6 P11
  22. #define TSK7 P10
  23. #define COM0 P20
  24. #define COM1 P21
  25. #define COM2 P22
  26. #define COM3 P23
  27. #define COM4 P24
  28. #define COM5 P25
  29. #define COM6 P26
  30. #define COM7 P27
  31. #define SEG0 P40
  32. #define SEG1 P41
  33. #define SEG2 P42
  34. #define SEG3 P43
  35. #define SEG4 P44
  36. #define SEG5 P45
  37. #define SEG6 P46
  38. #define SEG7 P47
  39. #define SEG8 P00
  40. #define SEG9 P01
  41. #define SEGA P02
  42. #define SEGB P03
  43. #define SEGC P34
  44. #define SEGD P35
  45. #define SEGE P36
  46. #define SEGF P37
  47. #define                FOSC                11059200UL
  48. #define                BAUD                115200UL
  49. #define                BRT                        (0x10000-FOSC/BAUD/4)
  50. bit Key_Flag;
  51. unsigned char Uart_Send_Lenth,RP,Key,Offset_Bit,Offset_String;
  52. unsigned int Key_Value[8],Key_Test[8];
  53. unsigned char xdata T_Buffer[50],R_Buffer[16];
  54. unsigned char code Key_Map[8]={7,6,0,1,5,4,3,2};
  55. unsigned char code Hex_to_Ascii[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
  56. //unsigned char code BMP[][16][2]=
  57. //{
  58. //        #include <0.h>
  59. //};
  60. unsigned char code String[][16][2]=
  61. {
  62.         #include <0.h>
  63. };
  64. /*----------------------------延时10us@STC-Y6@11.0592MHz----------------------------*/
  65. //void Delay_10us(void)
  66. //{
  67. //        unsigned char i;
  68. //        i=35;
  69. //        while(--i);
  70. //}
  71. /*----------------------------延时x10us----------------------------*/
  72. //void Delay_x10us(unsigned char x)
  73. //{
  74. //        while(x--)
  75. //                Delay_10us();
  76. //}
  77. /*----------------------------延时10ms@STC-Y6@11.0592MHz----------------------------*/
  78. void Delay_10ms(void)
  79. {
  80.         unsigned char i,j;
  81.         _nop_();
  82.         _nop_();
  83.         i=144;
  84.         j=157;
  85.         do
  86.         {
  87.                 while(--j);
  88.         }while(--i);
  89. }
  90. /*----------------------------延时x10ms----------------------------*/
  91. void Delay_x10ms(unsigned char x)
  92. {
  93.         while(x--)
  94.                 Delay_10ms();
  95. }
  96. void LED_Driver(unsigned char temp)
  97. {
  98.         LED0=temp&0x01;
  99.         LED1=temp&0x02;
  100.         LED2=temp&0x04;
  101.         LED3=temp&0x08;
  102.         LED4=temp&0x10;
  103.         LED5=temp&0x20;
  104.         LED6=temp&0x40;
  105.         LED7=temp&0x80;
  106. }
  107. //void Display_BMP(unsigned char temp)
  108. //{
  109. //        unsigned char i;
  110. //        unsigned char xdata *p=(unsigned char xdata *)0xfb10;
  111. //        for(i=0;i<8;i++)
  112. //        {
  113. //                *(p+i)=BMP[temp][i][0];
  114. //                *(p+8+i)=BMP[temp][i][1];
  115. //                *(p+16+i)=BMP[temp][i+8][0];
  116. //                *(p+24+i)=BMP[temp][i+8][1];
  117. //        }
  118. //}
  119. void Display_String(void)
  120. {
  121.         unsigned char i;
  122.         unsigned char xdata *p=XBYTE+0xfb10;
  123.         for(i=0;i<8;i++)
  124.         {
  125.                 *(p+i)=Offset_Bit<8?(String[Offset_String][i][0]>>Offset_Bit)|(String[Offset_String][i][1]<<(8-Offset_Bit)):(String[Offset_String][i][1]>>Offset_Bit-8)|(String[Offset_String+1][i][0]<<(8-(Offset_Bit-8)));
  126.                 *(p+8+i)=Offset_Bit<8?(String[Offset_String][i][1]>>Offset_Bit)|(String[Offset_String+1][i][0]<<(8-Offset_Bit)):(String[Offset_String+1][i][0]>>Offset_Bit-8)|(String[Offset_String+1][i][1]<<(8-(Offset_Bit-8)));
  127.                 *(p+16+i)=Offset_Bit<8?(String[Offset_String][i+8][0]>>Offset_Bit)|(String[Offset_String][i+8][1]<<(8-Offset_Bit)):(String[Offset_String][i+8][1]>>Offset_Bit-8)|(String[Offset_String+1][i+8][0]<<(8-(Offset_Bit-8)));
  128.                 *(p+24+i)=Offset_Bit<8?(String[Offset_String][i+8][1]>>Offset_Bit)|(String[Offset_String+1][i+8][0]<<(8-Offset_Bit)):(String[Offset_String+1][i+8][0]>>Offset_Bit-8)|(String[Offset_String+1][i+8][1]<<(8-(Offset_Bit-8)));
  129.         }
  130. }
  131. void Send_Value(void)
  132. {
  133.         unsigned char i;
  134.         if(Uart_Send_Lenth==0)
  135.         {
  136.                 for(i=0;i<8;i++)
  137.                 {
  138.                         T_Buffer[i*6]=Hex_to_Ascii[Key_Value[i]/10000];
  139.                         T_Buffer[i*6+1]=Hex_to_Ascii[Key_Value[i]%10000/1000];
  140.                         T_Buffer[i*6+2]=Hex_to_Ascii[Key_Value[i]%1000/100];
  141.                         T_Buffer[i*6+3]=Hex_to_Ascii[Key_Value[i]%100/10];
  142.                         T_Buffer[i*6+4]=Hex_to_Ascii[Key_Value[i]%10];
  143.                         T_Buffer[i*6+5]=' ';
  144.                 }
  145.                 T_Buffer[48]='\r';
  146.                 T_Buffer[49]='\n';
  147.                 Uart_Send_Lenth=50;
  148.                 TI=1;
  149.         }
  150. }
  151. void Init(void)
  152. {
  153.         P_SW2|=EAXFR;
  154.         LED0=0;
  155.         LED1=0;
  156.         LED2=0;
  157.         LED3=0;
  158.         LED4=0;
  159.         LED5=0;
  160.         LED6=0;
  161.         LED7=0;
  162.         P0M0=0x0F; P0M1=0x00;
  163.         P1M0=0x00; P1M1=0x00;
  164.         P2M0=0xFF; P2M1=0x00;
  165.         P3M0=0xF0; P3M1=0x00;
  166.         P4M0=0xFF; P4M1=0x00;
  167.         P5M0=0x00; P5M1=0x00;
  168.         P6M0=0x00; P6M1=0x00;
  169.         P7M0=0x00; P7M1=0x00;
  170.         P0PU=0xF0;       
  171.         P5PU=0x0F;
  172.         P2DR=0x00;
  173.        
  174.         TMOD=0x00;                                //设置定时器1为16位自动重载模式
  175.         AUXR=0x40;                                //设置定时器1为1T模式,设置定时器1为波特率发生器
  176.        
  177.         SCON=0x50;                                //设置UART1模式为8位数据可变波特率
  178.         TL1=BRT;                                //设置UART1波特率
  179.     TH1=BRT>>8;                                //设置UART1波特率
  180.         TR1=1;                                        //使能定时器1
  181.         ES=1;                                        //使能UART1中断
  182.        
  183.         COMEN=0xFF;
  184.         SEGENL=0xFF;
  185.         SEGENH=0xFF;
  186.         LEDCTRL=0xA0;
  187.         LEDCKS=0x00;
  188.        
  189.         TSCHEN1=0xff;                        //TK00~TK07
  190.         TSRT=0x00;                                //没有LED分时扫描
  191.         TSCFG1=(7<<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
  192.         TSCFG2=3;                                //配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)  1(1/2)  2(5/8)  3(3/4)
  193.         TSCTRL=0xA3;                        //开始自动扫描, 4次平均, B7: TSGO,  B6: SINGLE,  B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
  194. //        TSCTRL=(1<<7)+(1<<6);        //开始单次扫描, 无平均
  195. //        TSCTRL=(1<<7)+(1<<6)+3;        //开始单次扫描, 4次平均
  196. //        TSCTRL=(1<<7)+(1<<6)+1;        //开始单次扫描, 2次平均
  197. //        TSWUTC=12;                                //100ms唤醒一次
  198.         IE2|=0x80;                                //使能触摸中断
  199.        
  200.         EA=1;
  201.        
  202.         COM0_DA_L=0x00;
  203.         COM0_DA_H=0x00;
  204.         COM1_DA_L=0x00;
  205.         COM1_DA_H=0x00;
  206.         COM2_DA_L=0x00;
  207.         COM2_DA_H=0x00;
  208.         COM3_DA_L=0x00;
  209.         COM3_DA_H=0x00;
  210.         COM4_DA_L=0x00;
  211.         COM4_DA_H=0x00;
  212.         COM5_DA_L=0x00;
  213.         COM5_DA_H=0x00;
  214.         COM6_DA_L=0x00;
  215.         COM6_DA_H=0x00;
  216.         COM7_DA_L=0x00;
  217.         COM7_DA_H=0x00;
  218.         COM0_DC_L=0x00;
  219.         COM0_DC_H=0x00;
  220.         COM1_DC_L=0x00;
  221.         COM1_DC_H=0x00;
  222.         COM2_DC_L=0x00;
  223.         COM2_DC_H=0x00;
  224.         COM3_DC_L=0x00;
  225.         COM3_DC_H=0x00;
  226.         COM4_DC_L=0x00;
  227.         COM4_DC_H=0x00;
  228.         COM5_DC_L=0x00;
  229.         COM5_DC_H=0x00;
  230.         COM6_DC_L=0x00;
  231.         COM6_DC_H=0x00;
  232.         COM7_DC_L=0x00;
  233.         COM7_DC_H=0x00;
  234.        
  235.         Key_Flag=0;
  236. }
  237. void main(void)
  238. {
  239.         unsigned char i,j;
  240.         unsigned long temp;
  241.         Init();
  242.         for(i=0;i<8;i++)
  243.         {
  244.                 temp=0;
  245.                 for(j=0;j<16;j++)
  246.                 {
  247.                         while(!Key_Flag);
  248.                         Key_Flag=0;
  249.                         temp+=Key_Value[i];
  250.                 }
  251.                 Key_Test[i]=temp/16-500;
  252.         }
  253.        
  254.         while(1)
  255.         {
  256.                 if(Key_Flag)
  257.                 {
  258.                         Key_Flag=0;
  259.                         Key=0;
  260.                         for(i=0;i<8;i++)
  261.                         {
  262.                                 if(Key_Value[i]<Key_Test[i])
  263.                                 {
  264.                                         Key|=1<<Key_Map[i];
  265.                                 }
  266.                         }
  267. //                        LED_Driver(Key);
  268. //                        Display_BMP(0);
  269.                         Offset_Bit++;
  270.                         if(Offset_Bit==16)
  271.                         {
  272.                                 Offset_Bit=0;
  273.                                 Offset_String++;
  274.                         }
  275.                         if(Offset_String==sizeof String/32-1)
  276.                         {
  277.                                 Offset_String=0;
  278.                         }
  279.                         Display_String();
  280. //                        Send_Value();
  281.                 }
  282.                 Delay_x10ms(5);
  283.         }
  284. }
  285. void Uart_Isr(void) interrupt 4
  286. {
  287.         static unsigned char tp;
  288.         if(RI)
  289.         {
  290.                 RI=0;
  291.         }
  292.         if(TI)
  293.         {
  294.                 TI=0;
  295.                 if(Uart_Send_Lenth!=0)
  296.                 {
  297.                         SBUF=(T_Buffer[tp]);
  298.                         tp++;
  299.                 }
  300.                 if(tp==Uart_Send_Lenth)
  301.                 {
  302.                         tp=0;
  303.                         Uart_Send_Lenth=0;
  304.                 }
  305.         }
  306. }
  307. void TKSU_Interrupt(void) interrupt 13
  308. {
  309.         unsigned char temp;
  310.         temp=TSSTA2;
  311.         if(temp&0x40)                                //数据溢出, 错误处理
  312.         {
  313.                 TSSTA2|=0x40;                        //写1清零
  314.         }
  315.         if(temp&0x80)                                //扫描完成
  316.         {
  317.                 temp&=0x0f;
  318.                 Key_Value[temp]=TSDAT;        //保存某个通道的读数
  319.                 TSSTA2|=0x80;                        //写1清零
  320.         }
  321.         Key_Flag=1;
  322. }
复制代码


DebugLab
回复 支持 反对

使用道具 举报 送花

已绑定手机

5

主题

8

回帖

53

积分

注册会员

积分
53
发表于 2025-2-15 10:32:11 | 显示全部楼层

感谢支持,已经解决谢谢
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 13:24 , Processed in 0.268032 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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