人机界面(Usart HMI)屏可以轻松设计漂亮友好的人机界面,也可以通过Usart串口与机器CPU通信。但仅有这些是不够的。还需要自定义 通信协议。通信协议包含波特率设置,数据格式,编码解码,数据打包发送及接收解包等。本文将介绍我们应当怎样使用Usart HMI屏来组建有人机交互功能的系统。

人机界面(Usart HMI)屏的默认波特率是9600,我们也可在初始化时设定波特率。对51单片机没特别需求的情况下,使用波特率就可保证数据稳定传输。屏幕厂商的Usart接口通过是4Pin XH2.54连接器实现,并兼做屏幕供电电源接口。配套的插头线比较端比较短也不是带屏蔽的,如果机箱内干扰比较大的话,有时在通信时会出错。我的做法是,将插头线换掉,换成带屏蔽的,只用它的插头的胶壳,端子自己打。如果线较长套个磁环更好。

人机界面(Usart HMI)屏与机器CPU之间的数据传输分主动传输与被动传输两种方式。主动方式是指屏直接发送数据给机器内部CPU。被动方式是指屏仅发送简短的指令,机器内部CPU根据执行任务情况,在方便接收数据的时候,向人机界面(Usart HMI)屏发送数据传送指令。如果机器内部是51单片机系统建议选用后者。因为51单片机系统比较慢,人机界面(Usart HMI)屏内部MCU比较快,由51单片机发出数据发送指令,然后51单片机接收数据,不易出错,且高效。

下面是一个项目的中的一个人机界面的页面,来简单看一下屏幕的代码:

变量

页面初始化代码如下:

if(va1.val==0)
{bt0.val=0bt3.val=0bt6.val=0
}else if(va1.val==1)
{bt0.val=1bt3.val=0bt6.val=0
}else if(va1.val==2)
{bt0.val=0bt3.val=1bt6.val=0
}else if(va1.val==3)
{bt0.val=0bt3.val=0bt6.val=1
}
strlen t1.txt,sys0
if(sys0<6)
{tem2.txt="000000"tem2.txt-=sys0tem2.txt+=t1.txtt1.txt=tem2.txt
}
strlen t2.txt,sys0
if(sys0<6)
{tem2.txt="000000"tem2.txt-=sys0tem2.txt+=t2.txtt2.txt=tem2.txt
}
strlen t3.txt,sys0
if(sys0<6)
{tem2.txt="000000"tem2.txt-=sys0tem2.txt+=t3.txtt3.txt=tem2.txt
}
strlen t4.txt,sys0
if(sys0<6)
{tem2.txt="000000"tem2.txt-=sys0tem2.txt+=t4.txtt4.txt=tem2.txt
}
strlen t5.txt,sys0
if(sys0<6)
{tem2.txt="000000"tem2.txt-=sys0tem2.txt+=t5.txtt5.txt=tem2.txt
}
strlen t6.txt,sys0
if(sys0<6)
{tem2.txt="000000"tem2.txt-=sys0tem2.txt+=t6.txtt6.txt=tem2.txt
}
for(sys0=0;sys0<100;sys0++)
{va2.val++
}

bt0按下事件代码:

printh A0
if(bt0.val==1)
{va1.val=1bt3.val=0bt6.val=0
}else
{va1.val=0bt3.val=0bt6.val=0
}

bt1按下事件代码:

if(bt1.val==0)
{printh A3
}else
{printh A4
}

bt2按下事件代码:

printh A0
va1.val=1
bt0.val=1
bt3.val=0
bt6.val=0

bt3按下事件代码:

printh A0
if(bt3.val==1)
{va1.val=2bt0.val=0bt6.val=0
}else
{va1.val=0bt0.val=0bt6.val=0
}

bt4按下事件代码:

if(bt4.val==0)
{printh A5
}else
{printh A6
}

bt5按下事件代码:


printh A0
va1.val=2
bt0.val=0
bt3.val=1
bt6.val=0

bt6按下事件代码:

printh A0
if(bt6.val==1)
{va1.val=3bt0.val=0bt3.val=0
}else
{va1.val=0bt0.val=0bt3.val=0
}

bt7按下事件代码:


printh A0
va1.val=3
bt0.val=0
bt3.val=0
bt6.val=1

t1按下事件代码:

printh A0
va1.val=1
KB.loadpageid.val=0
KB.loadcmpid.val=5
page KB

t2按下事件代码:

printh A0
va1.val=1
KB.loadpageid.val=0
KB.loadcmpid.val=6
page KB

t3按下事件代码:

printh A0
va1.val=2
KB.loadpageid.val=0
KB.loadcmpid.val=10
page KB

t4按下事件代码:

printh A0
va1.val=2
KB.loadpageid.val=0
KB.loadcmpid.val=11
page KB

t5按下事件代码:

printh A0
printh A0
va1.val=3
KB.loadpageid.val=0
KB.loadcmpid.val=12
page KB

t6按下事件代码:

printh A0
va1.val=3
KB.loadpageid.val=0
KB.loadcmpid.val=13
page KB

b0按下事件代码:

if(va1.val==0)
{printh A0
}else if(va1.val==1)
{bt1.val=0va0.txt="X"if(bt2.val==0){va0.txt+="R"}else{va0.txt+="L"}va0.txt+=t1.txtva0.txt+=t2.txt
}else if(va1.val==2)
{bt4.val=0va0.txt="Y"if(bt5.val==0){va0.txt+="F"}else{va0.txt+="B"}va0.txt+=t3.txtva0.txt+=t4.txt
}
if(va1.val==3)
{va0.txt="Z"if(bt7.val==0){va0.txt+="D"}else{va0.txt+="U"}va0.txt+=t5.txtva0.txt+=t6.txt
}
printh A1

b1按下事件代码:

printh A2

b2按下事件代码:

printh A0
modeselect.pageid.val=0
page password

可以看出b0按下事件代码有一个数据打包过程,但并没传送数据,仅向单片机传送一个指令代码。

几乎没个时间代码中都有printh A0,0xA0是按键音指令,按键音由单片机控制发出,这样做的目的是让人知道,屏与单片机通信正常,发送的指令也可正常执行。由于篇幅关系这里就不贴出单片机的代码了。

51单片机实战教程(32 人机界面编程9)相关推荐

  1. 51单片机实战教程(一 数据类型别名定义)

    前面已经讲了C语言基础,从此以后将进行编程实战.C数据类型名较长,编程输入不太方便. 下面编写一个定义数据类型别名的程序,并定义实现后面例程常用到的位操作及字符串操作函数. 1. 打开前面教程中创建的 ...

  2. 51单片机实战教程(34 线缆摇摆测试机设计)

    本文将讲解51单片机在线缆摇摆测试机中的应用,包含单片机程序及人机界面程序设计,将以本人以前做过的一个案子为例来做讲解. 公司外购一款线缆,进料检验时,需要做摇摆测试,以判定品质是否合格.公司当时没有 ...

  3. 51单片机实战教程(33 步进电机的驱动与控制)

    步进电机虽然同为电机的一种,但不能像直流电机或者交流电机那样按额定电压与电流给线圈通上直流或交流电机就可正常运转.它需要专用的驱动器或驱动电路供电,才可正常工作.每给驱动器一个脉冲信号,电机就转动一定 ...

  4. 51单片机实战教程(28 人机界面编程五)

    2本文将介绍Usart HMI常用指令 1 page指令 用于页面切换,使用格式 : page obj obj指页面名称或id, 示例: 有下面两个页面, 要从page0 切换到main 代码如下: ...

  5. 51单片机实战教程(21 同步串行外围通信接口SPI)

    SPI是Sysnchronous Serial Peripheral Interface 的缩写.SPI是一种全双工.高速.同步的通信总线,有两种操作模式:主模式和从模式.所谓全双工是指SPI主器件在 ...

  6. 51单片机实战教程(六 网线测试治具设计)

    我们日常接触的线材如USB.HDMI.VGA及网线等在生产过程中一般都需要做导通.线序测试.其中有Overmolding制程的产品还需做短路测试.其对应的连接器也需要做同样的测试.厂商的通常做法是购买 ...

  7. 51单片机实战教程(22 看门狗)

    在要求高可靠性的系统中,为防止系统在异常情况下或者受到异常干扰导致MCU/CPU程序跑飞,系统长时间异常工作, 通常的做法就是引入看门狗.如果MCU/CPU不在规定时间内按要求访问看门狗,看门狗就强迫 ...

  8. 51 单片机实战教程(13 外围芯片驱动程序之CS1237芯片驱动)

    CS1237芯片是一枚国产24位A/D转换芯片,输出速率可选:10Hz.40Hz.640Hz.1.28kHz.内置时钟电路,不需外部晶振.带可编程PGA,PGA放大倍数可选:1.2.64.128.2 ...

  9. 51 单片机实战教程(14 外围芯片驱动程序之LTC1658芯片驱动)

    LTC1658是一款14bit轨到轨DAC芯片.可选用3V或5V供电,采用3线串口通信(兼容SPI与MICROWIRE),其应用场景为数字校准.工业控制.自动测试设备等.它采用SOP8封装,Pin脚定 ...

最新文章

  1. 系统crash无法启动 tpm error / could not read size 0x8000000e
  2. 实现一个spring webservice服务端二:创建一个可以访问的webservice
  3. 电大计算机考试题目excel,电大计算机考试复习题EXCEL部分
  4. Flask 中的蓝图 Blueprint
  5. IDEA : IDEA好用的插件集锦
  6. notepad怎么设置python为环境变量_在Notepad++里配置python环境
  7. python解释器用什么写的_用 Python 从零开始写一个简单的解释器(3)
  8. 阿发你好java_191122_01 纯前端JS实现的文字验证码
  9. 从零实现深度学习框架——实现自己的Tensor对象
  10. java编程语言的常用快捷方式
  11. 呦乐乐_百科讲解大全
  12. 《WebGL编程指南》学习笔记——1.WebGL概述
  13. Excel单页导出以及多sheet导出
  14. 本地连接测试mysql失败,提示 flush hosts;
  15. 2019.8.10小结
  16. LeetCode-Python-362. 敲击计数器
  17. 旋转手机摄像头想法 -Camerax
  18. C# SQLite 数据库基本操作
  19. Linux清理Log日志,释放自增长的log文件
  20. java time_java常用类Time

热门文章

  1. T101对称二叉树(如何递归的经典demo)
  2. 空间大战java_回忆S60(塞班)年代的JAVA游戏:有没有哪一款是你在课堂偷偷玩的?...
  3. CVS命令深入研究 zz
  4. M1 MacBook 续航太好,苹果以为电量指示器坏了
  5. idea2020.2卡死在reading maven projects
  6. GitLab Projects 2020 插件配置
  7. 有哪些情人节 情人节大全
  8. Greenplum6 JDBC insert性能媲美MySQL
  9. Excel或者WPS 报insatlling Office Customization 路径找不到的问题
  10. 【清华集训2014】玛里苟斯