找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1300|回复: 6
打印 上一主题 下一主题
收起左侧

大家帮帮我看下这个键控数码管程序哪有问题?本人小白

[复制链接]
跳转到指定楼层
楼主
ID:419921 发表于 2018-11-2 21:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个程序刚下载完毕时六个数码管应该不亮的当按下第一个键之后才会亮 但是现在刚下好就亮着 数字显示的是00 这是程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit duanxuan=P2^6;
sbit weixuan=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)
{
           P0=table[num];
        duanxuan=1;
        duanxuan=0;
}
void yxdkeyscan()
{
        uchar temp,key;
                P3=0xfe;
                temp=P3;
                temp=temp&0xf0;
                if(temp!=0xf0)
        {
                delay(10);
        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=temp&0xf0;
                if(temp!=0xf0)
                {
                temp=P3;
                switch(temp)
                   {
                case 0xed:
                        key=4;
                        break;
        case 0xdd:
                        key=5;
                        break;
        case 0xbd:
                        key=6;
                        break;
                case 0x7d:
                        key=7;
                        break;
                    }
                        while(temp!=0xf0)
                        {
                        temp=P3;
                        temp=temp&0xf0;
                        }
         display(key);
                  }
        }


        P3=0xfb;
                temp=P3;
        temp=temp&0xf0;
                if(temp!=0xf0)
        {
                delay(10);
        temp=temp&0xf0;
                if(temp!=0xf0)
                {
                temp=P3;
                switch(temp)
                   {
                case 0xeb:
                        key=8;
                        break;
        case 0xdb:
                        key=9;
                        break;
        case 0xbb:
                        key=10;
                        break;
                case 0x7b:
                        key=11;
                        break;
                    }
                        while(temp!=0xf0)
                        {
                        temp=P3;
                        temp=temp&0xf0;
                        }
         display(key);
                  }
        }


        P3=0xf7;
                temp=P3;
        temp=temp&0xfd0;
                if(temp!=0xf0)
        {
                delay(10);
        temp=temp&0xf0;
                if(temp!=0xf0)
                {
                temp=P3;
                switch(temp)
                   {
                case 0xe7:
                        key=12;
                        break;
        case 0xd7:
                        key=13;
                        break;
        case 0xb7:
                        key=14;
                        break;
                case 0x77:
                        key=15;
                        break;
                    }
                        while(temp!=0xf0)
                        {
                        temp=P3;
                        temp=temp&0xf0;
                        }
         display(key);
                  }
        }
}
        
     void main()
{
        P0=0;
        duanxuan=1;
        duanxuan=0;
        P0=0xc0;
        weixuan=1;
        weixuan=0;
        while(1)
        {
        yxdkeyscan();
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:419968 发表于 2018-11-3 00:25 | 只看该作者
看代码应该外接74573锁存器,主程序开始duanxuan 已经锁存 0x00,位选锁存 0xc0(0b11000000)
回复

使用道具 举报

板凳
ID:419921 发表于 2018-11-3 04:05 来自手机 | 只看该作者
adject 发表于 2018-11-3 00:25
看代码应该外接74573锁存器,主程序开始duanxuan 已经锁存 0x00,位选锁存 0xc0(0b11000000)

程序下载完成后六个灯应该是不亮的  只有当按下矩阵上的某一个键六个灯才会开始工作  但是现在刚把程序下载好六个灯就全部显示0  我主函数里面明明刚开始就把段选关了只开着位选 我实在不知道那六个灯咋一开始就亮了还全是0
回复

使用道具 举报

地板
ID:213173 发表于 2018-11-3 08:12 | 只看该作者
本帖最后由 wulin 于 2018-11-3 11:44 编辑

给你改一下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit duanxuan=P2^6;
sbit weixuan=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)
{
        P0=table[num];
        duanxuan=1;
        duanxuan=0;
}
void yxdkeyscan()                                        //按键扫描程序
{
        static bit sign=0;                        //按键自锁标志                       
        uchar temp=0,key;                                //临时变量
        P3=0xf0;                                                //赋值P3 1111 0000
        if(P3!=0xf0)                                //检测有按键按下
        {
                delay(10);
                if((P3!=0xf0)&&(sign==0))//按键自锁
                {                       
                        sign=1;                                //按键自锁标志置1
                        temp=P3;                                //保存P3值xxxx 0000,x为0或1
                        temp|=0x0f;                        //保存temp按位或0x0f值xxxx 1111
                        P3=temp;                                //赋值P3 xxxx 1111
                        temp=P3;                                //保存P3值xxxx xxxx
                        switch(temp)
                        {
                                case 0xee: key= 0; break;
                                case 0xde: key= 1; break;
                                case 0xbe: key= 2; break;
                                case 0x7e: key= 3; break;
                                case 0xed: key= 4; break;
                                case 0xdd: key= 5; break;
                                case 0xbd: key= 6; break;
                                case 0x7d: key= 7; break;
                                case 0xeb: key= 8; break;
                                case 0xdb: key= 9; break;
                                case 0xbb: key=10; break;
                                case 0x7b: key=11; break;
                                case 0xe7: key=12; break;
                                case 0xd7: key=13; break;
                                case 0xb7: key=14; break;
                                case 0x77: key=15; break;
                        }
                        display(key);
                }
        }
        else sign=0;                //按键抬起,解除自锁
}

void main()
{
        P0=0x00;
        duanxuan=1;
        duanxuan=0;
        P0=0xc0;
        weixuan=1;
        weixuan=0;
        while(1)
        {
                yxdkeyscan();
        }
}
回复

使用道具 举报

5#
ID:419921 发表于 2018-11-3 13:12 | 只看该作者
wulin 发表于 2018-11-3 08:12
给你改一下:
#include
#define uchar unsigned char

哥  厉害了!为啥我这个程序不行呢  刚开始的时候灯不能全灭呢 我明明在主函数开头已经关闭了段选只开了位选 我现在很迷  这个程序是我按着郭天祥那本书上来的  
回复

使用道具 举报

6#
ID:213173 发表于 2018-11-3 18:54 | 只看该作者
yanxiaodong 发表于 2018-11-3 13:12
哥  厉害了!为啥我这个程序不行呢  刚开始的时候灯不能全灭呢 我明明在主函数开头已经关闭了段选只开了 ...

你的编程思路基本是对的, 开机的时候灯不能全灭不是主循环前的设置有什么问题,而是按键扫描程序不能按你的想法运行。我没有非常仔细看你的按键扫描程序,因为写得实在太啰嗦。归根结底是因为在没有按键按下的情况下意外运行了显示程序。
按键程序的局部语句:
        P3=0xf7;
        temp=P3;
        temp=temp&0xfd0;//明显错误部分
        if(temp!=0xf0)
        {
                delay(10);
                temp=temp&0xf0;
                if(temp!=0xf0)
                {
                        temp=P3;
                        switch(temp)
                     .......

回复

使用道具 举报

7#
ID:419921 发表于 2018-11-4 13:16 | 只看该作者
wulin 发表于 2018-11-3 18:54
你的编程思路基本是对的, 开机的时候灯不能全灭不是主循环前的设置有什么问题,而是按键扫描程序不能按 ...

哥  把你给我给我找出的这个错误改了之后 单片机就正常了 谢谢了!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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