飞道的博客

蓝桥杯单片机----矩阵键盘的基本控制

187人阅读  评论(0)

        在CT107D单片机综合训练平台上,首先将J5处的跳帽接到1~2引脚,使按键S4~S19按键组成4X4的矩阵键盘。

        需要注意的是比赛的时候用的IAP15f2k61s2单片机是没有P36和P37的,是用P44代替P37,P42代替P36,所有写程序的时候需要注意一下,大家应该对矩阵键盘的扫描原理清楚吧,这里不在对矩阵键盘的扫描原理做讲解,主要是针对一个题目做出相应程序设计。

内容设计:

        1.不同按键对应不同的键值,例如S7对应数字7,S19对应数字19,在数码管后两位上显示出来;

        2.数字不足两位的数码管应只显示一位,另外一个关闭。

 


  
  1. #include<stc15f2k60s2.h>
  2. #define uchar unsigned char //定义无符号字符类型uchar
  3. #define uint unsigned int //定义无符号整型类型uint
  4. uchar code tab[]={ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xbf, 0xff}; //数字0~9,“-”,“关”
  5. uchar qi,ba; //定义字符型变量qi,ba,当作数码管显示控制变量
  6. uchar num= 0;
  7. void delayms(int ms); //延时函数
  8. void allinit(); //初始化函数
  9. void keyscan16(); //矩阵按键函数
  10. void display4(uchar qi,uchar ba); //第七、八段数码管函数
  11. void main()//主函数
  12. {
  13. allinit(); //初始化函数
  14. while( 1)
  15. {
  16. if(num>= 10){qi=num/ 10;ba=num% 10;} //键值大于等于10,数码管分两位显示
  17. else {qi= 11;ba=num;} //键值小于10,数码管显示一位,另外一位熄灭
  18. keyscan16(); //矩阵按键函数
  19. display4(qi,ba); //第七、八段数码管函数
  20. }
  21. }
  22. void keyscan16()//矩阵按键函数
  23. {
  24. uchar temp; //定义一个无符号变量temp
  25. P44= 0;P42= 1;P3= 0x7f; //让第一列按键为低电平
  26. temp=P3; //把P3的值赋给temp
  27. temp=temp& 0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
  28. if(temp!= 0x0f) //判断第一列是否有按键按下
  29. {
  30. delayms( 5); //延时5ms,用来按键消抖
  31. temp=P3; //把P3的值重新赋给temp
  32. temp=temp& 0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
  33. if(temp!= 0x0f) //再次判断第一列是否有按键按下
  34. {
  35. temp=P3; //把P3的值重新赋给temp
  36. switch(temp)
  37. {
  38. case 0x7e:num= 7; break; //第一列第一个按键按下
  39. case 0x7d:num= 6; break; //第一列第二个按键按下
  40. case 0x7b:num= 5; break; //第一列第三个按键按下
  41. case 0x77:num= 4; break; //第一列第四个按键按下
  42. }
  43. while(temp!= 0x0f) //无按键按下则进入循环
  44. {
  45. temp=P3; //把P3的值重新赋给temp
  46. temp=temp& 0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
  47. }
  48. }
  49. }
  50. P44= 1;P42= 0;P3= 0xbf; //让第二列按键为低电平
  51. temp=P3; //把P3的值赋给temp
  52. temp=temp& 0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
  53. if(temp!= 0x0f) //判断第一列是否有按键按下
  54. {
  55. delayms( 5); //延时5ms,用来按键消抖
  56. temp=P3; //把P3的值重新赋给temp
  57. temp=temp& 0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
  58. if(temp!= 0x0f) //再次判断第一列是否有按键按下
  59. {
  60. temp=P3; //把P3的值重新赋给temp
  61. switch(temp)
  62. {
  63. case 0xbe:num= 11; break; //第二列第一个按键按下
  64. case 0xbd:num= 10; break; //第二列第二个按键按下
  65. case 0xbb:num= 9; break; //第二列第三个按键按下
  66. case 0xb7:num= 8; break; //第二列第四个按键按下
  67. }
  68. while(temp!= 0x0f) //无按键按下则进入循环
  69. {
  70. temp=P3; //把P3的值重新赋给temp
  71. temp=temp& 0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
  72. }
  73. }
  74. }
  75. P44= 1;P42= 1;P3= 0xdf; //让第三列按键为低电平
  76. temp=P3; //把P3的值赋给temp
  77. temp=temp& 0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
  78. if(temp!= 0x0f) //判断第一列是否有按键按下
  79. {
  80. delayms( 5); //延时5ms,用来按键消抖
  81. temp=P3; //把P3的值重新赋给temp
  82. temp=temp& 0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
  83. if(temp!= 0x0f) //再次判断第一列是否有按键按下
  84. {
  85. temp=P3; //把P3的值重新赋给temp
  86. switch(temp)
  87. {
  88. case 0xde:num= 15; break; //第三列第一个按键按下
  89. case 0xdd:num= 14; break; //第三列第二个按键按下
  90. case 0xdb:num= 13; break; //第三列第三个按键按下
  91. case 0xd7:num= 12; break; //第三列第四个按键按下
  92. }
  93. while(temp!= 0x0f) //无按键按下则进入循环
  94. {
  95. temp=P3; //把P3的值重新赋给temp
  96. temp=temp& 0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
  97. }
  98. }
  99. }
  100. P44= 1;P42= 1;P3= 0xef; //让第四列按键为低电平
  101. temp=P3; //把P3的值赋给temp
  102. temp=temp& 0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
  103. if(temp!= 0x0f) //判断第一列是否有按键按下
  104. {
  105. delayms( 5); //延时5ms,用来按键消抖
  106. temp=P3; //把P3的值重新赋给temp
  107. temp=temp& 0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
  108. if(temp!= 0x0f) //再次判断第一列是否有按键按下
  109. {
  110. temp=P3; //把P3的值重新赋给temp
  111. switch(temp)
  112. {
  113. case 0xee:num= 19; break; //第四列第一个按键按下
  114. case 0xed:num= 18; break; //第四列第二个按键按下
  115. case 0xeb:num= 17; break; //第四列第三个按键按下
  116. case 0xe7:num= 16; break; //第四列第四个按键按下
  117. }
  118. while(temp!= 0x0f) //无按键按下则进入循环
  119. {
  120. temp=P3; //把P3的值重新赋给temp
  121. temp=temp& 0x0f; //把temp的值和0x0f相与,得到的值再赋给temp,依次来判断第一列是否有按键按下
  122. }
  123. }
  124. }
  125. }
  126. void delayms(int ms)//延时函数
  127. {
  128. uint i,j;
  129. for(i=ms;i> 0;i--)
  130. for(j= 845;j> 0;j--);
  131. }
  132. void allinit()//初始化函数
  133. {
  134. P2= 0XA0;P0= 0X00; //关闭蜂鸣器继电器
  135. P2= 0X80;P0= 0XFF; //关闭所有LED灯
  136. P2= 0XC0;P0= 0XFF; //选中所有数码管段选
  137. P2= 0XFF;P0= 0XFF; //关闭所有数码管
  138. }
  139. void display4(uchar qi,uchar ba)//第七、八段数码管函数
  140. {
  141. P2= 0XC0;P0= 0X40; //选中第七个数码管段选
  142. P2= 0XFF;P0=tab[qi]; //让第一个数码管显示qi指向的值
  143. delayms( 1); //延时1ms
  144. P2= 0XC0;P0= 0X80; //选中第八个数码管段选
  145. P2= 0XFF;P0=tab[ba]; //让第一个数码管显示ba指向的值
  146. delayms( 1); //延时1ms
  147. }

 


转载:https://blog.csdn.net/qq_45385706/article/details/115510146
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场