找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求单片机大神帮我看看这个需要改哪里?非常感谢(单片机键盘)

[复制链接]
跳转到指定楼层
楼主
3黑币
  1. #include<reg51.h>
  2. void delay50ms()
  3. {
  4. unsigned t;
  5.         for(t=0;t<0x01;t++)
  6.         {
  7.                 TMOD=0x10;
  8.                 TH1=0x33;
  9.                 TL1=0xb0;
  10.                 TR1=1;
  11.                 while(!TF1);
  12.                 TF1=0;
  13.         }
  14. }
  15. unsigned char n[17]={0xcf,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x81};
  16. unsigned char k;
  17. unsigned char scan_key(void)
  18. {
  19.         unsigned char temp;
  20.         P1=0x0f;
  21.         while(temp!=0x0f)
  22.         {
  23.                 delay50ms();
  24.         }
  25.         while(temp!=0x0f)
  26.         {
  27.                 P1=0xfe<<1;
  28.                 switch(temp)
  29.                 {
  30.                         case 0xee:k=1;break;
  31.                         case 0xde:k=2;break;
  32.                         case 0xbe:k=3;break;
  33.                         case 0x8e:k=4;break;
  34.                         case 0xed:k=5;break;
  35.                         case 0xdd:k=6;break;
  36.                         case 0xbd:k=7;break;
  37.                         case 0x8d:k=8;break;
  38.                         case 0xeb:k=9;break;
  39.                         case 0xdb:k=10;break;
  40.                         case 0xbb:k=11;break;
  41.                         case 0x8b:k=12;break;
  42.                         case 0xe8:k=13;break;
  43.                         case 0xd8:k=14;break;
  44.                         case 0xb8:k=15;break;
  45.                         case 0x88:k=16;break;
  46.                         default:break;
  47.                                 }
  48.                         }
  49.                 P2=n[k];
  50.                 P3=~n[k];
  51.                 return 0;
  52. }
复制代码


屏幕截图 2021-10-26 152352.png (75.49 KB, 下载次数: 28)

屏幕截图 2021-10-26 152352.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:916650 发表于 2021-10-27 08:34 | 只看该作者
个人觉得你的代码逻辑有很大的问题,没有理解按键检测的原理。

首先,你定义了一个temp,然后P1=0x0f,怎么突然之间就跳到while(temp!=0x0f)了?中间不应该有个temp=P1的过程?

其次,检测到temp!=0x0f后,为什么让P1=0xfe<<1?这也不会令P1最终得到真实的按键状态啊。最终只会导致P1==0x00。

最后,switch(temp)这,temp并没有得到真实的按键状态(P1口)对应的电平状态,自然会导致switch(temp)下面的语句没起任何作用。

建议找本教材,比如郭天祥的,看看按键检测的原理以及例程。或者看看视频的讲解,理解原理之后再写代码。
回复

使用道具 举报

板凳
ID:916650 发表于 2021-10-27 09:12 | 只看该作者




  1.                 #include<reg52.h>
  2.                 #include<intrins.h>
  3.                 #define uchar unsigned char
  4.                 #define uint unsigned int
  5.                                
  6.                 sbit DX=P2^6;//(P0为数码管输出端口)
  7.                 sbit WX=P2^7;
  8.                 sbit S2=P3^4;
  9.                
  10.                                
  11.                 uchar code Table_D[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  12.                 uchar code Table_W[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  13.                        
  14.                 void Delay_Us(uchar x);
  15.                 void Delay_Ms(uchar x);
  16.                 void Display(uint x);
  17.                
  18.                 void Key_Scan();
  19.                
  20.                 uchar Display_Num;
  21.                                
  22.                 void main()
  23.                         {
  24.                                 while(1)
  25.                                 {
  26.                                         Key_Scan();
  27.                                         Display(Display_Num);
  28.                                 }
  29.                         }
  30.                                
  31.                 void Delay_Us(uchar x)//12MHz_Delay:6x+10us;11.0592MHz=12MHz_Delay*1.085.
  32.                                 {
  33.                                          while(x--);
  34.                                 }
  35.                
  36.                 void Delay_Ms(uchar x)//12MHz_Delay:x+0.5~1Ms;11.0592MHz=12MHz_Delay*1.085.
  37.                                 {
  38.                                         while(x--)
  39.                                         {
  40.                                                 Delay_Us(75);
  41.                                                 Delay_Us(75);
  42.                                          }
  43.                             }
  44.                                
  45.                                 void Display(uint x)
  46.                                  {
  47.                                         P0=0xff;
  48.                                         WX=1;
  49.                                         WX=0;
  50.                                         P0=Table_D[x/100];
  51.                                         DX=1;
  52.                                         DX=0;
  53.                                         P0=Table_W[0];
  54.                                         WX=1;
  55.                                         WX=0;               
  56.                                         Delay_Ms(5);
  57.                                        
  58.                                         P0=0xff;
  59.                                         WX=1;
  60.                                         WX=0;
  61.                                         P0=Table_D[x%100/10];
  62.                                         DX=1;
  63.                                         DX=0;
  64.                                         P0=Table_W[1];
  65.                                         WX=1;
  66.                                         WX=0;       
  67.                                         Delay_Ms(5);
  68.                                        
  69.                                         P0=0xff;
  70.                                         WX=1;
  71.                                         WX=0;
  72.                                         P0=Table_D[x%100%10];
  73.                                         DX=1;
  74.                                         DX=0;
  75.                                         P0=Table_W[2];
  76.                                         WX=1;
  77.                                         WX=0;
  78.                                         Delay_Ms(5);
  79.                                  }
  80.                                
  81.                                 void Key_Scan()
  82.                                 {
  83.                                         uchar temp,Key;
  84.                                        
  85.                                         P3=0xf0;
  86.                                         temp=P3;
  87.                                         temp=temp&0xf0;
  88.                                         if(temp!=0xf0)
  89.                                         {
  90.                                                 Delay_Ms(10);
  91.                                                 if(temp!=0xf0)
  92.                                                 {
  93.                                                         temp=P3;
  94.                                                         temp=temp|0x0f;
  95.                                                         P3=temp;
  96.                                                         Key=P3;
  97.                                                        
  98.                                                         switch(Key)
  99.                                                         {
  100.                                                                 case 0xee:Display_Num=1*1;break;
  101.                                                                 case 0xde:Display_Num=2*2;break;
  102.                                                                 case 0xbe:Display_Num=3*3;break;
  103.                                                                 case 0x7e:Display_Num=4*4;break;
  104.                                                                
  105.                                                                 case 0xed:Display_Num=5*5;break;
  106.                                                                 case 0xdd:Display_Num=6*6;break;
  107.                                                                 case 0xbd:Display_Num=7*7;break;
  108.                                                                 case 0x7d:Display_Num=8*8;break;
  109.                                                                
  110.                                                                 case 0xeb:Display_Num=9*9;break;
  111.                                                                 case 0xdb:Display_Num=10*10;break;
  112.                                                                 case 0xbb:Display_Num=11*11;break;
  113.                                                                 case 0x7b:Display_Num=12*12;break;
  114.                                                                
  115.                                                                 case 0xe7:Display_Num=13*13;break;
  116.                                                                 case 0xd7:Display_Num=14*14;break;
  117.                                                                 case 0xb7:Display_Num=15*15;break;
  118.                                                                 case 0x77:Display_Num=16*16;break;
  119.                                                         }
  120.                                                 }
  121.                                         }
  122.                                 }
复制代码



回复

使用道具 举报

地板
ID:213173 发表于 2021-10-27 11:32 | 只看该作者
  1. #include<reg51.h>

  2. unsigned char n[]={
  3.         0xc0,0xf9,0xa4,0xb0,
  4.         0x99,0x92,0x82,0xf8,
  5.         0x80,0x90,0x88,0x83,
  6.         0xc6,0xa1,0x86,0x81};

  7. unsigned char k;

  8. void Timer1Init()   //1毫秒@12.000MHz
  9. {
  10.         TMOD= 0x10;                //设置定时器模式
  11.         TL1 = 0x18;                //设置定时初始值
  12.         TH1 = 0xFC;                //设置定时初始值
  13.         TF1 = 0;                //清除TF0标志
  14.         TR1 = 1;                //定时器0开始计时
  15. }

  16. void scan_key(void)
  17. {
  18.         static bit sign;
  19.         static unsigned char count;
  20.         unsigned char temp;
  21.         P1=0x0f;
  22.         if(P1!=0x0f)
  23.         {
  24.                 if(++count>=10 && sign==0)
  25.                 {
  26.                         sign=1;
  27.                         temp=P1;
  28.                         temp|=0xf0;
  29.                         P1=temp;
  30.                         switch(P1)
  31.                         {
  32.                                 case 0xee:k=1;break;
  33.                                 case 0xde:k=2;break;
  34.                                 case 0xbe:k=3;break;
  35.                                 case 0x7e:k=4;break;
  36.                                 case 0xed:k=5;break;
  37.                                 case 0xdd:k=6;break;
  38.                                 case 0xbd:k=7;break;
  39.                                 case 0x7d:k=8;break;
  40.                                 case 0xeb:k=9;break;
  41.                                 case 0xdb:k=10;break;
  42.                                 case 0xbb:k=11;break;
  43.                                 case 0x7b:k=12;break;
  44.                                 case 0xe7:k=13;break;
  45.                                 case 0xd7:k=14;break;
  46.                                 case 0xb7:k=15;break;
  47.                                 case 0x77:k=16;break;
  48.                                 default:break;
  49.                         }
  50.                 }
  51.         }
  52.         else
  53.         {
  54.                 sign=0;
  55.                 count=0;
  56.         }
  57. }
  58. void main()                                                //主函数
  59. {
  60.         Timer1Init();
  61.         while(1)
  62.         {
  63.                 if(TF1)
  64.                 {
  65.                         TF1=0;
  66.                         TL1 = 0x18;
  67.                         TH1 = 0xFC;
  68.                         scan_key();
  69.                 }
  70.                 P2=n[k/10];
  71.                 P3=~n[k%10];
  72.         }
  73. }
复制代码





回复

使用道具 举报

5#
ID:752974 发表于 2021-10-27 16:56 | 只看该作者
这种矩阵键盘用反转法比较简单,给你一个参考代码。
{  
  P1 = 0x0f;
//行置低,列置高(读列)
   if(P1!=0x0f)
    {
     // P1 = 0x0f;
      delaym(40);  //延时去抖。约60MS,可根据实际情况修改
      if(P1!=0x0f)
     {
            switch(P1)//扫描列
              {
                     case 0x07:i=3;break;
                     case 0x0b:i=2;break;
                     case 0x0d:i=1;break;
                     case 0x0e:i=0;break;
                     default:break;
             }
         //反转行列电平,读行
       P1 = 0xf0;
            switch(P1)
            {
                   case 0x70:j=3;break;
                   case 0xb0:j=2;break;
                   case 0xd0:j=1;break;
                   case 0xe0:j=0;break;
                   default:break;
            }
   while(P1!=0xf0);   //等待键释放
  return key_word[i][j];//返回键值
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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