morway 发表于 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+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) = 128/TSWUTC Hz, TSWUTC = 1~255
      IE2 |= 0x80;                //使能触摸中断
    IRC32KCR = 0x80;                            //启动内部32K IRC
    while (!(IRC32KCR & 1));                  //等待时钟稳定

DebugLab 发表于 2025-2-14 14:16:13

您好,请提供原理图PDF(以确定数码管和触摸按键的扫描方式),截图也可,请保证完整且清晰,不要使用手机拍屏幕
受PCB设计影响较大的功能(如ADC和触摸按键)和可能存在生产、制造、结构、焊接等问题的,请提供PCB图或实物照片

morway 发表于 2025-2-14 15:00:00

DebugLab 发表于 2025-2-14 14:16
您好,请提供原理图PDF(以确定数码管和触摸按键的扫描方式),截图也可,请保证完整且清晰,不要使用手机 ...
原理图如下,触摸键用到TK0-TK4。数码管用到COM0-COM5,SEG0-SEG10。目前这个两个功能单独调试都没问题,开了LED扫描,触摸按键的中断就进不去了,导致触摸按键就没法用了。

DebugLab 发表于 2025-2-14 15:14:37

morway 发表于 2025-2-14 15:00
原理图如下,触摸键用到TK0-TK4。数码管用到COM0-COM5,SEG0-SEG10。目前这个两个功能单独调试都没问题,开 ...

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

morway 发表于 2025-2-14 15:45:11

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

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

DebugLab 发表于 2025-2-14 16:06:23

morway 发表于 2025-2-14 15:45
是的,就是不知道哪里出了问题,开LED,触摸按键就用不了

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

DebugLab 发表于 2025-2-14 16:36:07

#include <STC8H.H>
#include "define.h"
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#include <absacc.h>

#define LED0 P50
#define LED1 P51
#define LED2 P04
#define LED3 P52
#define LED4 P07
#define LED5 P06
#define LED6 P05
#define LED7 P53
#define TSK0 P54
#define TSK1 P13
#define TSK2 P17
#define TSK3 P16
#define TSK4 P15
#define TSK5 P14
#define TSK6 P11
#define TSK7 P10
#define COM0 P20
#define COM1 P21
#define COM2 P22
#define COM3 P23
#define COM4 P24
#define COM5 P25
#define COM6 P26
#define COM7 P27
#define SEG0 P40
#define SEG1 P41
#define SEG2 P42
#define SEG3 P43
#define SEG4 P44
#define SEG5 P45
#define SEG6 P46
#define SEG7 P47
#define SEG8 P00
#define SEG9 P01
#define SEGA P02
#define SEGB P03
#define SEGC P34
#define SEGD P35
#define SEGE P36
#define SEGF P37

#define                FOSC                11059200UL
#define                BAUD                115200UL
#define                BRT                        (0x10000-FOSC/BAUD/4)

bit Key_Flag;
unsigned char Uart_Send_Lenth,RP,Key,Offset_Bit,Offset_String;
unsigned int Key_Value,Key_Test;
unsigned char xdata T_Buffer,R_Buffer;
unsigned char code Key_Map={7,6,0,1,5,4,3,2};
unsigned char code Hex_to_Ascii={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
//unsigned char code BMP[]=
//{
//        #include <0.h>
//};
unsigned char code String[]=
{
        #include <0.h>
};

/*----------------------------延时10us@STC-Y6@11.0592MHz----------------------------*/
//void Delay_10us(void)
//{
//        unsigned char i;
//        i=35;
//        while(--i);
//}

/*----------------------------延时x10us----------------------------*/
//void Delay_x10us(unsigned char x)
//{
//        while(x--)
//                Delay_10us();
//}

/*----------------------------延时10ms@STC-Y6@11.0592MHz----------------------------*/
void Delay_10ms(void)
{
        unsigned char i,j;
        _nop_();
        _nop_();
        i=144;
        j=157;
        do
        {
                while(--j);
        }while(--i);
}

/*----------------------------延时x10ms----------------------------*/
void Delay_x10ms(unsigned char x)
{
        while(x--)
                Delay_10ms();
}

void LED_Driver(unsigned char temp)
{
        LED0=temp&0x01;
        LED1=temp&0x02;
        LED2=temp&0x04;
        LED3=temp&0x08;
        LED4=temp&0x10;
        LED5=temp&0x20;
        LED6=temp&0x40;
        LED7=temp&0x80;
}

//void Display_BMP(unsigned char temp)
//{
//        unsigned char i;
//        unsigned char xdata *p=(unsigned char xdata *)0xfb10;
//        for(i=0;i<8;i++)
//        {
//                *(p+i)=BMP;
//                *(p+8+i)=BMP;
//                *(p+16+i)=BMP;
//                *(p+24+i)=BMP;
//        }
//}

void Display_String(void)
{
        unsigned char i;
        unsigned char xdata *p=XBYTE+0xfb10;
        for(i=0;i<8;i++)
        {
                *(p+i)=Offset_Bit<8?(String>>Offset_Bit)|(String<<(8-Offset_Bit)):(String>>Offset_Bit-8)|(String<<(8-(Offset_Bit-8)));
                *(p+8+i)=Offset_Bit<8?(String>>Offset_Bit)|(String<<(8-Offset_Bit)):(String>>Offset_Bit-8)|(String<<(8-(Offset_Bit-8)));
                *(p+16+i)=Offset_Bit<8?(String>>Offset_Bit)|(String<<(8-Offset_Bit)):(String>>Offset_Bit-8)|(String<<(8-(Offset_Bit-8)));
                *(p+24+i)=Offset_Bit<8?(String>>Offset_Bit)|(String<<(8-Offset_Bit)):(String>>Offset_Bit-8)|(String<<(8-(Offset_Bit-8)));
        }
}

void Send_Value(void)
{
        unsigned char i;
        if(Uart_Send_Lenth==0)
        {
                for(i=0;i<8;i++)
                {
                        T_Buffer=Hex_to_Ascii/10000];
                        T_Buffer=Hex_to_Ascii%10000/1000];
                        T_Buffer=Hex_to_Ascii%1000/100];
                        T_Buffer=Hex_to_Ascii%100/10];
                        T_Buffer=Hex_to_Ascii%10];
                        T_Buffer=' ';
                }
                T_Buffer='\r';
                T_Buffer='\n';
                Uart_Send_Lenth=50;
                TI=1;
        }
}

void Init(void)
{
        P_SW2|=EAXFR;
        LED0=0;
        LED1=0;
        LED2=0;
        LED3=0;
        LED4=0;
        LED5=0;
        LED6=0;
        LED7=0;
        P0M0=0x0F; P0M1=0x00;
        P1M0=0x00; P1M1=0x00;
        P2M0=0xFF; P2M1=0x00;
        P3M0=0xF0; P3M1=0x00;
        P4M0=0xFF; P4M1=0x00;
        P5M0=0x00; P5M1=0x00;
        P6M0=0x00; P6M1=0x00;
        P7M0=0x00; P7M1=0x00;
        P0PU=0xF0;       
        P5PU=0x0F;
        P2DR=0x00;
       
        TMOD=0x00;                                //设置定时器1为16位自动重载模式
        AUXR=0x40;                                //设置定时器1为1T模式,设置定时器1为波特率发生器
       
        SCON=0x50;                                //设置UART1模式为8位数据可变波特率
        TL1=BRT;                                //设置UART1波特率
    TH1=BRT>>8;                                //设置UART1波特率
        TR1=1;                                        //使能定时器1
        ES=1;                                        //使能UART1中断
       
        COMEN=0xFF;
        SEGENL=0xFF;
        SEGENH=0xFF;
        LEDCTRL=0xA0;
        LEDCKS=0x00;
       
        TSCHEN1=0xff;                        //TK00~TK07
        TSRT=0x00;                                //没有LED分时扫描
        TSCFG1=(7<<4)+3;                //开关电容工作频率 = fosc/(2*(TSCFG1+1)), 放电时间(系统时钟周期数) 0(125) 1(250) 2(500) 3(1000) 4(2000) 5(2500) 6(5000) 7(7500) 最小3
        TSCFG2=3;                                //配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4)1(1/2)2(5/8)3(3/4)
        TSCTRL=0xA3;                        //开始自动扫描, 4次平均, B7: TSGO,B6: SINGLE,B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
//        TSCTRL=(1<<7)+(1<<6);        //开始单次扫描, 无平均
//        TSCTRL=(1<<7)+(1<<6)+3;        //开始单次扫描, 4次平均
//        TSCTRL=(1<<7)+(1<<6)+1;        //开始单次扫描, 2次平均
//        TSWUTC=12;                                //100ms唤醒一次
        IE2|=0x80;                                //使能触摸中断
       
        EA=1;
       
        COM0_DA_L=0x00;
        COM0_DA_H=0x00;
        COM1_DA_L=0x00;
        COM1_DA_H=0x00;
        COM2_DA_L=0x00;
        COM2_DA_H=0x00;
        COM3_DA_L=0x00;
        COM3_DA_H=0x00;
        COM4_DA_L=0x00;
        COM4_DA_H=0x00;
        COM5_DA_L=0x00;
        COM5_DA_H=0x00;
        COM6_DA_L=0x00;
        COM6_DA_H=0x00;
        COM7_DA_L=0x00;
        COM7_DA_H=0x00;
        COM0_DC_L=0x00;
        COM0_DC_H=0x00;
        COM1_DC_L=0x00;
        COM1_DC_H=0x00;
        COM2_DC_L=0x00;
        COM2_DC_H=0x00;
        COM3_DC_L=0x00;
        COM3_DC_H=0x00;
        COM4_DC_L=0x00;
        COM4_DC_H=0x00;
        COM5_DC_L=0x00;
        COM5_DC_H=0x00;
        COM6_DC_L=0x00;
        COM6_DC_H=0x00;
        COM7_DC_L=0x00;
        COM7_DC_H=0x00;
       
        Key_Flag=0;
}

void main(void)
{
        unsigned char i,j;
        unsigned long temp;
        Init();
        for(i=0;i<8;i++)
        {
                temp=0;
                for(j=0;j<16;j++)
                {
                        while(!Key_Flag);
                        Key_Flag=0;
                        temp+=Key_Value;
                }
                Key_Test=temp/16-500;
        }
       
        while(1)
        {
                if(Key_Flag)
                {
                        Key_Flag=0;
                        Key=0;
                        for(i=0;i<8;i++)
                        {
                                if(Key_Value<Key_Test)
                                {
                                        Key|=1<<Key_Map;
                                }
                        }
//                        LED_Driver(Key);
//                        Display_BMP(0);
                        Offset_Bit++;
                        if(Offset_Bit==16)
                        {
                                Offset_Bit=0;
                                Offset_String++;
                        }
                        if(Offset_String==sizeof String/32-1)
                        {
                                Offset_String=0;
                        }
                        Display_String();
//                        Send_Value();
                }
                Delay_x10ms(5);
        }
}

void Uart_Isr(void) interrupt 4
{
        static unsigned char tp;
        if(RI)
        {
                RI=0;
        }
        if(TI)
        {
                TI=0;
                if(Uart_Send_Lenth!=0)
                {
                        SBUF=(T_Buffer);
                        tp++;
                }
                if(tp==Uart_Send_Lenth)
                {
                        tp=0;
                        Uart_Send_Lenth=0;
                }
        }
}

void TKSU_Interrupt(void) interrupt 13
{
        unsigned char temp;
        temp=TSSTA2;
        if(temp&0x40)                                //数据溢出, 错误处理
        {
                TSSTA2|=0x40;                        //写1清零
        }
        if(temp&0x80)                                //扫描完成
        {
                temp&=0x0f;
                Key_Value=TSDAT;        //保存某个通道的读数
                TSSTA2|=0x80;                        //写1清零
        }
        Key_Flag=1;
}

morway 发表于 2025-2-15 10:32:11

DebugLab 发表于 2025-2-14 16:36


感谢支持,已经解决谢谢{:4_196:}
页: [1]
查看完整版本: 开启数码管扫功能,触摸键不扫描了(已解决)