51键盘扫描问题

2019-03-24 20:06发布

我的学习板上是3*3的键盘,数码管位选是直接接P2口的,我的目的是按几数码管就显几,不按的时候就不显,但现在发现我按几是显示了几,但不按的时候数码管还是有显示
程序如下,看看问题出在哪,有位高手说要用定时动态扫描,能不能具体说下
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dig1=P2^0 ;
sbit dig2=P2^1 ;
sbit dig3=P2^2 ;
sbit dig4=P2^3        ;
uchar temp,num,a;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
void display(uchar );
void delay(uint z);
void main()
{               
        while(1)
        {       
                display( num);
                P3=0xfb;
            temp=P3;
                temp=temp&0xe3;
                if(temp!=0xe3)
                        {
                                delay(5);
                                P3=0xfb;
                        temp=P3;
                        temp=temp&0xe3;
                            if(temp!=0xe3)
                                        {
                                                switch(temp)
                                                {
                                                        case 0xc3:num=1;break;;
                                                        case 0xa3:num=2;break;         
                                                        case 0x63:num=3;break;
                                                }                                  
                                        }
       
                                }
                P3=0xf7;
                temp=P3;
                temp=temp&0xe3;
                if(temp!=0xe3)
                        {
                                delay(5);
                                P3=0xf7;
                            temp=P3;
                            temp=temp&0xe3;
                                    if(temp!=0xe3)
                                                {
                                                        switch(temp)
                                                        {
                                                                case 0xc3:num=4;break;;
                                                                case 0xa3:num=5;break;         
                                                                case 0x63:num=6;break;
                                                        }
                                                }
                                }
                P3=0xef;
                temp=P3;
                temp=temp&0xe3;
                if(temp!=0xe3)
                        {
                                delay(5);
                                P3=0xef;
                            temp=P3;
                            temp=temp&0xe3;
                                    if(temp!=0xe3)
                                                {
                                                        switch(temp)
                                                        {
                                                                case 0xc3:num=7;break;
                                                                case 0xa3:num=8;break;         
                                                                case 0x63:num=9;break;
                                                        }
                                                }
       
                        }               
        }
}
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
zjjone1023
1楼-- · 2019-03-25 20:52
非常感谢inintrovert
您提醒了我一点,其它不用中断定时,只要在程序的开头写入NUM值等于数码管不亮也就是0XFF就可以了,不过您让我好好的学习了定时器,谢谢了
proan
2楼-- · 2019-03-25 23:43
不懂,顶一下
zjjone1023
3楼-- · 2019-03-26 05:24
问题又有新的出现,我按inintrovert的方法好像不太行,按键还是有显示,另外如果我按快一点有时候会出现显示乱的东西
求帮助
另外感谢论坛里的朋友,让我学起来更快

一周热门 更多>