- 打卡等级:常住居民I
- 打卡总天数:64
- 最近打卡:2025-12-16 08:02:31
已绑定手机
中级会员
- 积分
- 245
|
串口输出乱码 。
#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清零
}
|
|