完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这是触摸屏显示程序的一部分,用来显示触摸屏的触点坐标的,使用了一个控制器。控制器向单片机输出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次。 } |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11787 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 14:05 , Processed in 0.577346 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号