找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 803|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)兩片595驅(qū)動(dòng)共陰極數(shù)碼管的問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:232462 發(fā)表于 2024-11-22 13:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
代碼:
  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;        //串行數(shù)據(jù)輸入端
  10. sbit STCP = P1^1;        //時(shí)鐘脈沖信號(hào)——上升沿有效 存儲(chǔ)寄存器時(shí)鐘輸入端,并行輸出
  11. sbit SHCP = P1^2;        //輸入信號(hào)————上升沿有效 移位寄存器時(shí)鐘輸入端

  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;                //選擇鍵計(jì)數(shù)變量

  18. void TimerInit();
  19. void KeyScan();
  20. void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao);        // 數(shù)碼管顯示
  21. void SMG_Int(uchar Dat);                // 數(shù)碼管單字節(jié)串行移位函數(shù)

  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位        小時(shí)10位
  43.         i = Table[shi10];

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

  46.         STCP = 0;         //數(shù)據(jù)并行輸出,(借助上升沿)
  47.         _nop_();
  48.         _nop_();
  49.         STCP = 1;

  50.         //顯示第2位        小時(shí)個(gè)位
  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位        分鐘個(gè)位
  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位        秒個(gè)位
  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)         //通過(guò)8次循環(huán)將8位數(shù)據(jù)移入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()         //定時(shí)器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. }



復(fù)制代碼

仿真結(jié)果


共陽(yáng)極好使,共陰極不對(duì)。
請(qǐng)問(wèn)高手,哪里不對(duì)?謝謝
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1109793 發(fā)表于 2024-11-22 15:26 | 只看該作者
共陽(yáng)極改共陰極,位選和段數(shù)據(jù)都加個(gè)~不久行了?
還有這樣每一位的時(shí)間太短了吧。
都不如直接上1638這樣的芯片了。不過(guò)好像仿真不好搞
回復(fù)

使用道具 舉報(bào)

板凳
ID:1133081 發(fā)表于 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發(fā)送一個(gè)字節(jié)函數(shù) ******************/
  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; //溢出位賦值數(shù)據(jù)輸出端
  24.                 P_HC595_SRCLK = 1; //移位時(shí)鐘
  25.                 P_HC595_SRCLK = 0;
  26.         }
  27. }
  28. /**************** 向HC595發(fā)送2個(gè)字節(jié)驅(qū)動(dòng)碼 ******************/
  29. void DisplayScan()
  30. {       
  31.         static uchar i;
  32.         Send_595(~(0x01<<i));//向HC595發(fā)送位碼
  33.         Send_595(table[dis_buf[i]]);//向HC595發(fā)送段碼
  34.         P_HC595_RCLK = 1;//鎖存輸出數(shù)據(jù)
  35.         P_HC595_RCLK = 0;
  36.         i++;
  37.         i%=8;
  38. }

  39. void TimerInit()         //定時(shí)器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;//初始化移位時(shí)鐘端
  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. }


復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表