- 打卡等级:初来乍到
- 打卡总天数:7
- 最近打卡:2026-03-15 18:48:24
已绑定手机
注册会员
- 积分
- 67
|
发表于 2026-3-15 21:48:54
|
显示全部楼层
无法读取数值。
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com -----------------------------------------*/
/* --- QQ: 800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
#include "STC8H.h"
#include <intrins.h>
/************* 功能说明 **************
只检测P1.0(TK00)触摸引脚
每秒通过串口返回触摸值
******************************************/
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
/************* 本地变量声明 **************/
u16 xdata TK_cnt[16]; // 触摸计数值
u8 read_cnt = 0; // 读取计数
u8 TK_TimeOut = 0; // 超时计数
u16 send_delay = 0; // 发送延时
/************* 函数声明 **************/
void UART1_Init(void);
void UART_Send(u8 dat);
void Send_Num(u16 num);
void Delay_ms(u16 ms);
/******************** 主函数 **************************/
void main(void)
{
u8 i;
P_SW2 |= 0x80; // 允许访问XFR
// IO初始化
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x01; P1M0 = 0x00; // P1.0高阻输入(触摸)
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x03; // P3.0,P3.1推挽输出(串口)
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
UART1_Init();
// 发送开始信息
UART_Send('S');
UART_Send('T');
UART_Send('C');
UART_Send('8');
UART_Send('H');
UART_Send(' ');
UART_Send('T');
UART_Send('K');
UART_Send('0');
UART_Send(' ');
UART_Send('T');
UART_Send('e');
UART_Send('s');
UART_Send('t');
UART_Send('\r');
UART_Send('\n');
UART_Send('=');
UART_Send('=');
UART_Send('=');
UART_Send('=');
UART_Send('=');
UART_Send('=');
UART_Send('=');
UART_Send('=');
UART_Send('=');
UART_Send('\r');
UART_Send('\n');
// 触摸按键初始化(官方标准配置)
TSCHEN1 = 0x01; // 使能TK00(P1.0)
TSCHEN2 = 0x00; // 禁用其他通道
TSCFG1 = (7<<4) + 3; // 官方标准值
TSCFG2 = 2; // 官方标准值
TSCTRL = 0xA0; // 开始自动扫描, 无平均
IE2 |= 0x80; // 使能触摸中断
EA = 1; // 开总中断
// 等待触摸稳定
for(i=0; i<100; i++) Delay_ms(10);
// 发送寄存器状态用于调试
UART_Send('R');
UART_Send('e');
UART_Send('g');
UART_Send('s');
UART_Send(':');
UART_Send(' ');
UART_Send('T');
UART_Send('S');
UART_Send('C');
UART_Send('H');
UART_Send('E');
UART_Send('N');
UART_Send('1');
UART_Send('=');
Send_Num(TSCHEN1);
UART_Send(' ');
UART_Send('T');
UART_Send('S');
UART_Send('C');
UART_Send('F');
UART_Send('G');
UART_Send('1');
UART_Send('=');
Send_Num(TSCFG1);
UART_Send(' ');
UART_Send('T');
UART_Send('S');
UART_Send('C');
UART_Send('T');
UART_Send('R');
UART_Send('L');
UART_Send('=');
Send_Num(TSCTRL);
UART_Send('\r');
UART_Send('\n');
while(1)
{
Delay_ms(1);
send_delay++;
// 每秒发送一次触摸值
if(send_delay >= 1000)
{
send_delay = 0;
// 发送触摸值
Send_Num(TK_cnt[0]);
UART_Send('\r');
UART_Send('\n');
}
}
}
/************* 触摸按键中断 **************/
void TKSU_Interrupt(void) interrupt 13
{
u8 j;
j = TSSTA2;
if(j & 0x40) // 数据溢出
{
TSSTA2 |= 0x40; // 写1清零
}
if(j & 0x80) // 扫描完成
{
j &= 0x0f;
TK_cnt[j] = TSDAT; // 保存触摸值
TSSTA2 |= 0x80; // 写1清零
read_cnt++; // 读次数+1
TK_TimeOut = 0;
// 调试:每次中断发送一个点
// UART_Send('.');
}
}
/************* 串口初始化 **************/
void UART1_Init(void)
{
// 使用定时器1,模式2
SCON = 0x50; // 8位数据,可变波特率
AUXR &= 0xBF; // 定时器1时钟为Fosc/12
AUXR &= 0xFE; // 串口1选择定时器1为波特率发生器
TMOD &= 0x0F; // 清除定时器1模式位
TMOD |= 0x20; // 设定定时器1为8位自动重装方式
TH1 = 0xFA; // 115200波特率 @ 22.1184MHz
TL1 = 0xFA;
TR1 = 1; // 启动定时器1
TI = 1; // 设置发送中断标志
}
/************* 串口发送一个字节 **************/
void UART_Send(u8 dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
/************* 发送16位数字 **************/
void Send_Num(u16 num)
{
u8 buffer[6];
u8 i = 0, j = 0;
if(num == 0)
{
UART_Send('0');
return;
}
while(num > 0)
{
buffer[i++] = (num % 10) + '0';
num = num / 10;
}
for(j = i; j > 0; j--)
UART_Send(buffer[j-1]);
}
/************* 延时函数 **************/
void Delay_ms(u16 ms)
{
u16 i, j;
for(i=0; i<ms; i++)
for(j=0; j<1000; j++);
}
|
|