基于51单片机手写板.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于51单片机手写板.doc

基于51单片机的手写板 首先谈谈这件作品的创作灵感,今年国赛有一道题是在一块覆铜板上画线,然后显示在12864液晶上,其实要实现这个不难,难就难在精度上,国赛对这个要求很高。我找了一块普通的敷铜板测了一下任意两点之间的电阻,结果令人大失所望,不管怎么测,电阻都接近于零而且变化不大,然后上网查资料,有没有那种电阻率比较大的板子,也没有找到。当时还找了那个无穷平面的电阻网络分析,大家知道铜板表面的电阻并不是线性分布的,反正公式很复杂的样子,没看懂,于是去问电路老师,在我的预料之内,老师也不知道,就这样放弃了。 刚好在网上找到了那种电阻屏,于是就索性改用电阻屏了,但是如果仅仅是在12864上显示,就太没意思了,刚好学长开会的时候提到了用VB编上位机,于是就开始学VB,刚开始是想做一个画图板,但后来觉得那个用处不大,要是能写字就好了。好啦,废话不多说了,开始进入正题。 先说说VB编程,核心部分当然是那个手写识别了,也是查了一些资料,很复杂的样子,单凭一人之力想做一个手写输入法很困难,网上七找八找,看看有没有源代码之类的,但事实很快就证明了我是在做白日梦,那些应该属于技术机密了,一般找不到。但值得庆幸的是,找到了一个手写控件,名字叫ActivateHandWrite,如果你不知道什么是控件的话,那下面的就不用看了,建议先学学VB的基础知识。 好啦,最难的部分就这样轻松的解决了。编上位机主要是用到串口通信那块,涉及到一个控件叫做MsComm,在对VB有一定的了解下,建议看看那本《Visual Basic与RS232串行通信控制》,这本书讲得非常好,不看后悔死你,当时就是因为数据接收类型问题,以及怎么处理接收过来的数据,纠结了很久,最后在这本书上找到了解决办法。这里提供一种比较好的数据接收方法,1.把InputMode设为comInputModeBynary, Rthreshold设为1,这样每接收到一个字符就会触发一次Oncomm事件,下面以一段程序为例进行讲解: Case comEvReceive 接收到了RThreshold个字符。持续产生该事件,直到使用了Input属性删除了接收缓冲区中的数据 With MSComm1 Dim ab 6 As Byte 字节数据类型数组,用来存储接收到的一组字节数据 Dim av As Variant 用来从接收缓冲区读取数据 av .Input 读取一个接收字节 ab 1 av 0 转换保存到字节数据类型数组 If ab 1 HF0 Then 判断是否为数据开始标志 .RThreshold 0 关闭OnComm事件接收,此时并不触发OnComm事件(类似于单片机的串口中断) Do DoEvents Loop Until .InBufferCount 5 循环等待MSComm1接收缓冲区 5个字节 av .Input 读取第二个数据字节, ab 2 av 0 转换保存到字节数据类型数组 av .Input ab 3 av 0 av .Input ab 4 av 0 av .Input ab 5 av 0 av .Input ab 6 av 0 该字符为模式选择 .RThreshold 1 打开MSComm1事件接收 End If End With End Select 这里以接收5个字节为例,将其存放到数组av里面,每次存一个后就将其赋值给数组ab,前面的F0为起始字符,注意ab 6 一定要是Byte类型的数组,接下来只要对接收到的坐标进行相应处理就OK了,具体后面再详解。 接下来再谈谈如何把手写控件识别出来的字输入到我们想要输入的文本框里面呢?我想这是这个上位机最难的部分了,需要调用一些API函数,其实本人对API也是一知半解。Windows系统是一个消息传递机制,它就像一个黑匣子一样,操作系统是直接对硬件进行操作的,我们不知道硬件到底发生了什么变化,只知道这一变化由系统返回了一个什么样的消息,我们再对这个消息进行处理。如果仅仅是将得到的字符显示在本窗体里,那样就没意思了,所以我们需要先找到获得有输入焦点的窗口的句柄,然后利用PostMessage函数将消息传送过去。(注意SendMessage和PostMessage的区别),花了好几天时间,几乎找遍了各大论坛,就是关于跨线程调用的问题,自己也是似懂非懂,下面列出需要用到的API函数: Rem 以下6个API函数的作用是将字符传送到光标所在控件 Private Declare Function GetCurrentThreadId Lib kernel32 As Long Private Declare Function GetWin

文档评论(0)

dmz158 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档