找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机两片595驱动共阴极数码管的问题

[复制链接]
跳转到指定楼层
楼主
代码:
  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.         unsigned int i;
  27.         TimerInit();
  28.         while(1)
  29.         {
  30.                 Display (A,K,C,D,E,F);
  31.                 KeyScan();
  32.                 //for(i=0;i<300;i++);
  33.         }
  34. }

  35. void KeyScan()
  36. {
  37.        
  38. }


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

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

  44.         SMG_Int(i);                       
  45.         SMG_Int(0x01);               

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

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

  52.         SMG_Int(i);               
  53.         SMG_Int(0x02);               

  54.         STCP = 0;
  55.         _nop_();
  56.         _nop_();
  57.         STCP = 1;

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

  65.         STCP = 0;
  66.         _nop_();
  67.         _nop_();
  68.         STCP = 1;

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

  71.         SMG_Int(i);                       
  72.         SMG_Int(0x08);               

  73.         STCP = 0;
  74.         _nop_();
  75.         _nop_();
  76.         STCP = 1;

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

  79.         SMG_Int(i);                       
  80.         SMG_Int(0x10);       

  81.         STCP = 0;
  82.         _nop_();
  83.         _nop_();
  84.         STCP = 1;

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

  90.         SMG_Int(i);                       
  91.         SMG_Int(0x20);       

  92.         STCP = 0;
  93.         _nop_();
  94.         _nop_();
  95.         STCP = 1;

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

  98.         SMG_Int(i);                       
  99.         SMG_Int(0x40);       

  100.         STCP = 0;
  101.         _nop_();
  102.         _nop_();
  103.         STCP = 1;

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

  106.         SMG_Int(i);               
  107.         SMG_Int(0x80);       

  108.         STCP = 0;
  109.         _nop_();
  110.         _nop_();
  111.         STCP = 1;
  112. }

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

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

  142. }

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

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

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



复制代码

仿真结果


共阳极好使,共阴极不对。
请问高手,哪里不对?谢谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1109793 发表于 2024-11-22 15:26 | 只看该作者
共阳极改共阴极,位选和段数据都加个~不久行了?
还有这样每一位的时间太短了吧。
都不如直接上1638这样的芯片了。不过好像仿真不好搞
回复

使用道具 举报

板凳
ID:1133081 发表于 2024-11-22 21:41 | 只看该作者


  1. #include <reg51.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit P_HC595_SER   = P1^0;
  5. sbit P_HC595_RCLK  = P1^1;
  6. sbit P_HC595_SRCLK = P1^2;

  7. uchar code table[]={
  8.         0x3f,0x06,0x5b,0x4f,
  9.         0x66,0x6d,0x7d,0x07,
  10.         0x7f,0x6f,0x77,0x7c,
  11.         0x39,0x5e,0x79,0x71,0x40};
  12. uchar data dis_buf[8];
  13. uchar shi=12,fen=59,miao=30;
  14. uint  cnt;
  15. bit   flag;
  16. /**************** 向HC595发送一个字节函数 ******************/
  17. void Send_595(uchar dat)
  18. {               
  19.         uchar i;
  20.         for(i=0;i<8;i++)
  21.         {
  22.                 dat <<= 1;
  23.                 P_HC595_SER  = CY; //溢出位赋值数据输出端
  24.                 P_HC595_SRCLK = 1; //移位时钟
  25.                 P_HC595_SRCLK = 0;
  26.         }
  27. }
  28. /**************** 向HC595发送2个字节驱动码 ******************/
  29. void DisplayScan()
  30. {       
  31.         static uchar i;
  32.         Send_595(~(0x01<<i));//向HC595发送位码
  33.         Send_595(table[dis_buf[i]]);//向HC595发送段码
  34.         P_HC595_RCLK = 1;//锁存输出数据
  35.         P_HC595_RCLK = 0;
  36.         i++;
  37.         i%=8;
  38. }

  39. void TimerInit()         //定时器0初始化
  40. {
  41.         TMOD = 0x01;
  42.         TH0 = (65536-2000)/256;        //2ms初值
  43.         TL0 = (65536-2000)%256;
  44.         EA = 1;
  45.         ET0 = 1;
  46.         TR0 = 1;
  47. }

  48. void main()
  49. {
  50.         P_HC595_SRCLK = 0;//初始化移位时钟端
  51.         P_HC595_RCLK  = 0;//初始化锁存输出端
  52.         dis_buf[0]=shi/10;//初始化显示缓存
  53.         dis_buf[1]=shi%10;
  54.         dis_buf[2]=16;
  55.         dis_buf[3]=fen/10;
  56.         dis_buf[4]=fen%10;
  57.         dis_buf[5]=16;
  58.         dis_buf[6]=miao/10;
  59.         dis_buf[7]=miao%10;
  60.         TimerInit();
  61.         while(1)
  62.         {
  63.                 if(flag)
  64.                 {
  65.                         flag=0;
  66.                         dis_buf[0]=shi/10;
  67.                         dis_buf[1]=shi%10;
  68.                         dis_buf[3]=fen/10;
  69.                         dis_buf[4]=fen%10;
  70.                         dis_buf[6]=miao/10;
  71.                         dis_buf[7]=miao%10;
  72.                         DisplayScan();
  73.                 }
  74.         }
  75. }


  76. void Timer0() interrupt 1
  77. {      
  78.         TH0 = (65536-2000)/256;
  79.         TL0 = (65536-2000)%256;
  80.         cnt++;
  81.         if(cnt>=500)
  82.         {
  83.                 cnt = 0;
  84.                 miao++;
  85.                 if(miao == 60)
  86.                 {
  87.                         miao = 0;
  88.                         fen++;
  89.                         if(fen==60)
  90.                         {
  91.                                 fen = 0;
  92.                                 shi++;
  93.                                 if(shi==24)
  94.                                 {
  95.                                         shi=0;
  96.                                 }
  97.                         }
  98.                 }
  99.         }
  100.         flag=1;
  101. }


复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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