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

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

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

  1. 节的横向是4个字节,这节的横向是6个字节。
  2. */
  3. unsigned char ucCanvasBuffer[]=
  4. {
  5. 0x00,0x00,0x00,0x00,0x00,0x00,//上半屏
  6. 0x00,0x00,0x00,0x00,0x00,0x00,
  7. 0x00,0x00,0x00,0x00,0x00,0x00,
  8. 0x00,0x00,0x00,0x00,0x00,0x00,
  9. 0x00,0x00,0x00,0x00,0x00,0x00,
  10. 0x00,0x00,0x00,0x00,0x00,0x00,
  11. 0x00,0x00,0x00,0x00,0x00,0x00,
  12. 0x00,0x00,0x00,0x00,0x00,0x00,
  13. //------------上半屏和下半屏的分割线-----------
  14. 0x00,0x00,0x00,0x00,0x00,0x00,//下半屏
  15. 0x00,0x00,0x00,0x00,0x00,0x00,
  16. 0x00,0x00,0x00,0x00,0x00,0x00,
  17. 0x00,0x00,0x00,0x00,0x00,0x00,
  18. 0x00,0x00,0x00,0x00,0x00,0x00,
  19. 0x00,0x00,0x00,0x00,0x00,0x00,
  20. 0x00,0x00,0x00,0x00,0x00,0x00,
  21. 0x00,0x00,0x00,0x00,0x00,0x00,
  22. };
  23. /* 注释二:
  24. * 以下4个变量记录一个参数的4种信息,包括小数点的数量,个数,数据的位置,数组具体值.
  25. */
  26. unsigned char ucDotCnt_1=0;//记录当前输入的小数点数量,如果小数点的数量不为0,说明当前数组已包含小数点,此时再按小数点按键则无效
  27. unsigned char ucDotBitS_1=0; //记录当前输入的小数点个数,如果小数点的个量如果超过规定2位,此时再按任何输入按键则无效
  28. unsigned char ucWdPartCnt_1=0; //记录当前输入的数据在数组中的位置。
  29. unsigned char ucDataBuffer_1[6]={0,10,10,10,10,10}; //一项的BCD码数组缓冲
  30. unsigned char ucKeyStep=1;//按键扫描步骤变量
  31. unsigned char ucKeySec=0; //被触发的按键编号
  32. unsigned intuiKeyTimeCnt=0; //按键去抖动延时计数器
  33. unsigned char ucKeyLock=0; //按键触发后自锁的变量标志
  34. unsigned char ucRowRecord=1; //记录当前扫描到第几列了
  35. unsigned intuiVoiceCnt=0;//蜂鸣器鸣叫的持续时间计数器
  36. unsigned char ucWd=1; //窗口变量
  37. unsigned char ucPart=1; //局部变量 0代表没有选中任何一行,其它数值1到4代表选中某一行
  38. unsigned char ucWd1Update=1; //窗口1的整屏更新显示变量 1代表更新显示,响应函数内部会清零
  39. unsigned char ucWd1Part1Update=0; //窗口1的第1行局部更新显示变量1代表更新显示,响应函数内部会清零
  40. void main()
  41. {
  42. initial_myself(); //第一区,上电后马上初始化
  43. delay_long(100); //一线,延时线。延时一段时间
  44. initial_peripheral();//第二区,上电后延时一段时间再初始化
  45. while(1) //第三区
  46. {
  47. key_service(); //按键服务程序
  48. lcd_display_service(); //应用层面的液晶屏显示程序
  49. }
  50. }
  51. void initial_myself()//第一区 上电后马上初始化
  52. {
  53. beep_dr=1; //用PNP三极管控制蜂鸣器,输出高电平时不叫。
  54. TMOD=0x01;//设置定时器0为工作方式1
  55. TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f
  56. TL0=0x2f;
  57. }
  58. void initial_peripheral() //第二区 上电后延时一段时间再初始化
  59. {
  60. LCDInit(); //初始化12864 内部包含液晶模块的复位
  61. EA=1; //开总中断
  62. ET0=1; //允许定时中断
  63. TR0=1; //启动定时中断
  64. }
  65. void T0_time() interrupt 1
  66. {
  67. TF0=0;//清除中断标志
  68. TR0=0; //关中断
  69. key_scan();//按键扫描函数 放在定时中断里
  70. if(uiVoiceCnt!=0)
  71. {
  72. uiVoiceCnt--; //每次进入定时中断都自减1,直到等于零为止。才停止鸣叫
  73. beep_dr=0;//蜂鸣器是PNP三极管控制,低电平就开始鸣叫。
  74. }
  75. else
  76. {
  77. ; //此处多加一个空指令,想维持跟if括号语句的数量对称,都是两条指令。不加也可以。
  78. beep_dr=1;//蜂鸣器是PNP三极管控制,高电平就停止鸣叫。
  79. }
  80. TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f
  81. TL0=0x2f;
  82. TR0=1;//开中断
  83. }
  84. void key_scan()//按键扫描函数 放在定时中断里
  85. {
  86. switch(ucKeyStep)
  87. {
  88. case 1: //按键扫描输出第ucRowRecord列低电平
  89. if(ucRowRecord==1)//第一列输出低电平
  90. {
  91. key_dr1=0;
  92. key_dr2=1;
  93. key_dr3=1;
  94. key_dr4=1;
  95. }
  96. else if(ucRowRecord==2)//第二列输出低电平
  97. {
  98. key_dr1=1;
  99. key_dr2=0;
  100. key_dr3=1;
  101. key_dr4=1;
  102. }
  103. else if(ucRowRecord==3)//第三列输出低电平
  104. {
  105. key_dr1=1;
  106. key_dr2=1;
  107. key_dr3=0;
  108. key_dr4=1;
  109. }
  110. else //第四列输出低电平
  111. {
  112. key_dr1=1;
  113. key_dr2=1;
  114. key_dr3=1;
  115. key_dr4=0;
  116. }
  117. uiKeyTimeCnt=0;//延时计数器清零
  118. ucKeyStep++; //切换到下一个运行步骤
  119. break;
  120. case 2: //此处的小延时用来等待刚才列输出信号稳定,再判断输入信号。不是去抖动延时。
  121. uiKeyTimeCnt++;
  122. if(uiKeyTimeCnt>1)

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

网站地图

Top