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

第77节:窗口里通过移动光标设置参数的液晶屏菜单程序

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

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

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

(2)实现功能:
通过按键设置4个不同的参数。
有1个窗口。每个窗口显示4个参数。每个参数的范围是从0到99。
有4个按键:
(a) 一个是设置参数S13按键,按下此按键,液晶屏的第一行会出现反显的光标,表示进入设置参数模式,再次按下此按键,反显光标会消失,表示退出设置参数模式。
(b) 一个是移动光标S9按键,在进入设置参数的模式下,依次按下此按键,液晶屏上的光标会从上往下移动,表示选中不同的参数。
(c) 一个是减数S5按键,在设置参数模式下,依次按下此按键,被选中的参数会逐渐减小。
(d) 一个是加数S1按键,在设置参数模式下,依次按下此按键,被选中的参数会逐渐加大。

(3)源代码讲解如下:

  1. #include "REG52.H"
  2. #define const_voice_short40 //蜂鸣器短叫的持续时间
  3. #define const_key_time120 //按键去抖动延时的时间
  4. #define const_key_time220 //按键去抖动延时的时间
  5. #define const_key_time320 //按键去抖动延时的时间
  6. #define const_key_time420 //按键去抖动延时的时间
  7. sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键
  8. sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键
  9. sbit key_sr3=P0^2; //对应朱兆祺学习板的S9键
  10. sbit key_sr4=P0^3; //对应朱兆祺学习板的S13键
  11. sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平
  12. sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
  13. sbitLCDCS_dr= P1^6;//片选线
  14. sbitLCDSID_dr = P1^7;//串行数据线
  15. sbitLCDCLK_dr = P3^2;//串行时钟线
  16. sbitLCDRST_dr = P3^4;//复位线
  17. void SendByteToLcd(unsigned char ucData);//发送一个字节数据到液晶模块
  18. void SPIWrite(unsigned char ucWData, unsigned char ucWRS); //模拟SPI发送一个字节的命令或者数据给液晶模块的底层驱动
  19. void WriteCommand(unsigned char ucCommand); //发送一个字节的命令给液晶模块
  20. void LCDWriteData(unsigned char ucData); //发送一个字节的数据给液晶模块
  21. void LCDInit(void);//初始化函数内部包括液晶模块的复位
  22. void display_clear(unsigned char ucFillDate); // 清屏 全部显示空填充0x00 全部显示点阵用0xff
  23. 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);//把字模插入画布.
  24. 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 uiOffSetAddr); //显示任意点阵函数
  25. unsigned char *number_to_matrix(unsigned charucBitNumber); //把一位数字转换成字模首地址的函数
  26. void delay_short(unsigned int uiDelayshort); //延时
  27. void delay_long(unsigned int uiDelayLong);
  28. void T0_time(); //定时中断函数
  29. void key_service(void); //按键服务的应用程序
  30. void key_scan(void);//按键扫描函数 放在定时中断里
  31. void initial_myself();
  32. void initial_peripheral();
  33. void lcd_display_service(void); //应用层面的液晶屏显示程序
  34. void clear_all_canvas(void);//把画布全部清零
  35. code

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

网站地图

Top