|
发表于 2024-4-25 16:45:10
|
显示全部楼层
请问下,为什么,我串口输出按键值和零点值都是0
#include "main.h"
sbit LED_W = P3^3;
sbit LED_R = P3^4;
sbit BEE = P5^4;
unsigned int sys_tick=0;
unsigned int t0_count=0;
unsigned int t1_count=0;
unsigned int t2_count=0;
volatile bit busy;
unsigned char buffer;
u16 xdata TK_cnt; // 按键计数值, 16位
u16 xdata TK_zero; // 按键0点值, 16位
bit KeyState; // 按键状态, 每个bit对应一个键, 1为按下, 0为释放
u8 read_cnt; // 读次数
bit B_TK_Lowpass; // 低通允许, 1允许, 0禁止
u8 cmd; //串口命令
u8 T_KEY_FLAG = 0; // 串口发送忙标志
u16 code T_KeyPress=1300; //触摸后的变化值
u16 code T_KeyState=0x0001; //16个键对应的状态, 0为未触摸,1为触摸
/***********************************************************
* @brief 串口1中断函数,串口1用于调试
* @return Null
***********************************************************/
void UartIsr() interrupt 4
{
if (TI){
TI = 0;
busy = 0;
}
if (RI){
RI = 0;
// buffer= SBUF;
}
}
//========================================================================
// 函数: void TKSU_ISR(void) interrupt TKSU_VECTOR
// 描述: 触摸按键中断服务函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2023-10-11
// 备注:
u8 isr_index;
void AUXR_ISR(void) interrupt 13
{
u8 j;
j=TSSTA2;
if(j & 0x40) //数据溢出, 错误处理(略)
{
TSSTA2 |= 0x40; //写1清零
T_KEY_FLAG |= 2;
}
else T_KEY_FLAG &= ~0x02;
if(j & 0x80) //扫描完成
{
TK_cnt = TSDAT; //保存通道的读数 1.1us @24MHz
TSSTA2 |= 0x80; //写1清零
T_KEY_FLAG |= 0x08;
LED_W = 0;//开灯
}
else {T_KEY_FLAG &= ~0x08;LED_W = 1;}
}
void main()
{
P_SW2 |= 0x80; //允许访问XSF(特殊功能寄存器)
P3n_push_pull(0x18); //P3.3~P3.4线设置为推挽输出
P5n_push_pull(0x10); //P5.4线设置为推挽输出
P1n_pure_input(0x01); //P1.0 Touch Key设置为高阻
Timer_Init();
TSCHEN1 = 0x01; //TK00~TK07
TSCHEN2 = 0x00; //TK00~TK07
TSRT = 0x00; //没有LED分时扫描
TSCFG1 = (3<<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 = 1;//配置触摸按键控制器的内部参考电压(AVCC的分压比), 0(1/4) 1(1/2) 2(5/8) 3(3/4)
TSCTRL = 0x80; //开始自动扫描, 无平均, B7: TSGO, B6: SINGLE, B5: TSWAIT, B4: TSWUCS, B3: TSDCEN, B2: TSWUEN, B1 B0: TSSAMP
// TSTH00H = 0xff;
IE2 |= 0x80; //使能触摸中断
delay_ms(50); //延时一下
// key_init();
EA = 1; //开总中断
// P_SW2 = 0x00; //这个一定要关掉不了会导致程序不能运行
B_TK_Lowpass = 0; //禁止低通滤波
BEE = 0;
for(read_cnt=0; read_cnt<5; read_cnt++) //扫描10次键, 将此值作为未触摸时的0点, 要求上电时不要触摸按键
{
// TSCTRL = (1<<7) + (1<<6) +3; //开始扫描, 4次平均
TSCTRL = (1<<7) + (1<<6); //开始扫描, 无平均
delay_ms(50); //延时一下, 等待扫描完成
}
TK_zero= TK_cnt; //保存0点
B_TK_Lowpass = 1; //允许低通滤波
KeyState = 0;
read_cnt = 0;
printf("零点值:%u\n",TK_zero);
TSCTRL = 1<<7; //开始扫描, 无平均
while(1)
{
delay_ms(500); //延时一下, 根据实际扫描速度调整
printf("按键值:%u\n",TSDAT);
printf("按键值:%u\n",TK_cnt);
if(T_KEY_FLAG & 0x02)printf("数据溢出\n");
if(T_KEY_FLAG & 0x08)printf("扫描完成\n");
}
}
|
|