chenbingjy 发表于 2024-11-21 22:46

两位595驱动8位共阴极数码管的程序问题

<p>原理图</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">代码:</div>

<div style="text-align: center;">
<pre>
<code>#include &lt;reg52.h&gt;
#include &lt;intrins.h&gt;
#define uchar unsigned char


uchar code Table[] =
{ // 0       1          2           3        4       5          6           7        8       9          A           b        C    d          E    F    -
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x86,0xFF,0xbf
};
//-----------------------------------------------------------------------------

sbit SER = P1^0;        //串行数据输入端
sbit STCP = P1^1;        //时钟脉冲信号——上升沿有效 存储寄存器时钟输入端,并行输出
sbit SHCP = P1^2;        //输入信号————上升沿有效 移位寄存器时钟输入端

sbit key1 = P3^0;        //选择键
sbit key2 = P3^1;        //加键
sbit key3 = P3^2;        //减键
sbit key4 = P3^3;

uchar shan,A,K,C,D,E,F;
uchar knum;                //选择键计数变量

void TimerInit();
void KeyScan();
void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao);        // 数码管显示
void SMG_Int(uchar Dat);                // 数码管单字节串行移位函数

//*****************************************************************************
// 主程序
void main ()
{
        TimerInit();
        while(1)
        {
                Display (A,K,C,D,E,F);
                KeyScan();
        }
}

void KeyScan()
{
       
}


void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao)
{
        uchar i;

        //显示第1位        小时10位
        i = Table;

        SMG_Int(i);                       
        SMG_Int(0x01);               

        STCP = 0;       //数据并行输出,(借助上升沿)
        _nop_();
        _nop_();
        STCP = 1;

        //显示第2位        小时个位
        i = Table;

        SMG_Int(i);               
        SMG_Int(0x02);               

        STCP = 0;
        _nop_();
        _nop_();
        STCP = 1;

        //显示第3位        -
        if(shan&lt;10)       //"-" 闪烁
        i = Table;
        else
        i = Table;
        SMG_Int(i);                       
        SMG_Int(0x04);       

        STCP = 0;
        _nop_();
        _nop_();
        STCP = 1;

        //显示第4位        分钟10位
        i = Table;

        SMG_Int(i);                       
        SMG_Int(0x08);               

        STCP = 0;
        _nop_();
        _nop_();
        STCP = 1;

        //显示第5位        分钟个位
        i = Table;

        SMG_Int(i);                       
        SMG_Int(0x10);       

        STCP = 0;
        _nop_();
        _nop_();
        STCP = 1;

        //显示第6位        -
        if(shan&lt;10)           //"-" 闪烁
        i = Table;
        else
        i = Table;

        SMG_Int(i);                       
        SMG_Int(0x20);       

        STCP = 0;
        _nop_();
        _nop_();
        STCP = 1;

        //显示第7位        秒10位
        i = Table;

        SMG_Int(i);                       
        SMG_Int(0x40);       

        STCP = 0;
        _nop_();
        _nop_();
        STCP = 1;

        //显示第8位        秒个位
        i = Table;

        SMG_Int(i);               
        SMG_Int(0x80);       

        STCP = 0;
        _nop_();
        _nop_();
        STCP = 1;
}

void SMG_Int(uchar Dat)       //通过8次循环将8位数据移入74HC595
{
        uchar i;
        for(i=8;i&gt;=1;i--)
        {
                if (Dat &amp; 0x80)
                {
                        SER = 1;
                }
               
                else
                {
                        SER = 0;
                }
                Dat &lt;&lt;= 1;
                SHCP = 0;
                _nop_();
                _nop_();
                SHCP = 1;
        }
}

void TimerInit()       //定时器0初始化
{
        TMOD = 0x01;
        TH0 = (65536-50000)/256;        //50ms初值
        TL0 = (65536-50000)%256;
        EA = 1;
        ET0 = 1;
        TR0 = 1;

}

void Timer0() interrupt 1
{
        static uchar cnt,shi=12,fen=59,miao=30;
       
        TH0 = (65536-50000)/256;
        TL0 = (65536-50000)%256;
       
        shan++;
        if(shan==20)
                shan=0;

        cnt++;
        if(cnt==20)
        {
                cnt = 0;
                miao++;
                if(miao == 60)
                {
                        miao = 0;
                        fen++;
                        if(fen==60)
                        {
                                fen = 0;
                                shi++;
                                if(shi==24)
                                {
                                        shi=0;
                                }
                        }
                }
        }

        A=shi/10;
        K=shi%10;
        C=fen/10;
        D=fen%10;
        E=miao/10;
        F=miao%10;
}



</code></pre>

<p>&nbsp;</p>
</div>

<p>由共阳极改的,改了段码表,可是程序显示乱码,个别数码管什么都不显示。</p>

<p>请问高手,如何解决?谢谢</p>

Jacktang 发表于 2024-11-22 07:29

<p>这个程序和硬件电路需要结合起来查找</p>

chenbingjy 发表于 2024-11-22 08:30

Jacktang 发表于 2024-11-22 07:29
这个程序和硬件电路需要结合起来查找

<p>谢谢,硬件有问题吗</p>

chineseboyzxy 发表于 2024-11-22 08:51

<p>就是8个8字显示,一个595负责段码,一个595负责位码,你把所有的组合写到纸上,程序里从0到9,挨个儿显示一遍,中间加长延时,然后就能发现问题了。不过位码595不加三极管驱动,不知道能不能驱动7段全亮的电流。</p>

wangerxian 发表于 2024-11-22 09:04

<p>你让段选全输出,看看数码管能不能全亮。</p>

chenbingjy 发表于 2024-11-22 09:06

<p>谢谢,回去试试</p>

chenbingjy 发表于 2024-11-22 12:31

<div class='shownolgin' data-isdigest='no'><p>还有一个问题,我两个595驱动数码管,段选和位选没弄反吧?谢谢</p>
</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

chenbingjy 发表于 2024-11-22 12:54

<div class='shownolgin' data-isdigest='no'><p>我把程序改成共阴极断码表,显示如下</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>
</div><script>showreplylogin();</script>

chenbingjy 发表于 2024-11-22 12:57

<div class='shownolgin' data-isdigest='no'><p>再问个问题,位选不用变吧</p>
</div><script>showreplylogin();</script>
页: [1]
查看完整版本: 两位595驱动8位共阴极数码管的程序问题