找回密码
 立即注册
查看: 72|回复: 5

串口打印

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:64
  • 最近打卡:2025-12-16 08:02:31
已绑定手机

10

主题

49

回帖

245

积分

中级会员

积分
245
发表于 2025-12-9 22:50:30 | 显示全部楼层 |阅读模式
截图202512092249535926.jpg 串口输出乱码 。 截图202512092250077043.jpg #include "STC8Hxxxxx.h"
#include <intrins.h>
#include <absacc.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <math.h>

        #define                TKC                P00                //        0        高阻
        #define                TKD                P01                //        0        高阻
        #define                TKE                P02                //        0        高阻
        #define                TKF                P03                //        0        高阻
//        #define                NC                P04                //        0        高阻
//        #define                NC                P05                //        0        高阻
        #define                NTC                P06                //        0        高阻
        #define                BUZ                P07                //        0        推挽

        #define                TK0                P10                //        0        高阻
        #define                TK1                P11                //        0        高阻
//        #define                NO                P12                //        0        高阻
        #define                TK3                P13                //        0        高阻
        #define                TK4                P14                //        0        高阻
        #define                TK5                P15                //        0        高阻
        #define                TK6                P16                //        0        高阻
        #define                TK7                P17                //        0        高阻

        #define                COM0        P20                //        0        推挽
        #define                COM1        P21                //        0        推挽
        #define                COM2        P22                //        0        推挽
        #define                COM3        P23                //        0        推挽
        #define                COM4        P24                //        0        推挽
        #define                COM5        P25                //        0        推挽
        #define                COM6        P26                //        0        推挽
        #define                COM7        P27                //        0        推挽

        #define                RXD                P30                //        1        双向
        #define                TXD                P31                //        1        推挽
        #define                SCL                P32                //        1        双向
        #define                SDA                P33                //        1        双向
        #define                SEGC        P34                //        0        推挽
        #define                SEGD        P35                //        0        推挽
        #define                SEGE        P36                //        0        推挽
        #define                CMP+        P37                //        0        高阻

        #define                SEG0        P40                //        0        推挽
        #define                SEG1        P41                //        0        推挽
        #define                SEG2        P42                //        0        推挽
        #define                SEG3        P43                //        0        推挽
        #define                SEG4        P44                //        0        推挽
        #define                SEG5        P45                //        0        推挽
        #define                SEG6        P46                //        0        推挽
        #define                SEG7        P47                //        0        推挽

        #define                TK8                P50                //        0        高阻
        #define                TK9                P51                //        0        高阻
        #define                TKA                P52                //        0        高阻
        #define                TKB                P53                //        0        高阻
        #define                TK2                P54                //        0        高阻
//        #define                NO                P55                //        0        高阻
//        #define                NO                P56                //        0        高阻
//        #define                NO                P57                //        0        高阻
       
#define                FOSC                        24000000UL                                //主时钟
#define                BAUD                        115200UL                                //波特率
#define                TMRF                        200UL                                        //定时器频率
#define                BRT                                (0x10000-FOSC/BAUD/4)        //波特率值
#define                TMR                                (0x10000-FOSC/TMRF/12)        //定时器值
#define                T_Buf_Len                64                                                //Uart1发送缓存长度
#define                R_Buf_Len                64                                                //Uart1接收缓存长度
#define                TS_Channel                16                                                //触摸按键通道数
#define                TS_Compare                0x0800                                        //触摸按键比较值
#define                TS_Range                0x0400                                        //触摸按键回滞值

unsigned char                RP;                                                //Uart2接收指针
unsigned char                TP;                                                //Uart2发送指针
unsigned char                Uart_R_Len;                                //Uart2接收长度
unsigned char                Uart_T_Len;                                //Uart2发送长度
unsigned char xdata        R_Buf[R_Buf_Len];                //Uart2接收缓存
unsigned char xdata        T_Buf[T_Buf_Len];                //Uart2发送缓存
unsigned char code        Seg_Map[19]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00,0x80};        //0~F,杠,空格,点
unsigned char                Seg_Buf[16];
unsigned char                LED_Buf[16];
unsigned char code        TS_Map[16]={0x06,0x07,0x0A,0x08,0x0C,0x0D,0x0E,0x0F,0x09,0x0B,0x04,0x05,0x00,0x01,0x02,0x03};        //触摸按键通道重映射
unsigned int xdata        TS_Buf[5][TS_Channel];        //触摸按键数据(实际值、预处理值、最小值、最大值、结果)
unsigned char                TS_Select;                                //触摸按键选择通道(查看TS_Buf,低4位为低维度,范围0x*0-0x*B;高4位为高维度,范围0x0*-0x4*)
unsigned char                TS_Scan;                                //触摸按键扫描通道
bit                                        TS_Flag;                                //触摸按键中断标志
unsigned char                TS_Calibrate;                        //触摸按键校准状态
unsigned int                TS_Pad;                                        //触摸按钮状态
unsigned char                TS_Ring;                                //触摸滑环状态
unsigned char                TS_Slide;                                //触摸滑条状态
unsigned int                Ring;                                        //触摸滑环值
unsigned int                Slide;                                        //触摸滑条值

void Delay_ms(unsigned char ms)
{
        unsigned int i;
        do
        {
                i=FOSC/10000;
                while(--i);        //10T per loop
        }
        while(--ms);
}

//void Delay_100us(void)
//{
//        unsigned char data i,j;
//        i=4;
//        j=27;
//        do
//        {
//                while (--j);
//        }
//        while (--i);
//}

void UART_Send(unsigned int x)
{
        while(Uart_T_Len);
        TP=0;
        Uart_T_Len=x;
        TI=1;
}

//void Uart_Printf(unsigned char *v,...)
//{
//        va_list ap;
//        va_start(ap,v);
//        while(Uart_T_Len);
//        UART_Send(vsprintf(T_Buf,v,ap));
//        va_end(ap);
//}

void UART_Return(unsigned char temp)
{
        memcpy(T_Buf,R_Buf,temp);
        UART_Send(temp);
}

void Buzzer(void)
{
        if(TS_Pad&0x0100)
                BUZ=1;
        else
                BUZ=0;
}

void Seg_Display(void)
{
        Seg_Buf[0x00]=((TS_Calibrate<<8)|TS_Select)>>4;
        Seg_Buf[0x01]=((TS_Calibrate<<8)|TS_Select)&0x0F;
        Seg_Buf[0x02]=16;
        Seg_Buf[0x03]=TS_Buf[TS_Select>>4][TS_Select&0x0F]/10000;
        Seg_Buf[0x04]=TS_Buf[TS_Select>>4][TS_Select&0x0F]%10000/1000;
        Seg_Buf[0x05]=TS_Buf[TS_Select>>4][TS_Select&0x0F]%1000/100;
        Seg_Buf[0x06]=TS_Buf[TS_Select>>4][TS_Select&0x0F]%100/10;
        Seg_Buf[0x07]=TS_Buf[TS_Select>>4][TS_Select&0x0F]%10;
        Seg_Buf[0x08]=Slide%10000/1000;
        Seg_Buf[0x09]=Slide%1000/100;
        Seg_Buf[0x0A]=Slide%100/10;
        Seg_Buf[0x0B]=Slide%10;
        Seg_Buf[0x0C]=Ring%10000/1000;
        Seg_Buf[0x0D]=Ring%1000/100;
        Seg_Buf[0x0E]=Ring%100/10;
        Seg_Buf[0x0F]=Ring%10;
}

void LED_Display(void)
{
        LED_Buf[0x00]=TS_Pad&0x0001?0x07:0x00;
        LED_Buf[0x01]=TS_Pad&0x0002?0x07:0x00;
        LED_Buf[0x02]=TS_Pad&0x0004?0x07:0x00;
        LED_Buf[0x03]=TS_Pad&0x0008?0x07:0x00;
        LED_Buf[0x04]=TS_Pad&0x0010?0x07:0x00;
        LED_Buf[0x05]=TS_Pad&0x0020?0x07:0x00;
        LED_Buf[0x06]=TS_Pad&0x0040?0x07:0x00;
        LED_Buf[0x07]=TS_Pad&0x0080?0x07:0x00;
        LED_Buf[0x08]=TS_Pad&0x0100?0x07:0x00;
        LED_Buf[0x09]=TS_Ring&0x01?0x07:0x00;
        LED_Buf[0x0A]=TS_Ring&0x02?0x07:0x00;
        LED_Buf[0x0B]=TS_Ring&0x04?0x07:0x00;
        LED_Buf[0x0C]=TS_Slide&0x01?0x07:0x00;
        LED_Buf[0x0D]=TS_Slide&0x02?0x07:0x00;
        LED_Buf[0x0E]=TS_Slide&0x04?0x07:0x00;
        LED_Buf[0x0F]=TS_Slide&0x08?0x07:0x00;
}

void LED(void)
{
        unsigned char i;
        unsigned char xdata *p=XBYTE+0xFB10;
        Seg_Display();
        LED_Display();
        for(i=0;i<8;i++)
        {
                *(p+i)=Seg_Map[Seg_Buf];
                *(p+8+i)=(LED_Buf&0x07)<<4;
                *(p+16+i)=Seg_Map[Seg_Buf[8+i]];
                *(p+24+i)=(LED_Buf[8+i]&0x07)<<4;
        }
       
//        COM0_DA_L=Seg_Map[Seg_Buf[0x00]];
//        COM1_DA_L=Seg_Map[Seg_Buf[0x01]];
//        COM2_DA_L=Seg_Map[Seg_Buf[0x02]];
//        COM3_DA_L=Seg_Map[Seg_Buf[0x03]];
//        COM4_DA_L=Seg_Map[Seg_Buf[0x04]];
//        COM5_DA_L=Seg_Map[Seg_Buf[0x05]];
//        COM6_DA_L=Seg_Map[Seg_Buf[0x06]];
//        COM7_DA_L=Seg_Map[Seg_Buf[0x07]];
//        COM0_DC_L=Seg_Map[Seg_Buf[0x08]];
//        COM1_DC_L=Seg_Map[Seg_Buf[0x09]];
//        COM2_DC_L=Seg_Map[Seg_Buf[0x0A]];
//        COM3_DC_L=Seg_Map[Seg_Buf[0x0B]];
//        COM4_DC_L=Seg_Map[Seg_Buf[0x0C]];
//        COM5_DC_L=Seg_Map[Seg_Buf[0x0D]];
//        COM6_DC_L=Seg_Map[Seg_Buf[0x0E]];
//        COM7_DC_L=Seg_Map[Seg_Buf[0x0F]];
//        COM0_DA_H=(LED_Buf[0x00]&0x07)<<4;
//        COM1_DA_H=(LED_Buf[0x01]&0x07)<<4;
//        COM2_DA_H=(LED_Buf[0x02]&0x07)<<4;
//        COM3_DA_H=(LED_Buf[0x03]&0x07)<<4;
//        COM4_DA_H=(LED_Buf[0x04]&0x07)<<4;
//        COM5_DA_H=(LED_Buf[0x05]&0x07)<<4;
//        COM6_DA_H=(LED_Buf[0x06]&0x07)<<4;
//        COM7_DA_H=(LED_Buf[0x07]&0x07)<<4;
//        COM0_DC_H=(LED_Buf[0x08]&0x07)<<4;
//        COM1_DC_H=(LED_Buf[0x09]&0x07)<<4;
//        COM2_DC_H=(LED_Buf[0x0A]&0x07)<<4;
//        COM3_DC_H=(LED_Buf[0x0B]&0x07)<<4;
//        COM4_DC_H=(LED_Buf[0x0C]&0x07)<<4;
//        COM5_DC_H=(LED_Buf[0x0D]&0x07)<<4;
//        COM6_DC_H=(LED_Buf[0x0E]&0x07)<<4;
//        COM7_DC_H=(LED_Buf[0x0F]&0x07)<<4;
}

unsigned int Compare(bit x,unsigned int a,unsigned int b)        //两个值比较,返回最大值或最小值,用于触摸按键校准最大最小值
{
        return a==b?a:(x==0?(a<b?a:b):(a>b?a:b));                                //比较大小,x=0返回最小值,x=1返回最大值
}

void Calibrate(void)                        //触摸按键最大最小值校准
{
        unsigned char i;
        static unsigned char flag;        //低4位为首次校准标志,高4位无用
        switch(TS_Calibrate)
        {
                case 0:                                        //取消校准
                        flag=0x0F;                        //非校准状态才允许置位4个标志位
                break;
                case 1:                                        //校准单通道最小值
                        if(flag&0x01)                //首次进入单通道最小值校准状态,使用当前值替换最小值
                        {
                                flag&=0x0E;                //清除标志位,取消校准前不再替换
                                TS_Buf[2][TS_Select&0x0F]=TS_Buf[1][TS_Select&0x0F];
                        }
                        else                                //非首次进入单通道最小值校准状态,比较当前值和最小值,并用较小值替换最小值
                        {
                                TS_Buf[2][TS_Select&0x0F]=Compare(0,TS_Buf[1][TS_Select&0x0F],TS_Buf[2][TS_Select&0x0F]);
                        }
                break;
                case 2:                                        //校准单通道最大值
                        if(flag&0x02)                //首次进入单通道最大值校准状态,使用当前值替换最大值
                        {
                                flag&=0x0D;                //清除标志位,取消校准前不再替换
                                TS_Buf[3][TS_Select&0x0F]=TS_Buf[1][TS_Select&0x0F];
                        }
                        else                                //非首次进入单通道最大值校准状态,比较当前值和最大值,并用较大值替换最大值
                        {
                                TS_Buf[3][TS_Select&0x0F]=Compare(1,TS_Buf[1][TS_Select&0x0F],TS_Buf[3][TS_Select&0x0F]);
                        }
                break;
                case 3:                                        //校准所有通道最小值
                        if(flag&0x04)                //首次进入所有通道最小值校准状态,使用当前值替换最小值
                        {
                                flag&=0x0B;                //清除标志位,取消校准前不再替换
                                for(i=0;i<TS_Channel;i++)
                                {
                                        TS_Buf[2]=TS_Buf[1];
                                }
                        }
                        else                                //非首次进入所有通道最小值校准状态,比较当前值和最小值,并用较小值替换最小值
                        {
                                for(i=0;i<TS_Channel;i++)
                                {
                                        TS_Buf[2]=Compare(0,TS_Buf[1],TS_Buf[2]);
                                }
                        }
                break;
                case 4:                                        //校准所有通道最大值
                        if(flag&0x08)                //首次进入所有通道最大值校准状态,使用当前值替换最大值
                        {
                                flag&=0x07;                //清除标志位,取消校准前不再替换
                                for(i=0;i<TS_Channel;i++)
                                {
                                        TS_Buf[3]=TS_Buf[1];
                                }
                        }
                        else                                //非首次进入所有通道最大值校准状态,比较当前值和最大值,并用较大值替换最大值
                        {
                                for(i=0;i<TS_Channel;i++)
                                {
                                        TS_Buf[3]=Compare(1,TS_Buf[1],TS_Buf[3]);
                                }
                        }
                break;
                default:
                       
                break;
        }
}

void Touch_Pad(void)        //触摸按钮
{
        unsigned char i;
        unsigned int limit_l,limit_h;
        limit_l=TS_Compare-TS_Range/2;
        limit_h=TS_Compare+TS_Range/2;
        for(i=0;i<9;i++)
        {
                if(TS_Buf[4]<=limit_l)
                {
                        TS_Pad&=~(0x01<<i);
                }
                if(TS_Buf[4]>=limit_h)
                {
                        TS_Pad|=0x01<<i;
                }
        }
}

void Touch_Ring(void)        //触摸滑环
{
        unsigned char i,sector;
        unsigned int limit_l,limit_h,sum;
        limit_l=TS_Compare-TS_Range/2;
        limit_h=TS_Compare+TS_Range/2;
        TS_Ring=0;
        for(i=0;i<3;i++)                                //计算触摸滑环状态
        {
                if(TS_Buf[4][i+9]<=limit_l)        //小于较低比较值标志位置0
                {
                        TS_Ring&=~(0x01<<i);
                }
                if(TS_Buf[4][i+9]>=limit_h)        //大于较高比较值标志位置1
                {
                        TS_Ring|=0x01<<i;
                }
        }
        if(TS_Ring&0x07)                                //如果低3位中任意一位有效表示触摸滑环按下
        {
                TS_Ring|=0x80;                                //触摸滑环按下,最高位为1
                if(TS_Ring==0x81|TS_Ring==0x82|TS_Ring==0x83|TS_Ring==0x84|TS_Ring==0x85|TS_Ring==0x86)        //按下状态中只有这6种状态有效
                {
                        for(sum=0,i=9;i<12;i++)
                        {
                                sum+=TS_Buf[4];
                        }
                        if(TS_Buf[4][0x09]>=TS_Buf[4][0x0A]&&TS_Buf[4][0x09]>=TS_Buf[4][0x0B])                                //触摸滑环在10到2点钟方向(扇区0或5)
                        {
                                if(TS_Buf[4][0x0A]>=TS_Buf[4][0x0B])                                                                                        //B相大于等于C相,在0到2点钟方向(扇区0)
                                {
                                        sector=0;
                                        Ring=((TS_Buf[4][0x0A]-(TS_Buf[4][0x0B]*(TS_Buf[4][0x09]/(TS_Buf[4][0x0A]*2))))*0x0555UL)/(TS_Buf[4][0x09]+TS_Buf[4][0x0A]);
                                }
                                else                                                                                                                                                        //B相小于C相,在10到0点钟方向(扇区5)
                                {
                                        sector=5;
                                        Ring=((TS_Buf[4][0x09]+(TS_Buf[4][0x0A]*(TS_Buf[4][0x09]/(TS_Buf[4][0x0B]*2))))*0x0555UL)/(TS_Buf[4][0x0B]+TS_Buf[4][0x09])+0x0AAA;
                                }
                        }
                        else if(TS_Buf[4][0x0A]>=TS_Buf[4][0x09]&&TS_Buf[4][0x0A]>=TS_Buf[4][0x0B])                        //触摸滑环在2到6点钟方向(扇区1或2)
                        {
                                if(TS_Buf[4][0x0B]>=TS_Buf[4][0x09])                                                                                        //C相大于等于A相,在4到6点钟方向(扇区2)
                                {
                                        sector=2;
                                        Ring=((TS_Buf[4][0x0B]-(TS_Buf[4][0x09]*(TS_Buf[4][0x0A]/(TS_Buf[4][0x0B]*2))))*0x0555UL)/(TS_Buf[4][0x0A]+TS_Buf[4][0x0B])+0x0555;
                                }
                                else                                                                                                                                                        //C相小于A相,在2到4点钟方向(扇区1)
                                {
                                        sector=1;
                                        Ring=((TS_Buf[4][0x0A]+(TS_Buf[4][0x0B]*(TS_Buf[4][0x0A]/(TS_Buf[4][0x09]*2))))*0x0555UL)/(TS_Buf[4][0x09]+TS_Buf[4][0x0A]);
                                }
                        }
                        else if(TS_Buf[4][0x0B]>=TS_Buf[4][0x09]&&TS_Buf[4][0x0B]>=TS_Buf[4][0x0A])                        //触摸滑环在6到10点钟方向(扇区3或4)
                        {
                                if(TS_Buf[4][0x09]>=TS_Buf[4][0x0A])                                                                                        //A相大于等于B相,在8到10点钟方向(扇区4)
                                {
                                        sector=4;
                                        Ring=((TS_Buf[4][0x09]-(TS_Buf[4][0x0A]*(TS_Buf[4][0x0B]/(TS_Buf[4][0x09]*2))))*0x0555UL)/(TS_Buf[4][0x0B]+TS_Buf[4][0x09])+0x0AAA;
                                }
                                else                                                                                                                                                        //A相小于B相,在6到8点钟方向(扇区3)
                                {
                                        sector=3;
                                        Ring=((TS_Buf[4][0x0B]+(TS_Buf[4][0x09]*(TS_Buf[4][0x0B]/(TS_Buf[4][0x0A]*2))))*0x0555UL)/(TS_Buf[4][0x0A]+TS_Buf[4][0x0B])+0x0555;
                                }
                        }
                }
                else        //全按下无效,触摸滑环值为0
                {
                        Ring=0;
                }
        }
        else                //触摸滑环没有按下的,复位标志位,触摸滑环值为0
        {
                TS_Ring&=0x7F;
                Ring=0;
        }
}

void Touch_Slide(void)        //触摸滑条
{
        unsigned char i;
        unsigned int limit_l,limit_h,sum;
        limit_l=TS_Compare-TS_Range/2;
        limit_h=TS_Compare+TS_Range/2;
        TS_Slide=0;
        for(i=0;i<4;i++)
        {
                if(TS_Buf[4][i+12]<=limit_l)
                {
                        TS_Slide&=~(0x01<<i);
                }
                if(TS_Buf[4][i+12]>=limit_h)
                {
                        TS_Slide|=0x01<<i;
                }
        }
        if(TS_Slide&0x0F)
        {
                TS_Slide|=0x80;
                if(TS_Slide==0x81|TS_Slide==0x82|TS_Slide==0x83|TS_Slide==0x84|TS_Slide==0x86|TS_Slide==0x87|TS_Slide==0x88|TS_Slide==0x8C|TS_Slide==0x8E)
                {
                        for(sum=0,i=8;i<12;i++)
                        {
                                sum+=TS_Buf[4];
                        }
                        if(TS_Buf[4][0x0C]>=TS_Buf[4][0x0D]&&TS_Buf[4][0x0C]>=TS_Buf[4][0x0E]&&TS_Buf[4][0x0C]>=TS_Buf[4][0x0F])
                        {
                                Slide=0x0000;
                        }
                        else if(TS_Buf[4][0x0D]>=TS_Buf[4][0x0C]&&TS_Buf[4][0x0D]>=TS_Buf[4][0x0E]&&TS_Buf[4][0x0D]>=TS_Buf[4][0x0F])
                        {
                                Slide=0x0555;
                        }
                        else if(TS_Buf[4][0x0E]>=TS_Buf[4][0x0C]&&TS_Buf[4][0x0E]>=TS_Buf[4][0x0D]&&TS_Buf[4][0x0E]>=TS_Buf[4][0x0F])
                        {
                                Slide=0x0AAA;
                        }
                        else if(TS_Buf[4][0x0F]>=TS_Buf[4][0x0C]&&TS_Buf[4][0x0F]>=TS_Buf[4][0x0D]&&TS_Buf[4][0x0F]>=TS_Buf[4][0x0E])
                        {
                                Slide=0x0FFF;
                        }
                        else
                        {
                                Slide=0;
                        }
                }
                else
                {
                        Slide=0;
                }
        }
        else
        {
                TS_Slide&=0x7F;
                Slide=0;
        }
}

void Touch_Key(void)
{
        unsigned char i;
        if(TS_Flag)
        {
                TS_Flag=0;
                for(i=0;i<TS_Channel;i++)
                {
                        // 动态滤波算法(加权平均)采用加权移动平均算法,当前值占3/4权重,新采样值占1/4权重(通过两次右移2位实现1/4权重),有效抑制高频噪声。
                        TS_Buf[1]=TS_Buf[1]*3+((0xFFFF-TS_Buf[0])>>2)>>2;
                       
                        // 归一化计算(带边界保护)
                        if(TS_Buf[3]>TS_Buf[2])
                        {
                                //(滤波值 - 最小值) * 0x1000 / (最大值 - 最小值)
                                TS_Buf[4]=(TS_Buf[1]>TS_Buf[2]?(TS_Buf[1]-TS_Buf[2]):0)*0x1000UL/(TS_Buf[3]-TS_Buf[2]);
                                if(TS_Buf[4]>0x0FFF) // 限幅到12位有效值
                                {
                                        TS_Buf[4]=0x0FFF;
                                }
                        }
                        else
                        {
                                TS_Buf[4]=0;// 无效数据处理
                        }
                }
                Calibrate();// 校准处理

                Touch_Pad(); // 触摸板逻辑
                Touch_Ring(); // 环形触摸处理
                Touch_Slide();// 滑动触摸处理
        }
}

void Init(void)
{
        //P_SW2|=EAXFR;
        P_SW2 |= 0x80;        //允许访问XSF
        P0=0x00;
        P1=0x00;
        P2=0x00;
        P3=0x0F;
        P4=0x00;
        P5=0x00;
       
        P0M0=0x80;
        P0M1=0x7F;
        P1M0=0x00;
        P1M1=0xFF;
        P2M0=0xFF;
        P2M1=0x00;
        P3M0=0x72;
        P3M1=0x80;
        P4M0=0xFF;
        P4M1=0x00;
        P5M0=0x00;
        P5M1=0xFF;
       
//        X32KCR=0xC0;        //启动外部32768晶振,设置高增益
//        while(!(X32KCR&0x01));
       
        AUXR=0x05;                //设置定时器0时钟为12T模式,设置定时器2为1T模式,设置定时器2为波特率发生器
        TMOD=0x01;                //设置定时器0为16位不自动重装载模式
        TH0=TMR>>8;                //设置定时器0初始值
        TL0=TMR;                //设置定时器0初始值
        TF0=0;                        //清除TF0中断标志位
        ET0=1;                        //启用定时器0中断
       
        SCON=0x50;                //设置UART1模式为8位数据可变波特率
        T2H=BRT>>8;                //设置UART1波特率
        T2L=BRT;                //设置UART1波特率
        AUXR|=0x10;                //打开定时器2
        ES=1;                        //启用UART1中断
       
        TSCHEN1=0xFF;        //TK00~TK07
        TSCHEN2=0xFF;        //TK08~TK15
        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;                //启用触摸中断
       
        COMEN=0xFF;                //使能COM
        SEGENL=0xFF;        //使能SEG
        SEGENH=0x70;        //使能SEG
        LEDCTRL=0xA0;        //使能LED驱动器,共阴共阳模式,亮度100%
        LEDCKS=0x00;        //
       
        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;
       
        memset(R_Buf,0x00,sizeof R_Buf);
        memset(T_Buf,0x00,sizeof T_Buf);
        memset(TS_Buf,0x00,sizeof TS_Buf);
       
        TS_Buf[2][0x00]=11570;
        TS_Buf[2][0x01]=11352;
        TS_Buf[2][0x02]=11496;
        TS_Buf[2][0x03]=11365;
        TS_Buf[2][0x04]=11279;
        TS_Buf[2][0x05]=11188;
        TS_Buf[2][0x06]=11346;
        TS_Buf[2][0x07]=11282;
        TS_Buf[2][0x08]=11010;
        TS_Buf[2][0x09]=13986;
        TS_Buf[2][0x0A]=14044;
        TS_Buf[2][0x0B]=14051;
        TS_Buf[2][0x0C]=12218;
        TS_Buf[2][0x0D]=12200;
        TS_Buf[2][0x0E]=12531;
        TS_Buf[2][0x0F]=12320;
        TS_Buf[3][0x00]=14863;
        TS_Buf[3][0x01]=14798;
        TS_Buf[3][0x02]=14860;
        TS_Buf[3][0x03]=14897;
        TS_Buf[3][0x04]=14781;
        TS_Buf[3][0x05]=14859;
        TS_Buf[3][0x06]=14882;
        TS_Buf[3][0x07]=14922;
        TS_Buf[3][0x08]=14838;
        TS_Buf[3][0x09]=14987;
        TS_Buf[3][0x0A]=14881;
        TS_Buf[3][0x0B]=14965;
        TS_Buf[3][0x0C]=14616;
        TS_Buf[3][0x0D]=14306;
        TS_Buf[3][0x0E]=14357;
        TS_Buf[3][0x0F]=14573;
       
        TS_Select=0x48;
}


//void UART1_TxByte(u8 dat)
//{
//        B_TX1_Busy = 1;                        //±êÖ¾·¢ËÍæ
//        SBUF = dat;                                        //·¢Ò»¸ö×Ö½Ú
//        while(B_TX1_Busy);        //µÈ´ý·¢ËÍÍê³É
//}


//void UART1_PrintString(u8 *puts)
//{
//        for (; *puts != 0;        puts++)
//        {
//                UART_Send(*puts);
//        }
//}



void main(void)
{

        Init();
       
        while(1)
        {
//                if(TS_Flag)
//                {
//               
//                Uart_Printf("TS_Buf[0][3]: %d \r\n",TS_Buf[0][3]);
//                Uart_Printf("TS_Buf[0][4]: %d \r\n",TS_Buf[0][4]);
//                Uart_Printf("TS_Buf[0][5]: %d \r\n",TS_Buf[0][5]);
//                }
                //Uart_Printf("TS_Buf[0][5]: %d \r\n",TS_Buf[0][5]);
               
               
       
                //UART1_PrintString("T");
                UART_Send('t');
               
                //Delay_ms(1000);
                Touch_Key();
                LED();
                Buzzer();
               

        }
}

void Uart_Start(void)
{
        TH0=TMR>>8;
        TL0=TMR;
        TR0=1;
}

void Uart_Stop(void)
{
        TR0=0;
        TH0=TMR>>8;
        TL0=TMR;
        RP=0;
        memset(R_Buf,0x00,sizeof R_Buf);
}

void Timer0_Isr(void) interrupt TMR0_VECTOR                                        //软件做串口超时判断,超时后处理数据
{
       

       
        if(((R_Buf[0]>>4)<=4))                                                                        //高4位为0~4切换通道显示,显示TS_Buf[x][y],高4位为x,低4位为y
                TS_Select=R_Buf[0];
        else if(((R_Buf[0]>>4)==0x05)&&((R_Buf[0]&0x0F)<=0x04))        //高4位为5且低4位为0~4设置校准状态,0x50取消校准,0x51校准单通道最小值,0x52校准单通道最大值,0x53校准所有通道最小值,0x54校准所有通道最大值
                TS_Calibrate=R_Buf[0]&0x07;
        UART_Return(RP);                                                                                //原样返回收到的内容
        Uart_Stop();
       
       
}

void Uart1_Isr(void) interrupt UART1_VECTOR
{
        if(RI)
        {
                RI=0;
                Uart_Start();
                R_Buf[RP]=SBUF;
                if(RP==R_Buf_Len-1)
                {
                        Uart_Stop();
                }
                else if(TR0)
                {
                        RP++;
                }
        }
        if(TI)
        {
                TI=0;
                if(TP==Uart_T_Len)
                {
                        TP=0;
                        Uart_T_Len=0;
                }
                if(Uart_T_Len!=0)
                {
                        SBUF=(T_Buf[TP]);
                        TP++;
                }
        }
}

void TKSU_Isr(void) interrupt 13
{
       
        unsigned char temp;
        temp=TSSTA2;//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;
                }
        }
       
        //UART_Send(TS_Buf[0][TS_Map[TS_Scan]]);
        TSSTA2|=0x80;                                                                //写1清零
}

回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:64
  • 最近打卡:2025-12-16 08:02:31
已绑定手机

10

主题

49

回帖

245

积分

中级会员

积分
245
发表于 2025-12-9 22:51:05 | 显示全部楼层
如何才能 将触摸按键 按键的电容值打印 出来?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:584
  • 最近打卡:2025-12-16 09:16:46
已绑定手机

49

主题

2368

回帖

8416

积分

论坛元老

积分
8416
发表于 7 天前 | 显示全部楼层
uuta*** 发表于 2025-12-9 22:51
如何才能 将触摸按键 按键的电容值打印 出来?

下面帖子附件里就有串口打印触摸按键值的例子:
https://www.stcaimcu.com/forum.p ... =3971&pid=51046
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:645
  • 最近打卡:2025-12-16 08:20:22
已绑定手机

93

主题

6933

回帖

1万

积分

超级版主

积分
13008
发表于 7 天前 | 显示全部楼层
程序的协议是ASCII发送命令
截图202512100925555779.jpg
unsigned int xdata        TS_Buf[5][TS_Channel];        //触摸按键数据(实际值、预处理值、最小值、最大值、结果)
根据注释,用printf输出 TS_Buf[0][TS_Channel] 就是对应通道 TSDAT 的值

回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:64
  • 最近打卡:2025-12-16 08:02:31
已绑定手机

10

主题

49

回帖

245

积分

中级会员

积分
245
发表于 5 天前 | 显示全部楼层
Debu*** 发表于 2025-12-10 09:29
程序的协议是ASCII发送命令

unsigned int xdata        TS_Buf[5][TS_Channel];        //触摸按键数据( ...

好的感谢
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:64
  • 最近打卡:2025-12-16 08:02:31
已绑定手机

10

主题

49

回帖

245

积分

中级会员

积分
245
发表于 5 天前 | 显示全部楼层
乘风*** 发表于 2025-12-10 09:11
下面帖子附件里就有串口打印触摸按键值的例子:
https://www.stcaimcu.com/forum.php?mod=redirect&goto= ...

好的感谢
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-17 04:13 , Processed in 0.108899 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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