微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第78节:多个窗口里移动光标设置参数的液晶屏菜单程序

第78节:多个窗口里移动光标设置参数的液晶屏菜单程序

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

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

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

(2)实现功能:
通过按键设置8个不同的参数。
有2个窗口。每个窗口显示4个参数。每个参数的范围是从0到99。
有4个按键:
(a) 一个是设置参数S13按键,按下此按键,液晶屏的第1个窗口第一行会出现反显的光标,表示进入设置参数模式,再次按下此按键,反显光标会消失,并且强行切换到第1个窗口,表示退出设置参数模式。
(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 unsigned char*ucArray,unsigned char ucFbFlag,unsigned int x_amount,unsigned int y_amount,unsigned int uiOffSetAdd

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

网站地图

Top