微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第83节:矩阵键盘输入任意数字或小数点的液晶屏显示程序

第83节:矩阵键盘输入任意数字或小数点的液晶屏显示程序

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

  1. }
  2. }
  3. void key_number_input(unsigned char ucKeyNumber) //输入数字按键
  4. {
  5. switch(ucWd)
  6. {
  7. case 1: //第1窗口。本节程序只有1个窗口
  8. switch(ucPart)
  9. {
  10. case 1://1窗口第1项
  11. set_data(ucKeyNumber,2,6,&ucDotCnt_1,&ucDotBitS_1,&ucWdPartCnt_1,ucDataBuffer_1); //设置参数,请看本函数具体内容。本节的核心内容,值得好好研究!
  12. ucWd1Part1Update=1;//更新显示
  13. break;
  14. }
  15. break;
  16. }
  17. }
  18. /* 注释三:
  19. * 本节的核心函数,值得好好研究!
  20. * 涉及到参数的4种信息,包括小数点的数量,个数,数据的位置,数组具体值。以及它们之间的相互作用关系。
  21. * 以下参数,指针类型的参数是让代入的全局变量在退出函数后维持它当前最新更改的数值不变。
  22. * 第1个参数ucKeyNumberTemp是当前按键输入的数值。
  23. * 第2个参数ucDotBitMax是限定被设置参数的小数点最大位数。
  24. * 第3个参数ucDataCntMax是限定被设置参数的最大数组个数。
  25. * 第4个参数*p_ucDotCnt是记录当前输入的小数点数量,如果小数点的数量不为0,说明当前数组已包含小数点,此时再按小数点按键则无效。
  26. * 第5个参数*p_ucDotBitS是记录当前输入的小数点个数,如果小数点的个量如果超过规定2位,此时再按任何输入按键则无效
  27. * 第6个参数*p_ucWdPartCnt是记录当前输入的数据在数组中的位置,方便锁定每次按键输入的数字显示位置。
  28. * 第7个参数*p_ucSetDataBuffer是BCD码数组缓冲的具体数字内容。
  29. */
  30. void set_data(unsigned char ucKeyNumberTemp,unsigned char ucDotBitMax,unsigned char ucDataCntMax,unsigned char *p_ucDotCnt,unsigned char *p_ucDotBitS,unsigned char *p_ucWdPartCnt,unsigned char *p_ucSetDataBuffer)
  31. {
  32. unsigned int i;
  33. if(ucKeyNumberTemp==11) //等于小数点
  34. {
  35. if(ucDotBitMax==0) //如果限定的小数点最大数是0,就意味着此数据不允许带小数点,必须是整数。
  36. {
  37. return; //直接返回退出
  38. }
  39. else if(*p_ucDotCnt>0)//小数点个数大于0,意味着当前数组已经包含了小数点,此时再输入小数点则无效。
  40. {
  41. return; //直接返回退出
  42. }
  43. else//否则有效,记录当前已经包含一个小数点的信息。
  44. {
  45. *p_ucDotCnt=1;//只能包含一个小数点
  46. }
  47. }
  48. else if(*p_ucDotCnt==1) //如果输入的不是小数点,并且之前已经输入了一个小数点,那么此时输入的数字就是小数点后的数据
  49. {
  50. if(*p_ucDotBitS
  51. {
  52. *p_ucDotBitS=(*p_ucDotBitS)+1;
  53. }
  54. else //如果小数点位数已经超过允许的范围,则输入的按键无效,直接退出。
  55. {
  56. return; //直接返回退出
  57. }
  58. }
  59. if(*p_ucWdPartCnt<(ucDataCntMax-1))//当输入的有效BCD码不超过最大数组缓冲时
  60. {
  61. if(*p_ucWdPartCnt==0&&p_ucSetDataBuffer[0]==0&&ucKeyNumberTemp!=11)//如果当前默认位置是第0个位置,并且默认第0个数据是0,并且当前的按键输入不是小数点,则不用移位
  62. {
  63. ;
  64. }
  65. else//否则,移位
  66. {
  67. for(i=0;i<(ucDataCntMax-1);i++)//移位
  68. {
  69. p_ucSetDataBuffer[ucDataCntMax-1-i]=p_ucSetDataBuffer[ucDataCntMax-2-i];
  70. }
  71. *p_ucWdPartCnt=(*p_ucWdPartCnt)+1;
  72. }
  73. p_ucSetDataBuffer[0]=ucKeyNumberTemp; //当前输入的数字或者小数点永远在第右边第0个位置。
  74. }
  75. }
  76. void key_delete_input(void) //删除按键
  77. {
  78. static unsigned int i;
  79. switch(ucWd)
  80. {
  81. case 1: //第1窗口。本节程序只有1个窗口
  82. switch(ucPart)
  83. {
  84. case 1://1窗口第1项
  85. //清零
  86. ucDotBitS_1=0;
  87. ucDotCnt_1=0;
  88. ucWdPartCnt_1=0;
  89. for(i=0;i<6;i++)
  90. {
  91. ucDataBuffer_1[i]=10;
  92. }
  93. ucDataBuffer_1[0]=0; //第0个位置填入0
  94. ucWd1Part1Update=1;//更新显示
  95. break;
  96. }
  97. break;
  98. }
  99. }
  100. unsigned char *number_to_matrix(unsigned charucBitNumber)
  101. {
  102. unsigned char *p_ucAnyNumber;//此指针根据ucBitNumber数值的大小,分别调用

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

网站地图

Top