打印
[51单片机]

在数码管上显示矩阵按键的行数和列数

[复制链接]
1098|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
夏盼|  楼主 | 2014-11-16 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么按第二次以后数码管的示数不改变
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit duan=P2^6;
sbit wei=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);    //延时
}
void display(uchar num)
{
        while(1)
        {
        uchar hang,lie;
        hang=num/10;
        lie=num%10;
       
        P1=table[lie];
        duan=1;
        duan=0;
        P1=0Xfd;       
        wei=1;
        wei=0;
        delay(10);               

        P1=table[hang];
        duan=1;
        duan=0;
    P1=0Xfe;       
        wei=1;       
        wei=0;
        delay(10);
        }
                                          //数码显示被按键的位置
}
void matrixkeyscan()          //确定被按下按键的位置
{
        uchar temp,key;
        P3=0xfe;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xee:key=0;break;
                                case 0xde:key=1;break;
                                case 0xbe:key=2;break;
                                case 0x7e:key=3;break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        display(key);
                }
        }
        P3=0xfd;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xed:key=10;break;
                                case 0xdd:key=11;break;
                                case 0xbd:key=12;break;
                                case 0x7d:key=13;break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        display(key);
                }
        }
        P3=0xfb;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xeb:key=20;break;
                                case 0xdb:key=21;break;
                                case 0xbb:key=22;break;
                                case 0x7b:key=23;break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        display(key);
                }
        }
        P3=0xf7;
        temp=P3;
        temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(10);
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                        {
                                case 0xe7:key=30;break;
                                case 0xd7:key=31;break;
                                case 0xb7:key=32;break;
                                case 0x77:key=33;break;
                        }
                        while(temp!=0xf0)
                        {
                                temp=P3;
                                temp=temp&0xf0;
                        }
                        display(key);
                }
        }
}
void main()
{
        while(1)
        {
        matrixkeyscan();
        }
}


相关帖子

沙发
yangfan19641964| | 2014-11-19 21:08 | 只看该作者
夏盼,你得把原理图贴上。

使用特权

评论回复
板凳
yangfan19641964| | 2014-11-19 21:16 | 只看该作者
你邀请我来看看你的程序。但我写的话,不会用高校或书本上那些误人子弟的方法,而是用中断扫描或定时扫描来编写。

使用特权

评论回复
地板
yangfan19641964| | 2014-11-19 21:29 | 只看该作者
我才看了看,display()退不出来吧?当然第二次显示不了

使用特权

评论回复
5
夏盼|  楼主 | 2014-11-26 19:53 | 只看该作者
yangfan19641964 发表于 2014-11-19 21:29
我才看了看,display()退不出来吧?当然第二次显示不了

确实是这样的,我邀请你当天没回,第二天上课正好有机会就请教老师解答了,还是感谢你

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

15

帖子

0

粉丝