• 已解决 40886 个问题
  • 已帮助 5879 位优秀工程师

静态数码管和动态数码管用一块单片机不能同时驱动吗

zzzqiu 2021-02-10 浏览量:850
一个非常简单的小程序,利用外部中断控制静态数码管和动态数码管轮流显示数字0~7,可是无论是实际下载到开发板还是用protues仿真都只有动态显示,无法切换到静态显示,代码也检查了许多遍,刚刚开始学51,不知道是不是算法的问题,恳求大佬帮忙指点一点,下面是代码。
#include <reg52.h>
#define LED1 P1//静态数码管
#define LED2 P0//动态数码管
sbit c=P2^7;
sbit b=P2^6;
sbit a=P2^5;
sbit k1=P3^2;
sbit k2=P3^3;
unsigned char code num[8]={0x3f0x060x5b0x4f0x660x6d0x7d0x07};
unsigned char M[8];
unsigned char k;
void displayLED1();
void displayLED2();
void zhong_duan_kai_qi();
void delay(unsigned int time);
void main()
{
        zhong_duan_kai_qi();//外部中断开启
        while(1)
        {       
                unsigned char i;
                if(k)
                {
                        LED2=0x00;
                        while(k)
                        {
                                displayLED1();       
                        }               
                }
                else
                {
                        for(i=0;i<8;i++)
                        {
                                M[i]=num[i];
                        }
                        LED1=0x00;               
                        while(~k)
                        {
                                displayLED2();
                        }
                }
        }       
}

void delay(unsigned int time)
{
        unsigned char i;
        unsigned int j;               
        for(i=0;i<time;i++)
        {
                for(j=0;j<125;j++);
        }
}
void zhong_duan_kai_qi()
{
        //设置INT0
        IT0=1;//跳变沿出发方式(下降沿)
        EX0=1;//打开INT0的中断允许。
        //设置INT1
        IT1=1;
        EX1=1;
        //打开总中断
        EA=1;       
}
void displayLED1()
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                LED1=num[i];                       
                delay(500);
        }
}
void displayLED2()
{
        unsigned char i;
        unsigned int j;
        for(i=0;i<8;i++)
        {
                switch(i)
                {
                        case 0:
                                c=0;b=0;a=0;break;
                        case 1:
                                c=0;b=0;a=1;break;
                        case 2:
                                c=0;b=1;a=0;break;
                        case 3:
                                c=0;b=1;a=1;break;
                        case 4:
                                c=1;b=0;a=0;break;
                        case 5:
                                c=1;b=0;a=1;break;
                        case 6:
                                c=1;b=1;a=0;break;
                        case 7:
                                c=1;b=1;a=1;break;
                }
                LED2=M[i];
                j=500;
                while(j--);
                LED2=0x00;//消隐
        }
}
void Int0()interrupt 0
{
        delay(1);//延时消抖
        if(k1==0)
        {
                k=0;       
        }
}
void Int1()interrupt 2
{
        delay(1);
        if(k2==0)
        {
                k=1;       
        }
}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:4
  • 1.先不使用中断单独测试静态显示程序是否正常

    2.只测试按键中断处理。看按键能否切换K的变换,并在中断处理中控制一个LED灯来指示状态变换

    3.若以上2者皆正常再查找程序间的配合问题

    4.此外关注一下按键的消抖延时是否合适

    动静态混合驱动应该是没问题,显示的延时时间会影响到显示的质量及亮度,需调试来求取最佳效果。

  • 你的硬件是怎么连接的,想了半天是不是因为你P1口驱动能力不够的原因导致的呀,你不要切换,直接拿P1口输出有没有问题呢?

  • 是不是可以驱动,看你的单片机的引脚的多少,驱动方式,与你的电路是有关的

  • 是可以同时驱动的,但要连接到不同的引脚上驱动,否则是干扰的,都无法正常显示的

静态数码管和动态数码管用一块单片机不能同时驱动吗