找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5262|回复: 0
打印 上一主题 下一主题
收起左侧

CT107D蓝桥杯板子 矩阵键盘的运用

[复制链接]
跳转到指定楼层
楼主
值得注意的是:蓝桥杯给的板子上键盘的第一列和第二列不是由 P37和P36控制的,分别是P44 和P42控制的

分别判断P3的前4位和后四位确定按下了哪个键,其中P44和P42要分开讨论



单片机源程序如下:
  1. //#include "reg52.h"  //定义51单片机特殊功能寄存器
  2. //#include "absacc.h"
  3. //
  4. //unsigned char temp;       
  5. //unsigned char value;
  6. //void delay()
  7. //{
  8. //        unsigned char i, j;
  9. //
  10. //        i = 108;
  11. //        j = 145;
  12. //        do
  13. //        {
  14. //                while (--j);
  15. //        } while (--i);
  16. //}
  17. //
  18. //void keydown()
  19. //{
  20. //        P3 = 0x0f;
  21. //        delay();                                      
  22. //    temp = P3;                                    
  23. //    if(temp != 0x0f)
  24. //    {
  25. //                switch(temp)
  26. //                {
  27. //                        case 0x0e: value = 1;break;
  28. //                        case 0x0d: value = 5;break;
  29. //                        case 0x0b: value = 9;break;
  30. //                        case 0x07: value = 13;break;
  31. //                }
  32. //        }
  33. //        P3 = 0xf0;
  34. //        delay();                                 
  35. //    temp = P3;
  36. //    if(temp != 0xf0)
  37. //        {
  38. //                switch(temp)
  39. //                {
  40. //                        case 0xe0: value += 3;break;
  41. //                        case 0xd0: value += 2;break;
  42. //                        case 0xb0: value += 1;break;
  43. //                        case 0x70: value += 0;break;
  44. //                }
  45. //        }
  46. //         while(P3 != 0xf0);
  47. //}
  48. //
  49. //int number(int x)
  50. //{
  51. //        switch(x)
  52. //        {
  53. //                case 0:return 0xC0;break;
  54. //                case 1:return 0xF9;break;
  55. //                case 2:return 0xA4;break;
  56. //                case 3:return 0xB0;break;
  57. //                case 4:return 0x99;break;
  58. //                case 5:return 0x92;break;
  59. //                case 6:return 0x82;break;
  60. //                case 7:return 0xF8;break;
  61. //                case 8:return 0x80;break;
  62. //                case 9:return 0x90;break;
  63. //                default :return 0xF3;break;
  64. //        }
  65. //}
  66. //
  67. //void main()
  68. //{       
  69. //        while(1)
  70. //        {
  71. //                keydown();
  72. //                P2 = ((P2&0x1f)|0xE0);
  73. //                P0 = 0xff;
  74. //                P2 &= 0x1f;
  75. //       
  76. //                P2 = ((P2&0x1f)|0xC0);
  77. //                P0 = 0x80;
  78. //                P2 &= 0x1f;
  79. //
  80. //                P2 = ((P2&0x1f)|0xE0);
  81. //                P0 = number(value);
  82. //                P2 &= 0x1f;
  83. //        }
  84. //}






  85. #include "reg52.h"  //定义51单片机特殊功能寄存器
  86. #include "absacc.h"

  87. sfr AUXR = 0x8E;
  88. sfr P4   = 0xC0;        //P4
  89. sbit P42 = P4^2;
  90. sbit P44 = P4^4;
  91.                            //  0    1    2    3    4    5    6    7    8    9   熄灭
  92. code unsigned char tab[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF};
  93. unsigned char dspbuf[8] = {10,10,10,10,10,10,10,10};  //显示缓冲区
  94. unsigned char dspcom = 0;

  95. bit key_re;
  96. unsigned char key_press;
  97. unsigned char key_value;

  98. bit key_flag = 0;
  99. unsigned char intr = 0;

  100. unsigned char read_keyboard(void);
  101. void display();

  102. //主函数
  103. void main(void)
  104. {
  105.     unsigned char key_temp = 0xff;
  106.    
  107.         AUXR |= 0x80;        //1T模式,IAP15F2K61S2单片机特殊功能寄存器
  108.        
  109.         TMOD &= 0xF0;
  110.         TL0 = 0xCD;       
  111.         TH0 = 0xD4;       
  112.         TF0 = 0;       
  113.         TR0 = 1;
  114.         ET0 = 1;
  115.         EA = 1;
  116.    
  117.     while(1)
  118.     {
  119.         if(key_flag)
  120.         {
  121.             key_flag = 0;
  122.                         key_temp = read_keyboard();
  123.                         if(key_temp != 0xFF){
  124.                                 dspbuf[7] = key_temp%10;
  125.                                 dspbuf[6] = key_temp/10;
  126.                         }
  127.         }
  128.         
  129.     }
  130. }

  131. //定时器中断服务函数
  132. void isr_timer_0(void)  interrupt 1  //默认中断优先级 1
  133. {     
  134.         display();
  135.         if(++intr == 10)  //1ms执行一次
  136.         {
  137.         intr = 0;
  138.                 key_flag = 1;  //10ms按键扫描标志位置1
  139.     }
  140. }

  141. //读取矩阵键盘键值:转接板中使用P42和P44代替8051引脚
  142. //顺序中的P36和P37引脚
  143. unsigned char read_keyboard(void)
  144. {
  145.     static unsigned char col;
  146.    
  147.         P3 = 0xf0; P42 = 1; P44 = 1;

  148.     if((P3 != 0xf0)||(P42 != 0)||(P44 != 0)) //有按键按下
  149.         key_press++;
  150.         else
  151.                 key_press = 0;  //抖动
  152.    
  153.     if(key_press == 3)
  154.     {
  155.                 key_press = 0;
  156.                 key_re = 1;
  157.                
  158.                 if(P44 == 0)                        col = 1;
  159.                 if(P42 == 0)                        col = 2;
  160.                 if((P3 & 0x20) == 0)        col = 3;
  161.                 if((P3 & 0x10) == 0)        col = 4;
  162.         
  163.         P3 = 0x0F; P42 = 0; P44 = 0;

  164.                 if((P3&0x01) == 0)        key_value = (col-1);
  165.                 if((P3&0x02) == 0)        key_value = (col+3);
  166.                 if((P3&0x04) == 0)        key_value = (col+7);
  167.                 if((P3&0x08) == 0)        key_value = (col+11);
  168.     }
  169.    
  170.         //连续三次检测到按键被按下,并且该按键已经释放
  171.         P3 = 0x0f; P42 = 0; P44 = 0;
  172.        
  173.     if(((key_re == 1) && (P3 == 0x0f))&&(P42 == 0)&&(P44 == 0))
  174.     {
  175.         key_re = 0;
  176.         return key_value;
  177. ……………………

  178. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
矩阵键盘.rar (27.03 KB, 下载次数: 35)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表