[MM32硬件] 两位595驱动8位共阴极数码管的程序问题

[复制链接]
3345|15
 楼主| 比神乐 发表于 2024-11-21 22:46 | 显示全部楼层 |阅读模式
原理图
1.jpg
程序
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char


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

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

  12. sbit key1 = P3^0;        //选择键
  13. sbit key2 = P3^1;        //加键
  14. sbit key3 = P3^2;        //减键
  15. sbit key4 = P3^3;

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

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

  22. //*****************************************************************************
  23. // 主程序
  24. void main ()
  25. {
  26.         TimerInit();
  27.         while(1)
  28.         {
  29.                 Display (A,K,C,D,E,F);
  30.                 KeyScan();
  31.         }
  32. }

  33. void KeyScan()
  34. {
  35.        
  36. }


  37. void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao)
  38. {
  39.         uchar i;

  40.         //显示第1位        小时10位
  41.         i = Table[shi10];

  42.         SMG_Int(i);                       
  43.         SMG_Int(0x01);               

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

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

  50.         SMG_Int(i);               
  51.         SMG_Int(0x02);               

  52.         STCP = 0;
  53.         _nop_();
  54.         _nop_();
  55.         STCP = 1;

  56.         //显示第3位        -
  57.         if(shan<10)         //"-" 闪烁
  58.         i = Table[16];
  59.         else
  60.         i = Table[15];
  61.         SMG_Int(i);                       
  62.         SMG_Int(0x04);       

  63.         STCP = 0;
  64.         _nop_();
  65.         _nop_();
  66.         STCP = 1;

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

  69.         SMG_Int(i);                       
  70.         SMG_Int(0x08);               

  71.         STCP = 0;
  72.         _nop_();
  73.         _nop_();
  74.         STCP = 1;

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

  77.         SMG_Int(i);                       
  78.         SMG_Int(0x10);       

  79.         STCP = 0;
  80.         _nop_();
  81.         _nop_();
  82.         STCP = 1;

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

  88.         SMG_Int(i);                       
  89.         SMG_Int(0x20);       

  90.         STCP = 0;
  91.         _nop_();
  92.         _nop_();
  93.         STCP = 1;

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

  96.         SMG_Int(i);                       
  97.         SMG_Int(0x40);       

  98.         STCP = 0;
  99.         _nop_();
  100.         _nop_();
  101.         STCP = 1;

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

  104.         SMG_Int(i);               
  105.         SMG_Int(0x80);       

  106.         STCP = 0;
  107.         _nop_();
  108.         _nop_();
  109.         STCP = 1;
  110. }

  111. void SMG_Int(uchar Dat)         //通过8次循环将8位数据移入74HC595
  112. {
  113.         uchar i;
  114.         for(i=8;i>=1;i--)
  115.         {
  116.                 if (Dat & 0x80)
  117.                 {
  118.                         SER = 1;
  119.                 }
  120.                
  121.                 else
  122.                 {
  123.                         SER = 0;
  124.                 }
  125.                 Dat <<= 1;
  126.                 SHCP = 0;
  127.                 _nop_();
  128.                 _nop_();
  129.                 SHCP = 1;
  130.         }
  131. }

  132. void TimerInit()         //定时器0初始化
  133. {
  134.         TMOD = 0x01;
  135.         TH0 = (65536-50000)/256;        //50ms初值
  136.         TL0 = (65536-50000)%256;
  137.         EA = 1;
  138.         ET0 = 1;
  139.         TR0 = 1;

  140. }

  141. void Timer0() interrupt 1
  142. {
  143.         static uchar cnt,shi=12,fen=59,miao=30;
  144.        
  145.         TH0 = (65536-50000)/256;
  146.         TL0 = (65536-50000)%256;
  147.        
  148.         shan++;
  149.         if(shan==20)
  150.                 shan=0;

  151.         cnt++;
  152.         if(cnt==20)
  153.         {
  154.                 cnt = 0;
  155.                 miao++;
  156.                 if(miao == 60)
  157.                 {
  158.                         miao = 0;
  159.                         fen++;
  160.                         if(fen==60)
  161.                         {
  162.                                 fen = 0;
  163.                                 shi++;
  164.                                 if(shi==24)
  165.                                 {
  166.                                         shi=0;
  167.                                 }
  168.                         }
  169.                 }
  170.         }

  171.         A=shi/10;
  172.         K=shi%10;
  173.         C=fen/10;
  174.         D=fen%10;
  175.         E=miao/10;
  176.         F=miao%10;
  177. }



由共阳极改的,改了段码表,可是程序显示乱码,个别数码管什么都不显示。
请问高手,如何解决?谢谢
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_();
               }
}
改成这样试试

qinlu123 发表于 2024-11-22 16:00 | 显示全部楼层
235.PNG
你要保证在传输16bit数据的时候RCK保持低电平,传输完了RCK再输出高电平这样并行输出口才是你想要的电平组合。而你的程序在传输数据的时候RCK是高电平,那么并行输出口的电平就一直在变化只有到了最后一瞬间才是你想要的电平组合。



评论

@qinlu123 :SN74HC595D  发表于 2024-11-22 19:05
我看错手册了,你的程序没问题,把你用的595完整型号发出来  发表于 2024-11-22 16:32
 楼主| 比神乐 发表于 2024-11-22 17:00 | 显示全部楼层
晚上发给你
 楼主| 比神乐 发表于 2024-11-22 19:19 | 显示全部楼层
qinlu123 发表于 2024-11-22 15:53
STCP = 0;         //数据并行输出,(借助上升沿)
            SMG_Int(i);        ...

3.jpg
显示成这样
 楼主| 比神乐 发表于 2024-11-22 19:33 | 显示全部楼层
qinlu123 发表于 2024-11-22 15:53
STCP = 0;         //数据并行输出,(借助上升沿)
            SMG_Int(i);        ...

线接错了,是下面这样
4.jpg
qinlu123 发表于 2024-11-23 08:11 | 显示全部楼层
共阴极的话位选控制应该是 SMG_Int(~0x01); SMG_Int(~0x02); SMG_Int(~0x04); SMG_Int(~0x08);……
alienmiller 发表于 2024-11-23 10:38 | 显示全部楼层
595驱动,几个驱动脚一定要对地加阻容,传输速率尽可能慢。别用nop,加长延时试试。
 楼主| 比神乐 发表于 2024-11-23 19:58 | 显示全部楼层
qinlu123 发表于 2024-11-22 15:53
STCP = 0;         //数据并行输出,(借助上升沿)
            SMG_Int(i);        ...

不行
 楼主| 比神乐 发表于 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
那你检查一下连线  发表于 2024-11-25 08:18
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部