找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1961|回复: 8
收起左侧

怎么通过编程实现单片机按键扫描显示0到15,急需大神求解

[复制链接]
ID:479319 发表于 2019-2-22 14:59 | 显示全部楼层 |阅读模式
怎么通过编程实现单片机按键扫描显示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();
}
}       


回复

使用道具 举报

ID:213173 发表于 2019-2-22 20:50 | 显示全部楼层
你的程序只写了一位数码管显示,怎能显示两位数?程序没有任何注释,别人怎么准确知道你的硬件电路连接?
回复

使用道具 举报

ID:477932 发表于 2019-2-22 23:43 | 显示全部楼层
上电路图,不方便的话上坛子看视频
回复

使用道具 举报

ID:318927 发表于 2019-2-23 15:07 | 显示全部楼层
你忘了,显示都是按16进制来显示的,而且你一次只扫描一次
回复

使用道具 举报

ID:476853 发表于 2019-2-24 20:45 来自手机 | 显示全部楼层
先检测按下第几行在检测按的是哪个,没思路的话可以参考一下网上的
回复

使用道具 举报

ID:480108 发表于 2019-2-24 22:01 | 显示全部楼层
程序要有详细的注释和关于数码管接线的说明,还有变量名函数名的命名要规范和见名知义,这样别人也容易看得懂为你解答。
回复

使用道具 举报

ID:478236 发表于 2019-3-4 10:43 | 显示全部楼层
如果是数码管的话可以先取整显示,在取余显示,
回复

使用道具 举报

ID:478236 发表于 2019-3-4 10:45 | 显示全部楼层
如果不想显示一位数时带个0在前面(如09,08,11)再加一个判断条件
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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