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

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

时间:11-22 来源:互联网 点击:

  1. xf8; //重装初始值(65535-2000)=63535=0xf82f
  2. TL0=0x2f;
  3. }
  4. void initial_peripheral() //第二区 上电后延时一段时间再初始化
  5. {
  6. LCDInit(); //初始化12864 内部包含液晶模块的复位
  7. EA=1; //开总中断
  8. ET0=1; //允许定时中断
  9. TR0=1; //启动定时中断
  10. }
  11. void T0_time() interrupt 1
  12. {
  13. TF0=0;//清除中断标志
  14. TR0=0; //关中断
  15. key_scan(); //按键扫描函数
  16. if(uiVoiceCnt!=0)
  17. {
  18. uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
  19. beep_dr=0;//蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
  20. }
  21. else
  22. {
  23. ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
  24. beep_dr=1;//蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
  25. }
  26. TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f
  27. TL0=0x2f;
  28. TR0=1;//开中断
  29. }
  30. void key_scan(void)//按键扫描函数 放在定时中断里
  31. {
  32. static unsigned intuiKeyTimeCnt1=0; //按键去抖动延时计数器
  33. static unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志
  34. static unsigned intuiKeyTimeCnt2=0; //按键去抖动延时计数器
  35. static unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志
  36. static unsigned intuiKeyTimeCnt3=0; //按键去抖动延时计数器
  37. static unsigned char ucKeyLock3=0; //按键触发后自锁的变量标志
  38. static unsigned intuiKeyTimeCnt4=0; //按键去抖动延时计数器
  39. static unsigned char ucKeyLock4=0; //按键触发后自锁的变量标志
  40. if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  41. {
  42. ucKeyLock1=0; //按键自锁标志清零
  43. uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  44. }
  45. else if(ucKeyLock1==0)//有按键按下,且是第一次被按下
  46. {
  47. uiKeyTimeCnt1++; //累加定时中断次数
  48. if(uiKeyTimeCnt1>const_key_time1)
  49. {
  50. uiKeyTimeCnt1=0;
  51. ucKeyLock1=1;//自锁按键置位,避免一直触发
  52. ucKeySec=1; //触发1号键
  53. }
  54. }
  55. if(key_sr2==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  56. {
  57. ucKeyLock2=0; //按键自锁标志清零
  58. uiKeyTimeCnt2=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  59. }
  60. else if(ucKeyLock2==0)//有按键按下,且是第一次被按下
  61. {
  62. uiKeyTimeCnt2++; //累加定时中断次数
  63. if(uiKeyTimeCnt2>const_key_time2)
  64. {
  65. uiKeyTimeCnt2=0;
  66. ucKeyLock2=1;//自锁按键置位,避免一直触发
  67. ucKeySec=2; //触发2号键
  68. }
  69. }
  70. if(key_sr3==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  71. {
  72. ucKeyLock3=0; //按键自锁标志清零
  73. uiKeyTimeCnt3=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  74. }
  75. else if(ucKeyLock3==0)//有按键按下,且是第一次被按下
  76. {
  77. uiKeyTimeCnt3++; //累加定时中断次数
  78. if(uiKeyTimeCnt3>const_key_time3)
  79. {
  80. uiKeyTimeCnt3=0;
  81. ucKeyLock3=1;//自锁按键置位,避免一直触发
  82. ucKeySec=3; //触发3号键
  83. }
  84. }
  85. if(key_sr4==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  86. {
  87. ucKeyLock4=0; //按键自锁标志清零
  88. uiKeyTimeCnt4=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  89. }
  90. else if(ucKeyLock4==0)//有按键按下,且是第一次被按下
  91. {
  92. uiKeyTimeCnt4++; //累加定时中断次数
  93. if(uiKeyTimeCnt4>const_key_time4)
  94. {
  95. uiKeyTimeCnt4=0;
  96. ucKeyLock4=1;//自锁按键置位,避免一直触发
  97. ucKeySec=4; //触发4号键
  98. }
  99. }
  100. }
  101. void key_service(void) //按键服务的应用程序
  102. {
  103. switch(ucKeySec) //按键服务状态切换
  104. {
  105. case 1:// 加按键 对应朱兆祺学习板的S1键
  106. switch(ucWd)//在不同的窗口下,设置不同的参数
  107. {
  108. case 1://窗口1
  109. switch(ucPart)//在窗口1下,根据不同的局部变量来设置不同的参数
  110. {
  111. case 0: //无光标显示的状态 此处的case 0可以省略
  112. break;
  113. case 1: //设置第1行参数
  114. ucData_1_1++;
  115. if(ucData_1_1>99)
  116. {
  117. ucData_1_1=99;
  118. }
  119. ucWd1Part1Update=1; //1代表更新显示,响应函数内部会清零
  120. break;
  121. case 2: //设置第2行参数
  122. ucData_1_2++;
  123. if(ucData_1_2>99)
  124. {
  125. ucData_1_2=99;
  126. }
  127. ucWd1Part2Update=1; //1代表更新显示,响应函数内部会清零
  128. break;
  129. case 3:

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

网站地图

Top