单片机/MCU论坛
直播中

烈焰123

8年用户 103经验值
擅长:可编程逻辑 MEMS/传感技术 测量仪表 嵌入式技术 处理器/DSP
私信 关注
[问答]

谁帮我看看这部分程序为什么不对,是不是有逻辑错误啊

这是触摸屏显示程序的一部分,用来显示触摸屏的触点坐标的,使用了一个控制器。控制器向单片机输出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次。
}

已退回15积分

更多回帖

发帖
×
20
完善资料,
赚取积分