谁帮我看看这部分程序为什么不对,是不是有逻辑错误啊
时间:10-02
整理:3721RD
点击:
这是触摸屏显示程序的一部分,用来显示触摸屏的触点坐标的,使用了一个控制器。控制器向单片机输出5个字节的串行数据(每个字节间隔20ms)用来表示触点坐标,
第一个字节为A0H,
第二个字节:高4位(D7-D4)为0,低4位(D3-D0)为X坐标的D9-D6位。
第三个字节;高2位(D7,D6)为0,低6位(D5-D0)为X坐标的D5-D0位。
第四个字节:高4位(D7-D4)为0,低4位(D3-D0)为Y坐标的D9-D6位。
第五个字节;高2位(D7,D6)为0,低6位(D5-D0)为Y坐标的D5-D0位。
但是,我编好了之后,上硬件检测的时候发现:最多显示255,而且到了256之后自动显示000,一个显示屏被分成了好几块区域,谁知道是怎么回事啊,编译没问题,谁给看看是不是有逻辑问题啊。
/**********串口初始化程序**************************************/
void ComInit(void) //这是51系列单片机的串口初始化程序,
{ SCON = 0x50;
//串行口工作方式1,即10位UART(1位起始,8位数据,1位停止),REN=1允许串行口接收。
TMOD = 0x20; //定时器1工作在方式2下,即定时器初值自动重装。
TH1 = 0xFD; //设定初值,波特率9600,
TL1 = 0xFD;
TR1 = 1; //开启定时器1
ES = 1; //开串口中断
EA = 1; // 开总中断
}
void comdelay20ms(void) //误差 -0.000000000005us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=222;b>0;b--)
for(a=40;a>0;a--);
}
char JCck(void)
//检测串口是否收到数据
//串口已经收到数据,返回1
//串口没有收到数据,返回0
{
return(RI);
}
void QCck(void)
//清除串口收到数据标志
{RI=0;}
void receive()//interrupt 4指明是串行口中断
{
unsigned int x,y;
unsigned char x1,y1,x2,y2,x3,y3;
//每组数据说明:
// 当屏幕受到压力(手指按压屏幕)后,触摸屏控制器不断发出串行数据(间隔20mS),一直到压力消失为止。
// 每组数据为五个字节,含义如下:
// 第1字节:A0H,手指按下后每组数据的第1字节均为A0H。
// 第2字节:高4位(D7-D4)为0,低4位(D3-D0)为X坐标的D9-D6位。
// 第3字节:高2位(D7,D6)为0,低6位(D5-D0)为X坐标的D5-D0位。 由第2,3字节组合形成10位X坐标(D9~D0)
// 第4字节:高4位(D7-D4)为0,低4位(D3-D0)为Y坐标的D9-D6位。
// 第5字节:高2位(D7,D6)为0,低6位(D5-D0)为Y坐标的D5-D0位。由第4,5字节组合形成10位Y坐标(D9~D0)
//下面接收5个字节:
RI=0;
while(1) //等待接收第1个字节,触摸后,每组第1字节一定是0A0H
{
while(RI==0);
RI=0;
if(SBUF==0xA0) break;
};
while(RI==0);
RI=0;
x=SBUF; //接收第2个字节,低4位是X坐标的D9-D6位,高4位为0.
while(RI==0);
RI=0;
x=(x<<6)|SBUF; //收第3个字节,低6位时X坐标的D5-D0位,高2位为0.
while(RI==0);
RI=0;
y=SBUF; //接收第4个字节,低4位时Y坐标的D9-D6位,高4位为0.
while(RI==0);
RI=0;
y=(y<<6)|SBUF; //接收第5个字节,低6位时Y坐标的D5-D0位,高2位为0.
x1=x; //变换前X坐标(触摸屏控制器的数据)
y1=y; //变换前Y坐标(触摸屏控制器的数据)
JCck();
//检测串口是否收到数据
//串口已经收到数据,返回1
//串口没有收到数据,返回0
QCck(); //清除串口收到数据标志
comdelay20ms();
RI=0;
while(1) //等待接收第1个字节,触摸后,每组第1字节一定是0A0H
{
while(RI==0);
RI=0;
if(SBUF==0xA0) break;
};
while(RI==0);
RI=0;
x=SBUF; //接收第2个字节,低4位是X坐标的D9-D6位,高4位为0.
while(RI==0);
RI=0;
x=(x<<6)|SBUF; //收第3个字节,低6位时X坐标的D5-D0位,高2位为0.
while(RI==0);
RI=0;
y=SBUF; //接收第4个字节,低4位时Y坐标的D9-D6位,高4位为0.
while(RI==0);
RI=0;
y=(y<<6)|SBUF; //接收第5个字节,低6位时Y坐标的D5-D0位,高2位为0.
x2=x; //(触摸屏控制器的数据)
y2=y; //(触摸屏控制器的数据)
JCck();
//检测串口是否收到数据
//串口已经收到数据,返回1
//串口没有收到数据,返回0
QCck(); //清除串口收到数据标志
comdelay20ms();
RI=0;
while(1) //等待接收第1个字节,触摸后,每组第1字节一定是0A0H
{
while(RI==0);
RI=0;
if(SBUF==0xA0) break;
};
while(RI==0);
RI=0;
x=SBUF; //接收第2个字节,低4位是X坐标的D9-D6位,高4位为0.
while(RI==0);
RI=0;
x=(x<<6)|SBUF; //收第3个字节,低6位时X坐标的D5-D0位,高2位为0.
while(RI==0);
RI=0;
y=SBUF; //接收第4个字节,低4位时Y坐标的D9-D6位,高4位为0.
while(RI==0);
RI=0;
y=(y<<6)|SBUF; //接收第5个字节,低6位时Y坐标的D5-D0位,高2位为0.
x3=x; //变换前X坐标(触摸屏控制器的数据)
y3=y; //变换前Y坐标(触摸屏控制器的数据)
JCck();
//检测串口是否收到数据
//串口已经收到数据,返回1
//串口没有收到数据,返回0
QCck(); //清除串口收到数据标志
comdelay20ms();
x0=(x1+x2+x3)/3;
y0=(y1+y2+y3)/3; //这里检测3次,取平均值,适合强干扰的现场。也可以只检测1次。
}
第一个字节为A0H,
第二个字节:高4位(D7-D4)为0,低4位(D3-D0)为X坐标的D9-D6位。
第三个字节;高2位(D7,D6)为0,低6位(D5-D0)为X坐标的D5-D0位。
第四个字节:高4位(D7-D4)为0,低4位(D3-D0)为Y坐标的D9-D6位。
第五个字节;高2位(D7,D6)为0,低6位(D5-D0)为Y坐标的D5-D0位。
但是,我编好了之后,上硬件检测的时候发现:最多显示255,而且到了256之后自动显示000,一个显示屏被分成了好几块区域,谁知道是怎么回事啊,编译没问题,谁给看看是不是有逻辑问题啊。
/**********串口初始化程序**************************************/
void ComInit(void) //这是51系列单片机的串口初始化程序,
{ SCON = 0x50;
//串行口工作方式1,即10位UART(1位起始,8位数据,1位停止),REN=1允许串行口接收。
TMOD = 0x20; //定时器1工作在方式2下,即定时器初值自动重装。
TH1 = 0xFD; //设定初值,波特率9600,
TL1 = 0xFD;
TR1 = 1; //开启定时器1
ES = 1; //开串口中断
EA = 1; // 开总中断
}
void comdelay20ms(void) //误差 -0.000000000005us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=222;b>0;b--)
for(a=40;a>0;a--);
}
char JCck(void)
//检测串口是否收到数据
//串口已经收到数据,返回1
//串口没有收到数据,返回0
{
return(RI);
}
void QCck(void)
//清除串口收到数据标志
{RI=0;}
void receive()//interrupt 4指明是串行口中断
{
unsigned int x,y;
unsigned char x1,y1,x2,y2,x3,y3;
//每组数据说明:
// 当屏幕受到压力(手指按压屏幕)后,触摸屏控制器不断发出串行数据(间隔20mS),一直到压力消失为止。
// 每组数据为五个字节,含义如下:
// 第1字节:A0H,手指按下后每组数据的第1字节均为A0H。
// 第2字节:高4位(D7-D4)为0,低4位(D3-D0)为X坐标的D9-D6位。
// 第3字节:高2位(D7,D6)为0,低6位(D5-D0)为X坐标的D5-D0位。 由第2,3字节组合形成10位X坐标(D9~D0)
// 第4字节:高4位(D7-D4)为0,低4位(D3-D0)为Y坐标的D9-D6位。
// 第5字节:高2位(D7,D6)为0,低6位(D5-D0)为Y坐标的D5-D0位。由第4,5字节组合形成10位Y坐标(D9~D0)
//下面接收5个字节:
RI=0;
while(1) //等待接收第1个字节,触摸后,每组第1字节一定是0A0H
{
while(RI==0);
RI=0;
if(SBUF==0xA0) break;
};
while(RI==0);
RI=0;
x=SBUF; //接收第2个字节,低4位是X坐标的D9-D6位,高4位为0.
while(RI==0);
RI=0;
x=(x<<6)|SBUF; //收第3个字节,低6位时X坐标的D5-D0位,高2位为0.
while(RI==0);
RI=0;
y=SBUF; //接收第4个字节,低4位时Y坐标的D9-D6位,高4位为0.
while(RI==0);
RI=0;
y=(y<<6)|SBUF; //接收第5个字节,低6位时Y坐标的D5-D0位,高2位为0.
x1=x; //变换前X坐标(触摸屏控制器的数据)
y1=y; //变换前Y坐标(触摸屏控制器的数据)
JCck();
//检测串口是否收到数据
//串口已经收到数据,返回1
//串口没有收到数据,返回0
QCck(); //清除串口收到数据标志
comdelay20ms();
RI=0;
while(1) //等待接收第1个字节,触摸后,每组第1字节一定是0A0H
{
while(RI==0);
RI=0;
if(SBUF==0xA0) break;
};
while(RI==0);
RI=0;
x=SBUF; //接收第2个字节,低4位是X坐标的D9-D6位,高4位为0.
while(RI==0);
RI=0;
x=(x<<6)|SBUF; //收第3个字节,低6位时X坐标的D5-D0位,高2位为0.
while(RI==0);
RI=0;
y=SBUF; //接收第4个字节,低4位时Y坐标的D9-D6位,高4位为0.
while(RI==0);
RI=0;
y=(y<<6)|SBUF; //接收第5个字节,低6位时Y坐标的D5-D0位,高2位为0.
x2=x; //(触摸屏控制器的数据)
y2=y; //(触摸屏控制器的数据)
JCck();
//检测串口是否收到数据
//串口已经收到数据,返回1
//串口没有收到数据,返回0
QCck(); //清除串口收到数据标志
comdelay20ms();
RI=0;
while(1) //等待接收第1个字节,触摸后,每组第1字节一定是0A0H
{
while(RI==0);
RI=0;
if(SBUF==0xA0) break;
};
while(RI==0);
RI=0;
x=SBUF; //接收第2个字节,低4位是X坐标的D9-D6位,高4位为0.
while(RI==0);
RI=0;
x=(x<<6)|SBUF; //收第3个字节,低6位时X坐标的D5-D0位,高2位为0.
while(RI==0);
RI=0;
y=SBUF; //接收第4个字节,低4位时Y坐标的D9-D6位,高4位为0.
while(RI==0);
RI=0;
y=(y<<6)|SBUF; //接收第5个字节,低6位时Y坐标的D5-D0位,高2位为0.
x3=x; //变换前X坐标(触摸屏控制器的数据)
y3=y; //变换前Y坐标(触摸屏控制器的数据)
JCck();
//检测串口是否收到数据
//串口已经收到数据,返回1
//串口没有收到数据,返回0
QCck(); //清除串口收到数据标志
comdelay20ms();
x0=(x1+x2+x3)/3;
y0=(y1+y2+y3)/3; //这里检测3次,取平均值,适合强干扰的现场。也可以只检测1次。
}
已退回15积分