打印
[MM32硬件]

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

[复制链接]
1968|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
比神乐|  楼主 | 2024-11-21 22:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
原理图

程序
#include <reg52.h>
#include <intrins.h>
#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[shi10];

        SMG_Int(i);                       
        SMG_Int(0x01);               

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

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

        SMG_Int(i);               
        SMG_Int(0x02);               

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

        //显示第3位        -
        if(shan<10)         //"-" 闪烁
        i = Table[16];
        else
        i = Table[15];
        SMG_Int(i);                       
        SMG_Int(0x04);       

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

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

        SMG_Int(i);                       
        SMG_Int(0x08);               

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

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

        SMG_Int(i);                       
        SMG_Int(0x10);       

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

        //显示第6位        -
        if(shan<10)           //"-" 闪烁
        i = Table[16];
        else
        i = Table[15];

        SMG_Int(i);                       
        SMG_Int(0x20);       

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

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

        SMG_Int(i);                       
        SMG_Int(0x40);       

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

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

        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>=1;i--)
        {
                if (Dat & 0x80)
                {
                        SER = 1;
                }
               
                else
                {
                        SER = 0;
                }
                Dat <<= 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;
}



由共阳极改的,改了段码表,可是程序显示乱码,个别数码管什么都不显示。
请问高手,如何解决?谢谢

使用特权

评论回复
沙发
ayb_ice| | 2024-11-22 13:04 | 只看该作者
还是用共阳的表格,显示时按位取反即可

使用特权

评论回复
板凳
比神乐|  楼主 | 2024-11-22 14:03 | 只看该作者
ayb_ice 发表于 2024-11-22 13:04
还是用共阳的表格,显示时按位取反即可

不好使。麻烦你看看我的原理图有没有问题,谢谢

使用特权

评论回复
地板
qinlu123| | 2024-11-22 15:53 | 只看该作者
        
            STCP = 0;         //数据并行输出,(借助上升沿)
            SMG_Int(i);                        
        SMG_Int(0x01);               
           _nop_();
        _nop_();
            STCP = 1;        
        
        

void SMG_Int(uchar Dat)         //通过8次循环将8位数据移入74HC595
{
        uchar i;
        for(i=8;i>=1;i--)
        {   
                        SHCP = 0;                if (Dat & 0x80)
                {
                        SER = 1;
                }
               
                else
                {
                        SER = 0;
                }
                Dat <<= 1;
               
                        SHCP = 1;                _nop_();
                _nop_();
               }
}
改成这样试试

使用特权

评论回复
5
qinlu123| | 2024-11-22 16:00 | 只看该作者

你要保证在传输16bit数据的时候RCK保持低电平,传输完了RCK再输出高电平这样并行输出口才是你想要的电平组合。而你的程序在传输数据的时候RCK是高电平,那么并行输出口的电平就一直在变化只有到了最后一瞬间才是你想要的电平组合。



使用特权

评论回复
评论
比神乐 2024-11-22 19:05 回复TA
@qinlu123 :SN74HC595D 
qinlu123 2024-11-22 16:32 回复TA
我看错手册了,你的程序没问题,把你用的595完整型号发出来 
6
比神乐|  楼主 | 2024-11-22 17:00 | 只看该作者
晚上发给你

使用特权

评论回复
7
比神乐|  楼主 | 2024-11-22 19:19 | 只看该作者
qinlu123 发表于 2024-11-22 15:53
STCP = 0;         //数据并行输出,(借助上升沿)
            SMG_Int(i);        ...


显示成这样

使用特权

评论回复
8
比神乐|  楼主 | 2024-11-22 19:33 | 只看该作者
qinlu123 发表于 2024-11-22 15:53
STCP = 0;         //数据并行输出,(借助上升沿)
            SMG_Int(i);        ...

线接错了,是下面这样

使用特权

评论回复
9
qinlu123| | 2024-11-23 08:11 | 只看该作者
共阴极的话位选控制应该是 SMG_Int(~0x01); SMG_Int(~0x02); SMG_Int(~0x04); SMG_Int(~0x08);……

使用特权

评论回复
10
丙丁先生| | 2024-11-23 08:35 | 只看该作者
检查段码表、硬件连接,确保电源和接地正确。

使用特权

评论回复
11
alienmiller| | 2024-11-23 10:38 | 只看该作者
595驱动,几个驱动脚一定要对地加阻容,传输速率尽可能慢。别用nop,加长延时试试。

使用特权

评论回复
12
比神乐|  楼主 | 2024-11-23 19:58 | 只看该作者
qinlu123 发表于 2024-11-22 15:53
STCP = 0;         //数据并行输出,(借助上升沿)
            SMG_Int(i);        ...

不行

使用特权

评论回复
13
比神乐|  楼主 | 2024-11-23 19:59 | 只看该作者
qinlu123 发表于 2024-11-23 08:11
共阴极的话位选控制应该是 SMG_Int(~0x01); SMG_Int(~0x02); SMG_Int(~0x04); SMG_Int(~0x08);…… ...

按你的说法,PROTEUS仿真可以,用实物不行

使用特权

评论回复
评论
比神乐 2024-11-25 09:09 回复TA
好了,没焊好 
qinlu123 2024-11-25 08:18 回复TA
那你检查一下连线 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

467

主题

3517

帖子

7

粉丝