找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请问大佬为什么单片机程序按下按键后没反应?

[复制链接]
跳转到指定楼层
楼主
#include<reg52.h>
unsigned int s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f};
unsigned int num=99;

void delay(unsigned int n)
{
  unsigned char i=0,j=0;
  for (i=0;i<n;i++)
  {
   for (j=0;j<120;j++);
  }
}

void key_scan()
{
unsigned char temp0=0,temp1=0,temp=0;
  P1=0xf0;
  if(P1!=0xf0)
  {
   delay(20);
   temp0=P1;
   P1=0x0f;
   if(P1!=0x0f)
   {
         delay(20);
     temp1=P1;
   }
  }
   temp=temp0+temp1;
   if(temp==0xee)
   {
    num=0;
   }
   if(temp==0xed)
   {
    num=1;
   }
}

void display()
{
P2=s[num];
}
void main()
{
        while(1)
        {
          key_scan();
          display();
        }
}


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

使用道具 举报

7#
ID:973287 发表于 2021-10-19 22:05 | 只看该作者
wulin 发表于 2021-10-19 15:55
改了,你试试。

十分感谢
回复

使用道具 举报

6#
ID:332444 发表于 2021-10-19 20:26 | 只看该作者
矩阵按键代码到我博客去找https://blog.csdn.net/xianfajushi
回复

使用道具 举报

5#
ID:161164 发表于 2021-10-19 17:47 | 只看该作者
因为某些版本的proteus中的AT89C52
IO脚不足以拉低另一边的电平
反而被拉高
你可以运行以下代码时按键看看
void main()
{
while(1)
{
P1 = 0x0F;
delay(1000);
P1 = 0xF0;
delay(1000);
}
}
回复

使用道具 举报

地板
ID:213173 发表于 2021-10-19 15:55 | 只看该作者
改了,你试试。
  1. #include<reg52.h>
  2. unsigned char s[]={
  3.                 0x3f,0x06,0x5b,0x4f,
  4.                 0x66,0x6d,0x7d,0x07,
  5.                 0x7f,0x6f,0x77,0x7c,
  6.                 0x39,0x5e,0x79,0x71,0x40};
  7. unsigned char num=16;

  8. void delay(unsigned int n)
  9. {
  10.         unsigned int i=0,j=0;
  11.         for (i=0;i<n;i++)
  12.         {
  13.                 for (j=0;j<120;j++);
  14.         }
  15. }

  16. void display()
  17. {
  18.         P2=s[num];
  19. }

  20. void key_scan()
  21. {
  22.         P1=0xf0;
  23.         if(P1!=0xf0)
  24.         {
  25.                 delay(20);
  26.                 if(P1!=0xf0)
  27.                 {
  28.                         num=P1;
  29.                         num|=0x0f;
  30.                         P1=num;
  31.                         switch(P1)
  32.                         {
  33.                                 case 0xee: num= 0; break;
  34.                                 case 0xde: num= 1; break;
  35.                                 case 0xbe: num= 2; break;
  36.                                 case 0x7e: num= 3; break;
  37.                                 case 0xed: num= 4; break;
  38.                                 case 0xdd: num= 5; break;
  39.                                 case 0xbd: num= 6; break;
  40.                                 case 0x7d: num= 7; break;
  41.                                 case 0xeb: num= 8; break;
  42.                                 case 0xdb: num= 9; break;
  43.                                 case 0xbb: num=10; break;
  44.                                 case 0x7b: num=11; break;
  45.                                 case 0xe7: num=12; break;
  46.                                 case 0xd7: num=13; break;
  47.                                 case 0xb7: num=14; break;
  48.                                 case 0x77: num=15; break;
  49.                         }
  50.                         display();
  51.                         P1=0xff;
  52.                         while(P1!=0xff);
  53.                 }
  54.         }
  55. }

  56. void main()
  57. {
  58.         display();
  59.         while(1)
  60.         {
  61.                 key_scan();
  62.         }
  63. }
复制代码
回复

使用道具 举报

板凳
ID:973287 发表于 2021-10-19 15:43 | 只看该作者
xianfajushi 发表于 2021-10-19 14:53
有数码管的电路是最好调试,把P2=s[num];放到需要观察的地方跟踪查看变量的值,确定程序是否存在问题.如把P2= ...

好的谢谢大佬提醒,不过我现在还不太清楚怎么调试,能稍微帮我看一下代码有什么问题吗,十分感谢
回复

使用道具 举报

沙发
ID:332444 发表于 2021-10-19 14:53 | 只看该作者
有数码管的电路是最好调试,把P2=s[num];放到需要观察的地方跟踪查看变量的值,确定程序是否存在问题.如把P2=s[num];放到按键函数中去跟踪按键代码是否正常.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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