[51单片机] 在数码管上显示矩阵按键的行数和列数

[复制链接]
 楼主| 夏盼 发表于 2014-11-16 12:00 | 显示全部楼层 |阅读模式
为什么按第二次以后数码管的示数不改变
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit duan=P2^6;
  5. sbit wei=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};
  11. void delay(uint xms)
  12. {
  13.         uint i,j;
  14.         for(i=xms;i>0;i--)
  15.                 for(j=110;j>0;j--);    //延时
  16. }
  17. void display(uchar num)
  18. {
  19.         while(1)
  20.         {
  21.         uchar hang,lie;
  22.         hang=num/10;
  23.         lie=num%10;
  24.        
  25.         P1=table[lie];
  26.         duan=1;
  27.         duan=0;
  28.         P1=0Xfd;       
  29.         wei=1;
  30.         wei=0;
  31.         delay(10);               

  32.         P1=table[hang];
  33.         duan=1;
  34.         duan=0;
  35.     P1=0Xfe;       
  36.         wei=1;       
  37.         wei=0;
  38.         delay(10);
  39.         }
  40.                                           //数码显示被按键的位置
  41. }
  42. void matrixkeyscan()          //确定被按下按键的位置
  43. {
  44.         uchar temp,key;
  45.         P3=0xfe;
  46.         temp=P3;
  47.         temp=temp&0xf0;
  48.         if(temp!=0xf0)
  49.         {
  50.                 delay(10);
  51.                 temp=P3;
  52.                 temp=temp&0xf0;
  53.                 if(temp!=0xf0)
  54.                 {
  55.                         temp=P3;
  56.                         switch(temp)
  57.                         {
  58.                                 case 0xee:key=0;break;
  59.                                 case 0xde:key=1;break;
  60.                                 case 0xbe:key=2;break;
  61.                                 case 0x7e:key=3;break;
  62.                         }
  63.                         while(temp!=0xf0)
  64.                         {
  65.                                 temp=P3;
  66.                                 temp=temp&0xf0;
  67.                         }
  68.                         display(key);
  69.                 }
  70.         }
  71.         P3=0xfd;
  72.         temp=P3;
  73.         temp=temp&0xf0;
  74.         if(temp!=0xf0)
  75.         {
  76.                 delay(10);
  77.                 temp=P3;
  78.                 temp=temp&0xf0;
  79.                 if(temp!=0xf0)
  80.                 {
  81.                         temp=P3;
  82.                         switch(temp)
  83.                         {
  84.                                 case 0xed:key=10;break;
  85.                                 case 0xdd:key=11;break;
  86.                                 case 0xbd:key=12;break;
  87.                                 case 0x7d:key=13;break;
  88.                         }
  89.                         while(temp!=0xf0)
  90.                         {
  91.                                 temp=P3;
  92.                                 temp=temp&0xf0;
  93.                         }
  94.                         display(key);
  95.                 }
  96.         }
  97.         P3=0xfb;
  98.         temp=P3;
  99.         temp=temp&0xf0;
  100.         if(temp!=0xf0)
  101.         {
  102.                 delay(10);
  103.                 temp=P3;
  104.                 temp=temp&0xf0;
  105.                 if(temp!=0xf0)
  106.                 {
  107.                         temp=P3;
  108.                         switch(temp)
  109.                         {
  110.                                 case 0xeb:key=20;break;
  111.                                 case 0xdb:key=21;break;
  112.                                 case 0xbb:key=22;break;
  113.                                 case 0x7b:key=23;break;
  114.                         }
  115.                         while(temp!=0xf0)
  116.                         {
  117.                                 temp=P3;
  118.                                 temp=temp&0xf0;
  119.                         }
  120.                         display(key);
  121.                 }
  122.         }
  123.         P3=0xf7;
  124.         temp=P3;
  125.         temp=temp&0xf0;
  126.         if(temp!=0xf0)
  127.         {
  128.                 delay(10);
  129.                 temp=P3;
  130.                 temp=temp&0xf0;
  131.                 if(temp!=0xf0)
  132.                 {
  133.                         temp=P3;
  134.                         switch(temp)
  135.                         {
  136.                                 case 0xe7:key=30;break;
  137.                                 case 0xd7:key=31;break;
  138.                                 case 0xb7:key=32;break;
  139.                                 case 0x77:key=33;break;
  140.                         }
  141.                         while(temp!=0xf0)
  142.                         {
  143.                                 temp=P3;
  144.                                 temp=temp&0xf0;
  145.                         }
  146.                         display(key);
  147.                 }
  148.         }
  149. }
  150. void main()
  151. {
  152.         while(1)
  153.         {
  154.         matrixkeyscan();
  155.         }
  156. }


yangfan19641964 发表于 2014-11-19 21:08 | 显示全部楼层
夏盼,你得把原理图贴上。
yangfan19641964 发表于 2014-11-19 21:16 | 显示全部楼层
你邀请我来看看你的程序。但我写的话,不会用高校或书本上那些误人子弟的方法,而是用中断扫描或定时扫描来编写。
yangfan19641964 发表于 2014-11-19 21:29 | 显示全部楼层
我才看了看,display()退不出来吧?当然第二次显示不了
 楼主| 夏盼 发表于 2014-11-26 19:53 | 显示全部楼层
yangfan19641964 发表于 2014-11-19 21:29
我才看了看,display()退不出来吧?当然第二次显示不了

确实是这样的,我邀请你当天没回,第二天上课正好有机会就请教老师解答了,还是感谢你
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

4

主题

15

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部