微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第79节:通过主菜单移动光标来进入子菜单窗口的液晶屏程序

第79节:通过主菜单移动光标来进入子菜单窗口的液晶屏程序

时间:11-22 来源:互联网 点击:
开场白:
其实主菜单窗口与子菜单窗口本质都是多窗口菜单程序,只不过我在按键服务程序里面建立起来了一条主窗口与子窗口的关系链。这个关系链还是用switch语句搭建起来的,在某个窗口某个局部显示上,操作某个按键就会切换到不同的窗口显示。
继续巩固上一节教给大家的两个知识点:
第一个知识点:我在前面讲数码管显示的时候就提出了一个 “一二级菜单显示理论”:凡是人机界面显示,不管是数码管还是液晶屏,都可以把显示的内容分成不同的窗口来显示,每个显示的窗口中又可以分成不同的局部显示。其中窗口就是一级菜单,用ucWd变量表示。局部就是二级菜单,用ucWdxPart来表示。不同的窗口,会有不同的更新显示变量ucWdXUpdate来对应,表示整屏全部更新显示。不同的局部,也会有不同的更新显示变量ucWdXPartYUpdate来对应,表示局部更新显示。把每一个窗口的内容分为两种类型,一种类型是那些不用经常刷新显示的内容,只有在切换窗口的时候才需要更新的,这种内容放在整屏更新显示的括号里,比如清屏操作等内容。另外一种是那些经常需要刷新显示的内容,这种内容放在局部更新显示的括号里。
第二个知识点:按键如何跟液晶屏显示有机的结合起来?只要遵循鸿哥总结出来的一个规律“在不同的窗口下,根据不同的局部变量来操作不同的参数”,这样再复杂的人机交互程序都会显得很简单清晰。

具体内容,请看源代码讲解。

(1)硬件平台:基于朱兆祺51单片机学习板。加按键对应S1键,减按键对应S5键,切换“光标”移动按键对应S9键,设置参数按键对应S13键。

(2)实现功能:
通过按键设置6个不同的参数。
有4个窗口。第1个窗口是主菜单界面,通过光标切换可以进去设置不同参数的子菜单界面。第2个窗口是设置时间范围界面。第3个窗口是设置速度范围界面。第4个窗口是设置频率范围界面。每个设置界面显示2个参数。每个参数的范围是从0到99。
有4个按键:
(a) 一个是进入和退出S13按键,按一次进入选中的子菜单。再按一次退出子菜单。
(b) 一个是移动光标S9按键,依次按下此按键,液晶屏上的光标会从上往下移动,表示选中不同的参数。当移动到每个窗口最下边那一行时,再按下此按键会把光标移动到第一个参数。
(c) 一个是减数S5按键,在设置参数模式下,依次按下此按键,被选中的参数会逐渐减小。
(d) 一个是加数S1按键,在设置参数模式下,依次按下此按键,被选中的参数会逐渐加大。

(3)源代码讲解如下:

  1. #include "REG52.H"
  2. /* 注释一:
  3. * 本程序用到的变量比较多,所以在keil编译模式里要设置一下编译模式memory model,
  4. * 否则编译会出错.右键单击Target选择“Options for TargetTarget1”就会出来一个框
  5. * 在memory model中选择compact:variables in pdata 就可以了。
  6. */
  7. #define const_voice_short40 //蜂鸣器短叫的持续时间
  8. #define const_key_time120 //按键去抖动延时的时间
  9. #define const_key_time220 //按键去抖动延时的时间
  10. #define const_key_time320 //按键去抖动延时的时间
  11. #define const_key_time420 //按键去抖动延时的时间
  12. sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键
  13. sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键
  14. sbit key_sr3=P0^2; //对应朱兆祺学习板的S9键
  15. sbit key_sr4=P0^3; //对应朱兆祺学习板的S13键
  16. sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平
  17. sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
  18. sbitLCDCS_dr= P1^6;//片选线
  19. sbitLCDSID_dr = P1^7;//串行数据线
  20. sbitLCDCLK_dr = P3^2;//串行时钟线
  21. sbitLCDRST_dr = P3^4;//复位线
  22. void SendByteToLcd(unsigned char ucData);//发送一个字节数据到液晶模块
  23. void SPIWrite(unsigned char ucWData, unsigned char ucWRS); //模拟SPI发送一个字节的命令或者数据给液晶模块的底层驱动
  24. void WriteCommand(unsigned char ucCommand); //发送一个字节的命令给液晶模块
  25. void LCDWriteData(unsigned char ucData); //发送一个字节的数据给液晶模块
  26. void LCDInit(void);//初始化函数内部包括液晶模块的复位
  27. void display_clear(unsigned char ucFillDate); // 清屏 全部显示空填充0x00 全部显示点阵用0xff
  28. void insert_buffer_to_canvas(unsigned int x,unsigned int y,const unsigned char*ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount);//把字模插入画布.
  29. void display_lattice(unsigned int x,unsigned int y,const

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top