求解这个矩阵键盘程序哪里有问题?为什么运行不起来?(新手,求教,谢谢)

2019-07-15 16:51发布

#include<reg51.h>
void delay(unsigned int i)
{
unsigned char j,k;
for(j=0;j<i;j++)
     for(k=0;k<255;k++);
}
void main()
{
unsigned int h,l;
P2=0X00;
P3=0X00;
while(1)
{
P1=0XF0;
h=P1;
if(h!=0xf0)
{
delay(1000);
h=P1;
if(h!=0xf0)
{
h=h&0xf0; /*1110 0000*/
P1=0X0F;        /*11101111*/
delay(1);
l=P1;
l=P1;
if(l!=0x0f)
{
delay(1000);
if(l!=0x0f)
{

l=l&0x0f;
h=h+l;
}
}
}
}
if(h==0x11)
{
P2=0XC0;
P3=0XFF;
delay(255);
}
}
}


矩阵.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
何时的丁丁
2019-07-16 07:57
//共阴数码管用P0口控制,P2口控制16个按键,当有键按下的时候数码管显示按键是第几个
#include <reg52.h>
#define         uchar unsigned char
#define         uint  unsigned int
uchar code SMG_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};        //共阴数码管的编码表

uint num;

void delay(uint z)        //延时函数
{
        uint x,y;
        for(x=1;x<z;x++)
                for(y=1;y<110;y++);
}
void dispiay(void)
{
        uint temp;
//        num=16;
        P2=0xfe;            //赋值,为了检测第一行
        {
                temp=P2;        //读取数值
                if(temp!=0xfe)  //检测有按键按下
                {
                        delay(10);        //消抖
                        temp=P2;        //读取数值
                        if(temp!=0xfe) //消抖后确定有按键按下
                                switch(temp)
                                {       
                                        case 0xee:num=0;break;        //说明s1按下时

                                        case 0xde:num=1;break; //说明s2按下时

                                        case 0xbe:num=2;break;        //说明s3按下时

                                        case 0x7e:num=3;break;         //说明s4按下时
                                }       
                while(P2!=0xfe);  //松手检测
                }
        }
        P2=0xfd;   //赋值,为了检测第二行
         
        {
                temp=P2;        //读取数值
                if(temp!=0xfd)  //检测有按键按下
                {
                        delay(10);        //消抖
                        temp=P2;        //读取数值
                        if(temp!=0xfd) //消抖后确定有按键按下
                                switch(temp)
                                {
                                        case 0xed:num=4;break;        //说明s5按下时

                                        case 0xdd:num=5;break; //说明s6按下时

                                        case 0xbd:num=6;break;        //说明s7按下时

                                        case 0x7d:num=7;break;         //说明s8按下时
                                }       
                while(P2!=0xfd);                 //松手检测
                }
        }
        P2=0xfb;   //赋值,为了检测第三行
         
        {
                temp=P2;        //读取数值
                if(temp!=0xfb)  //检测有按键按下
                {
                        delay(10);        //消抖
                        temp=P2;        //读取数值
                        if(temp!=0xfb) //消抖后确定有按键按下
                                switch(temp)
                                {       
                                        case 0xeb:num=8;break;        //说明s9按下时

                                        case 0xdb:num=9;break; //说明s10按下时

                                        case 0xbb:num=10;break;        //说明s11按下时

                                        case 0x7b:num=11;break;         //说明s12按下时
                                }       
                while(P2!=0xfb);                        //松手检测
                }
        }
        P2=0xf7;                         //赋值,为了检测第四行
                 
    {
                temp=P2;        //读取数值
                if(temp!=0xf7)  //检测有按键按下
                {
                        delay(10);        //消抖
                        temp=P2;        //读取数值
                        if(temp!=0xf7) //消抖后确定有按键按下
                                switch(temp)
                                {
                                        case 0xe7:num=12;break;        //说明s13按下时

                                        case 0xd7:num=13;break; //说明s14按下时

                                        case 0xb7:num=14;break;        //说明s15按下时

                                        case 0x77:num=15;break;         //说明s16按下时
                                }       
                while(P2!=0xf7);                //松手检测
               
                }
        }                 
}
void main (void)
{
        num=16;
        P0=SMG_Tab[num];
        while(1)
        {
         dispiay();
         P0=~SMG_Tab[num];
        }
}
现在电脑有点问题不能给图,不好意思

一周热门 更多>