找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 5733 | 评论数: 6 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-10-19 13:05

正文摘要:

#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;   fo ...

回复

ID:973287 发表于 2021-10-19 22:05
wulin 发表于 2021-10-19 15:55
改了,你试试。

十分感谢
ID:332444 发表于 2021-10-19 20:26
矩阵按键代码到我博客去找https://blog.csdn.net/xianfajushi
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 单片机教程网

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