×

触摸屏交互功能模块设计方案分析

消耗积分:1 | 格式:rar | 大小:0.6 MB | 2017-10-17

分享资料个

本文以ARM920T内核的S3C2410芯片GX开发板为硬件平台,采用Windows CE操作系统,设计了嵌入式系统触摸屏交互功能模块。并对有关技术问题做了分析与讨论。
  1引言
  嵌入式系统拉近了人与计算机的距离,形成一个人机和谐的工作与生活环境。从某一个角度来看,触摸屏作为嵌入式计算机系统中一体化的输入输出设备,在制造工业、过程控制、通讯、仪器、仪表、汽车、船舶、航空、航天、军事装备、消费类产品等方面均得到广泛应用,影响到人类工作与生活的各个领域并极具应用前景,它与嵌入式系统的交互功能的程序设计是整个系统设计的关键。本文描述的这样的设计过程,对其中的技术问题给出了详细的解释。功能设计基于ARM920T内核的S3C2410芯片,以GX开发板为硬件平台,是以Windows CE为操作系统实现的图文交互界面模块。
  2系统交互功能的设计
  2.1系统构架
  通常嵌入式系统的构架可以分成四个部分:处理器、存储器、输入输出(I/O)和软件部分。由于多数嵌入式设备的应用软件和操作系统都是紧密结合的,在这里我们对其不加区分,这也是嵌入式系统和通用PC系统的最大区别。触摸屏嵌入式设计框图见图一。
  2.2 Windows CE的主要功能
  它是一个全新开发的模块化的图形用户界面的多任务操作系统,是一个支持多种CPU,拥有良好通信能力的高性能、高效率的实时操作系统。OEM厂家可以加入自己所需要的任何模块,或者除去不需要的。系统中一个应用程序的故障不会引起整个系统失效。
  触摸屏交互功能模块设计方案分析
  图一触摸屏嵌入式设计框图
  2.3操作系统对触摸屏的支持
  操作系统对触摸屏的支持是按分层的思想进行的。首先是应用层,编写的应用程序调用触摸屏/鼠标事件API(在牵引层有相关的API函数);其次,在驱动层有支持触摸屏的驱动程序。通过统一接口来调用操作系统内核的触摸屏设备驱动程序完成最终的设备控制。从中取出触摸屏的实际坐标值,把该值记录在初始化程序中,当下次有应用程序需要调用触摸屏驱动程序时,触摸屏驱动程序就会去检查初始化程序,读取其中的校正值,并把经过校正,影射后相对坐标值返回该应用程序。
  2.4触摸屏威廉希尔官方网站
  GX开发板为硬件平台,板载SHARP 3.5〞TFT液晶屏LQ035Q7DB02,320×240,262,144色,White LED背光,带触摸屏。SHARP液晶自带四线电阻式触摸屏,可以直接和2410的触摸屏驱动威廉希尔官方网站 连接,触摸位置直接用CPU内置的ADC威廉希尔官方网站 采样而得。
  触摸屏交互功能模块设计方案分析
  图二板载触摸屏威廉希尔官方网站
  2.5触摸屏的控制威廉希尔官方网站
  触摸屏的控制是使用FM7843芯片完成的。FM7843是4线电阻触摸屏转换接口芯片。它具有同步串行接口的12位取样模数转换器。在125kHz吞吐速率和2.7V电压下的功耗为750μW,而在关闭模式下的功耗仅为0.5μW.
  因此,ADS7843以其低功耗和高速率等特性,被广泛应用在采用电池供电的小型手持设备上。FM7843采用SSOP-16引脚封装形式,温度范围是-40~85℃。为了完成一次电极电压切换和A/D转换,需要先通过串口往FM 7843发送控制字,转换完成后再通过串口读出电压转换值。标准的一次转换需要24个时钟周期。由于串口支持双向同时进行传送,并且在一次读数与下一次发控制字之间可以重叠,所以转换速率可以提高到每次16个时钟周期。如果条件允许,CPU可以产生15个CLK的话(比如FPGAs和ASICs),转换速率还可以提高到每次15个时钟周期。FM 7843通过同步串口与ARM通讯,可通过SendSIOData()函数(uhal.c)向FM 7843发送数据;通过ReadSIOData()函数(uhal.c)从FM 7843读出数据。将F端口的第6位置0和1,可以打开、关闭FM7843,F端口的数据寄存器为PDATF(44b.h)。通过外部中断5可以判断是否有触摸动作,查询方式通过宏TCHSCR_IsPenNotDown()(tchscr.h)判断是否有触摸动作。
  3.设计中的几个关键问题
  3.1定制Windows CE平台
  Windows CE是一个多平台的、可裁减的32位嵌入式操作系统。他既适用于工业设备的嵌入式控智模块,也适用于消费类电子产品的开发。针对不同的目标设备硬件环境,在其内核基础上添加各种模块,从而形成一个定制的嵌入式操作系统。它包括了定制设备所需的一切,例如:联网能力、实时性和小内存占用以及多媒体和Web浏览功能等。
  3.2 Windows CE`的驱动模式
  Windows CE`设备的驱动模型有两种形式:流接口驱动(Stream Interface Driver)和本地设备驱动(Native Device Driver)从实现方式来看,无论那种驱动都可以采用单层和分层两种方式,多层设备驱动中实现的代码分两层:MDD(Model Device Driver,模型设备驱动)和PDD(Platform Dependent Driver,平台相关驱动)。MDD层中向GWES模块提供了DDI(Device Driver Interface,设备驱动接口)函数接口,实现了对于同一类设备的驱动程序所公用的功能,而PDD则实现了与平台的具体硬件设备相关的代码。MDD通过调用特殊的PDD函数来访问硬件。
  3.3触摸屏与显示器的配合算法
  FM 7843送回控制器的X与Y值仅是对当前触摸点的电压值的A/D转换值,它不具有实用价值。这个值的大小不但与触摸屏的分辨率有关,而且也与触摸屏与LCD贴合的情况有关。而且,LCD分辨率与触摸屏的分辨率一般来说是不一样,坐标也不一样,因此,如果想得到体现LCD坐标的触摸屏位置,还需要在程序中进行转换。转换公式如下:
  x=(x-TchScr_Xmin)*LCDWIDTH/(TchScr_Xmax-TchScr_Xmin)
  y=(y-TchScr_Ymin)*LCDHEIGHT/(TchScr_Ymax-TchScr_Ymin)
  其中,TchScr_Xmax、TchScr_Xmin、TchScr_Ymax和TchScr_Ymin是触摸屏返回电压值x、y轴的范围,LCDWIDTH、LCDHEIGHT是液晶屏的宽度与高度。
  3.4操作系统对触摸屏的支持
  操作系统对触摸屏的支持是按分层的思想进行的。首先是应用层,编写的应用程序调用触摸屏/鼠标事件API(在牵引层有相关的API函数);其次,在驱动层有支持触摸屏的驱动程序。通过统一接口来调用操作系统内核的触摸屏设备驱动程序完成最终的设备控制。从中取出触摸屏的实际坐标值,把该值记录在初始化程序中,当下次有应用程序需要调用触摸屏驱动程序时,触摸屏驱动程序就会去检查初始化程序,读取其中的校正值,并把经过校正,影射后相对坐标值返回该应用程序。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'触摸屏交互功能模块设计方案分析',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);