微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求解这个矩阵键盘程序哪里有问题?为什么运行不起来?(新手,求教,谢谢)

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

时间:10-02 整理:3721RD 点击:
#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);
}
}
}


亲,你好,共同学习下。给你发个程序,你试下,看行不?
void main()
{
        unsigned int h,a;
        P2=0X00;
        P3=0X00;
        while(1)
        {
                P1=0xf0;
                h=P1;
                h=h&0xf0;
                if(h!=0xf0)
                {
                  delay(5);//按键按下去抖
                  h=P1;
                  h=h&0xf0;        
                    if(h!=0xf0)
                    {        h=P1;//若是第一个键按下h=1110 0000       
                       
                        P1=0X0F;      
                        delay(5);
                        a=P1;
                        //a=P1;
                        a=a&0x0f;//若是第一个键按下a=00001110
                        if(a!=0x0f)
                        {
                            delay(5);
                            a=P1;
                            a=a&0x0f;
                           if(a!=0x0f)
                           {       
                            a=P1;//a=00001110
                            h=h+a;//h+a=11101110
                            }
                        }
                     while(h!=0xf0)//松手检测
                        {
                                h=P1;
                                h=h&0xf0;
                        }
                    }
                }
            if(h==0xee)
           {
                P2=0XC0;//共阳极0
                P3=0XFF;
                delay(255);
            }
        }
}

跟我那个一样,P1端口有出现高低电平变化,而其他端口电平均不改变····

P2 P3你就一直没有改变他的值,就不会有高低变化哦,应该通过扫描哪个按键按下,来改变P2的值,才会有不同的数显示

//共阴数码管用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];
        }
}
现在电脑有点问题不能给图,不好意思

矩阵键盘用扫描法,还有你那消斗时间也太长了吧?一般5~10ms

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top