标题: 怎么通过编程实现单片机按键扫描显示0到15,急需大神求解 [打印本页]

作者: 钟宇大傻逼    时间: 2019-2-22 14:59
标题: 怎么通过编程实现单片机按键扫描显示0到15,急需大神求解
怎么通过编程实现单片机按键扫描显示0到15,比如按下按键1显示1,按下按键2显示2.....按下按键11显示11
这是我的原程序,只能实现单数,不知道怎么实现双数,求大家帮帮忙
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wr=P2^5;
sbit cs1=P2^6;
sbit cs2=P2^7;
uchar code table[]={0xc0,
0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88};
void dms(uint);
uchar num;
void display(num)
{          
  cs1=1;
  P0=0xfe;
        wr=0;
        wr=1;
  cs1=0;

  cs2=1;
  P0=table[num];
        wr=0;
        wr=1;
  cs2=0;
}

void m()
{
uchar tp,k;
P3=0xfe;
tp=P3;
tp=tp&0xf0;
if(tp!=0xf0)
{
dms(10);
        tp=P3;
        tp=tp&0xf0;
        if(tp!=0xf0)
        {
         tp=P3;
         switch(tp)
         {
                 case 0xee:
                      k=0;
                                        break;  
                case 0xde:
                     k=1;
                                 break;
                case 0xbe:
                     k=2;
                                 break;
    case 0x7e:
                     k=3;
                                 break;
         }
         while(tp!=0xf0)
         {
                 tp=P3;
                tp=tp&0xf0;
         }
         display(k);
         }
        }

P3=0xfd;
tp=P3;
tp=tp&0xf0;
if(tp!=0xf0)
{
dms(10);
        tp=P3;
        tp=tp&0xf0;
        if(tp!=0xf0)
        {
         tp=P3;
         switch(tp)
         {
                 case 0xed:
                      k=4;
                                        break;  
                case 0xdd:
                     k=5;
                                 break;
                case 0xbd:
                     k=6;
                                 break;
    case 0x7d:
                     k=7;
                                 break;
         }
         while(tp!=0xf0)
         {
                 tp=P3;
                tp=tp&0xf0;
         }
         display(k);
         }
        }


   P3=0xfb;
tp=P3;
tp=tp&0xf0;
if(tp!=0xf0)
{
dms(10);
        tp=P3;
        tp=tp&0xf0;
        if(tp!=0xf0)
        {
         tp=P3;
         switch(tp)
         {
                 case 0xeb:  
                      k=8;
                                        break;  
                case 0xdb:
                     k=9;
                                 break;
                case 0xbb:
                     k=10;
                                 break;
    case 0x7b:
                     k=11;
                                 break;
         }
         while(tp!=0xf0)
         {
                 tp=P3;
                tp=tp&0xf0;
         }
         display(k);
         }
        }
}

void dms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
}
void main()
{

while(1)
{
  m();
}
}       



作者: wulin    时间: 2019-2-22 20:50
你的程序只写了一位数码管显示,怎能显示两位数?程序没有任何注释,别人怎么准确知道你的硬件电路连接?
作者: static    时间: 2019-2-22 23:43
上电路图,不方便的话上坛子看视频
作者: 2583715224    时间: 2019-2-23 15:07
你忘了,显示都是按16进制来显示的,而且你一次只扫描一次
作者: dxn396396396    时间: 2019-2-24 20:45
先检测按下第几行在检测按的是哪个,没思路的话可以参考一下网上的
作者: wysh_2012    时间: 2019-2-24 22:01
程序要有详细的注释和关于数码管接线的说明,还有变量名函数名的命名要规范和见名知义,这样别人也容易看得懂为你解答。
作者: 菜用鸡    时间: 2019-3-4 10:43
如果是数码管的话可以先取整显示,在取余显示,
作者: 菜用鸡    时间: 2019-3-4 10:45
如果不想显示一位数时带个0在前面(如09,08,11)再加一个判断条件

作者: 黛angle    时间: 2019-3-4 15:04
在编制键盘输入程序时常常要用到一个键的扫描码或ASC码,如用到 Foxpro 的 inkey() 函数,以及用到 BIOS 的 INT 16H时,但找一个编码表不太容易,有时候找到的编码表又不全,无法查到组合键的编码,本程序就是一个随时用来显示按键的ASC码及扫描码的程序,可以用 16 进制和 10 进制同时显示一个键按下和放开的扫描码,以及ASC码,同样也支持组合键。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1