找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1539|回复: 3
收起左侧

单片机矩阵键盘与数码管 按下数字没有变化 求帮助

[复制链接]
ID:665068 发表于 2019-12-16 13:19 | 显示全部楼层 |阅读模式
按下16个矩阵键盘依次在数码管上显示1 16的平方。我按下键盘数字没有变化 求帮助

#include<reg52.h>

#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0};
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xff};
uint num,num1;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uint keyscan();
void init();
void display(uchar,uchar,uchar);
void main()
{
init();
while(1)
  {
   num1=keyscan();
   display(num1/100,num1%100/10,num1%10);
  }
}
void init()
{
dula=1;
P0=0x00;
dula=0;
wela=1;
P0=0xc0;
wela=0;
}
void display(uchar a,uchar b,uchar c)
{
dula=1;
P0=table[a];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);

dula=1;
P0=table;
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);

dula=1;
P0=table[c];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
}
uint keyscan()
{
   P3=0xfe;
   P3=P3&0xf0;
   while(P3!=0xf0)
    {
     delay(5);
     P3=P3&0xf0;
     while(P3!=0xf0)
     {
     switch(P3)
      {
       case 0xee:num=1;
        break;
       case 0xde:num=4;
        break;
       case 0xbe:num=9;
        break;
       case 0x7e:num=16;
        break;
      }
     while(P3!=0xf0)
      {
       P3=P3&0xf0;
      }
     }
    }
   P3=0xfd;
   P3=P3&0xf0;
   while(P3!=0xf0)
    {
     delay(5);
     P3=P3&0xf0;
     while(P3!=0xf0)
     {
     switch(P3)
      {
       case 0xed:num=25;
        break;
       case 0xdd:num=36;
        break;
       case 0xbd:num=49;
        break;
       case 0x7d:num=64;
        break;
      }
     while(P3!=0xf0)
      {
       P3=P3&0xf0;
      }
     }
    }
   
   P3=0xfb;
   P3=P3&0xf0;
   while(P3!=0xf0)
    {
     delay(5);
     P3=P3&0xf0;
     while(P3!=0xf0)
     {
     switch(P3)
      {
       case 0xeb:num=81;
        break;
       case 0xdb:num=100;
        break;
       case 0xbb:num=121;
        break;
       case 0x7b:num=144;
        break;
      }
     while(P3!=0xf0)
      {
       P3=P3&0xf0;
      }
     }
    }
   
   P3=0xf7;
   P3=P3&0xf0;
   while(P3!=0xf0)
    {
     delay(5);
     P3=P3&0xf0;
     while(P3!=0xf0)
     {
     switch(P3)
      {
       case 0xe7:num=169;
        break;
       case 0xd7:num=196;
        break;
       case 0xb7:num=225;
        break;
       case 0x77:num=256;
        break;
      }
     while(P3!=0xf0)
      {
       P3=P3&0xf0;
      }
     }
    }
return num;
}

回复

使用道具 举报

ID:332444 发表于 2019-12-17 16:09 | 显示全部楼层
调整一下数码显示中的延时量,学习蛋骗鸡最要紧的是先做好人机交互部分,然后调试其他的,先送一个值如4去调试显示数码管是否成功显示数字。
回复

使用道具 举报

ID:650297 发表于 2019-12-17 20:24 | 显示全部楼层
打开程序调试,一步步执行,看哪步错了
回复

使用道具 举报

ID:213173 发表于 2019-12-17 21:11 | 显示全部楼层
无标题.jpg
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit dula=P2^6;
  5. sbit wela=P2^7;

  6. uchar code table[]={
  7. 0x3f,0x06,0x5b,0x4f,
  8. 0x66,0x6d,0x7d,0x07,
  9. 0x7f,0x6f,0x77,0x7c,
  10. 0x39,0x5e,0x79,0x71,0};
  11. uchar code tablewe[]={
  12. 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xff};
  13. uchar data dis_buf[6];//显示缓存
  14. uint key;

  15. void delay(uint z)
  16. {
  17.         uint x,y;
  18.         for(x=z;x>0;x--)
  19.                 for(y=110;y>0;y--);
  20. }
  21. void keyscan();
  22. void display();

  23. void main()
  24. {
  25.         while(1)
  26.         {
  27.                 keyscan();
  28.                 dis_buf[0]=table[key/100];//分解数据
  29.                 dis_buf[1]=table[key/10%10];
  30.                 dis_buf[2]=table[key%10];
  31.                 display();
  32.                 delay(1);
  33.         }
  34. }

  35. void display()
  36. {
  37.         static uchar i=0;       
  38.         P0=0x00;//消隐
  39.         dula=1;
  40.         dula=0;
  41.         P0=tablewe[i];//送位码
  42.         wela=1;
  43.         wela=0;
  44.         P0=dis_buf[i];//送段码
  45.         dula=1;
  46.         dula=0;
  47.         i++;
  48.         i%=3;
  49. }

  50. void keyscan()                                        //按键扫描程序
  51. {
  52.         static bit sign=0;                        //按键自锁标志
  53.         static uint count=0;                //消抖计数变量                       
  54.         uchar num=0;                                //临时变量
  55.         P3=0xf0;                                        //赋值P3 1111 0000
  56.         if(P3!=0xf0)                                //检测有按键按下
  57.         {
  58.                 count++;                                //消抖计数
  59.                 if((count>=10)&&(sign==0))
  60.                 {                       
  61.                         sign=1;                                //按键自锁标志置1
  62.                         num=P3;                                //保存P3值xxxx 0000,x为0或1
  63.                         num|=0x0f;                        //保存num按位或0x0f值xxxx 1111
  64.                         P3=num;                                //赋值P3 xxxx 1111
  65.                         num=P3;                                //读取并保存P3值xxxx xxxx
  66.                         switch(num)
  67.                         {
  68.                                 case 0xee: key=  1; break;
  69.                                 case 0xde: key=  4; break;
  70.                                 case 0xbe: key=  9; break;
  71.                                 case 0x7e: key= 16; break;
  72.                                 case 0xed: key= 25; break;
  73.                                 case 0xdd: key= 36; break;
  74.                                 case 0xbd: key= 49; break;
  75.                                 case 0x7d: key= 64; break;
  76.                                 case 0xeb: key= 81; break;
  77.                                 case 0xdb: key=100; break;
  78.                                 case 0xbb: key=121; break;
  79.                                 case 0x7b: key=144; break;
  80.                                 case 0xe7: key=169; break;
  81.                                 case 0xd7: key=196; break;
  82.                                 case 0xb7: key=225; break;
  83.                                 case 0x77: key=256; break;
  84.                         }
  85.                 }
  86.         }
  87.         else                                                //键抬起
  88.         {
  89.                 sign=0;                                        //按键自锁标志清0
  90.                 count=0;                                //消抖计数清0
  91.         }
  92. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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