开启数码管扫功能,触摸键不扫描了(已解决)
您好,我现在开启数码管扫功能,触摸键不扫描了。单独测试数码管功能,和触摸键功能都是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)); //等待时钟稳定
您好,请提供原理图PDF(以确定数码管和触摸按键的扫描方式),截图也可,请保证完整且清晰,不要使用手机拍屏幕
受PCB设计影响较大的功能(如ADC和触摸按键)和可能存在生产、制造、结构、焊接等问题的,请提供PCB图或实物照片
DebugLab 发表于 2025-2-14 14:16
您好,请提供原理图PDF(以确定数码管和触摸按键的扫描方式),截图也可,请保证完整且清晰,不要使用手机 ...
原理图如下,触摸键用到TK0-TK4。数码管用到COM0-COM5,SEG0-SEG10。目前这个两个功能单独调试都没问题,开了LED扫描,触摸按键的中断就进不去了,导致触摸按键就没法用了。
morway 发表于 2025-2-14 15:00
原理图如下,触摸键用到TK0-TK4。数码管用到COM0-COM5,SEG0-SEG10。目前这个两个功能单独调试都没问题,开 ...
没有使用IO复用分时扫描,LED驱动器和触摸按键不应该冲突 DebugLab 发表于 2025-2-14 15:14
没有使用IO复用分时扫描,LED驱动器和触摸按键不应该冲突
是的,就是不知道哪里出了问题,开LED,触摸按键就用不了{:4_167:} morway 发表于 2025-2-14 15:45
是的,就是不知道哪里出了问题,开LED,触摸按键就用不了
我当时试过这个功能,没有问题的,就是开了LED驱动后对触摸按键干扰大了点,但也是可以使用的,我去找找程序给您参考一下 #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;
}
DebugLab 发表于 2025-2-14 16:36
感谢支持,已经解决谢谢{:4_196:}
页:
[1]