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

QQ登錄

只需一步,快速開始

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

請(qǐng)教74HC595數(shù)碼管顯示程序的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:891876 發(fā)表于 2023-11-30 20:31 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
從壇上復(fù)制的74HC595程序仿真不顯示?請(qǐng)幫我看看,謝謝!



單片機(jī)源程序如下:
#include <reg52.h>                           
#define uint unsigned int
#define uchar unsigned char

sbit  ds_595    =P2^0;      //串行數(shù)據(jù)輸入
sbit  b_cp_595   =P2^2;      //輸出鎖存器控制脈沖 st_cp_595
sbit  a_cp_595   =P2^1;      //串行移位時(shí)鐘脈沖  sh_cp_595
extern uchar  datas[6];                         //存放6個(gè)數(shù)碼管的顯示數(shù)字
uchar  ledcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
                                                                       // 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
void delay(uint z)
{
        uint t1,y;
        for(t1=z;t1>0;t1--)
                for(y=110;y>0;y--);
}

void led_display(void)
{  
   uchar i,j;
   bit testb;
   uchar movebit[6];
   uchar test;
   for(i=0;i<6;i++)  //選中數(shù)碼管
   movebit[ i]=ledcode[datas[ i]];
   delay(1);
   for(i=0;i<6;i++)           //數(shù)據(jù)移位
   {
      test=movebit[ i];
     for(j=0;j<8;j++)
      {
        testb=test&0x80;
        test=test<<1;
      if(testb)
        {
                ds_595=1;
        }
      else
       {
               ds_595=0;
       }
              a_cp_595=1;
              a_cp_595=0;
     }                                //數(shù)據(jù)移位  
   }
           b_cp_595=0;
           b_cp_595=1;
           b_cp_595=0;
}
void main()
{
        
    led_display();
          while (1);

}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:69038 發(fā)表于 2023-11-30 22:21 | 只看該作者
ds被你吃了?
回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 2023-11-30 22:28 | 只看該作者


  1. #include <reg52.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit HC595_DIO   = P2^0;
  5. sbit HC595_SCLK  = P2^1;
  6. sbit HC595_RCLK  = P2^2;

  7. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//共陰數(shù)碼管段碼0~f
  8.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  9. uchar code dis_buf[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共陰數(shù)碼管位碼

  10. /******************1ms延時(shí)子程序(12MHz)*******************/
  11. void delayms(uint k)
  12. {
  13.         uint i,j;
  14.         for(i=k;i>0;i--)
  15.                 for(j=125;j>0;j--);
  16. }
  17. /**************** 向HC595發(fā)送一個(gè)字節(jié)函數(shù) ******************/
  18. void Send_595(uchar dat)
  19. {               
  20.         uchar i;
  21.         for(i=0;i<8;i++)
  22.         {
  23.                 HC595_DIO=(dat&0x80)>>7;//由高位到低位賦值數(shù)據(jù)輸出端
  24.                 HC595_SCLK = 1;        //移位時(shí)鐘
  25.                 HC595_SCLK = 0;
  26.                 dat <<= 1;                        //dat左移一位
  27.         }
  28. }
  29. /**************** 數(shù)碼管顯示函數(shù) ******************/
  30. void DisplayScan()
  31. {       
  32.         static uchar i=0;
  33.         Send_595(dis_buf[i]);//向HC595發(fā)送位碼(共陰數(shù)碼管)
  34.         Send_595(table[i]);        //向HC595發(fā)送段碼(共陰數(shù)碼管)
  35. //        Send_595(~dis_buf[i]);//向HC595發(fā)送位碼(共陽數(shù)碼管)
  36. //        Send_595(~table[i]);        //向HC595發(fā)送段碼(共陽數(shù)碼管)
  37.         HC595_RCLK = 1;                //鎖存輸出數(shù)據(jù)
  38.         HC595_RCLK = 0;
  39.         i++;
  40.         i%=6;
  41. }

  42. void main()
  43. {
  44.         while(1)
  45.         {
  46.                 DisplayScan();        //數(shù)碼管顯示函數(shù)
  47.                 delayms(1);                //延時(shí)1ms
  48.         }
  49. }
復(fù)制代碼




回復(fù)

使用道具 舉報(bào)

地板
ID:57657 發(fā)表于 2023-11-30 22:40 | 只看該作者
74HC系列芯片不用的輸入腳不能懸空,否則會(huì)干擾亂碼甚至靜電擊穿。
回復(fù)

使用道具 舉報(bào)

5#
ID:829223 發(fā)表于 2023-12-1 10:37 | 只看該作者
很明顯圖畫錯(cuò)了
回復(fù)

使用道具 舉報(bào)

6#
ID:277550 發(fā)表于 2023-12-1 11:10 | 只看該作者
  1. #include <reg52.H>
  2. #define uint  unsigned int
  3. #define uchar unsigned char
  4. sbit HC595_DIO   = P2^0;
  5. sbit HC595_SCLK  = P2^1;
  6. sbit HC595_RCLK  = P2^2;

  7. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//共陰數(shù)碼管段碼0~f
  8.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  9. uchar code dis_buf[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共陰數(shù)碼管位碼
  10. uint secs = 0;
  11. uchar disp[6]= {0};

  12. /******************1ms延時(shí)子程序(12MHz)*******************/
  13. void delayms(uint k){
  14.         uint i,j;
  15.         for(i=k;i>0;i--)
  16.                 for(j=125;j>0;j--);
  17. }
  18. /**************** 向HC595發(fā)送一個(gè)字節(jié)函數(shù) ******************/
  19. void Send_595(uchar dat){               
  20.         uchar i;
  21.         for(i=0; i<8; i++){
  22.                 HC595_DIO=(dat&0x80)>>7;        //由高位到低位賦值數(shù)據(jù)輸出端
  23.                 HC595_SCLK = 1;                                //移位時(shí)鐘
  24.                 HC595_SCLK = 0;
  25.                 dat <<= 1;                                        //dat左移一位
  26.         }
  27. }
  28. /**************** 數(shù)碼管顯示函數(shù) ******************/
  29. void DisplayScan(){      
  30.         static uchar i=0;
  31.         Send_595(dis_buf[i]);                //向HC595發(fā)送位碼(共陰數(shù)碼管)
  32.         Send_595(table[disp[i]]);        //向HC595發(fā)送段碼(共陰數(shù)碼管)
  33. //        Send_595(~dis_buf[i]);                //向HC595發(fā)送位碼(共陽數(shù)碼管)
  34. //        Send_595(~table[i]);                //向HC595發(fā)送段碼(共陽數(shù)碼管)
  35.         HC595_RCLK = 1;                                //鎖存輸出數(shù)據(jù)
  36.         HC595_RCLK = 0;
  37.         i++;
  38.         i%=6;
  39. }

  40. void main(){
  41.         uchar x=0;
  42.         delayms(50);
  43.         while(1){
  44.                 DisplayScan();                //數(shù)碼管顯示函數(shù)
  45.                 delayms(1);                        //延時(shí)1ms
  46.                 x++;
  47.                 if(x==100){
  48.                         x=0;
  49.                         secs++;
  50.                         secs%=65535;
  51.                         disp[0]=0;
  52.                         disp[1]=secs/10000%10;
  53.                         disp[2]=secs/1000%10;
  54.                         disp[3]=secs/100%10;
  55.                         disp[4]=secs/10%10;
  56.                         disp[5]=secs%10;
  57.                 }
  58.         }
  59. }

復(fù)制代碼

路過,將樓上的代碼,改成“活”的,演示一下 —— 硬件連線和樓上相同的。

回復(fù)

使用道具 舉報(bào)

7#
ID:891876 發(fā)表于 2023-12-1 12:03 | 只看該作者

謝謝指導(dǎo),但不明白25段碼&0x80后為什么向右移7位呢?
回復(fù)

使用道具 舉報(bào)

8#
ID:213173 發(fā)表于 2023-12-1 19:08 | 只看該作者
芙蓉焊料 發(fā)表于 2023-12-1 12:03
謝謝指導(dǎo),但不明白25段碼&0x80后為什么向右移7位呢?

串行數(shù)據(jù)只能逐位傳輸,可能由高位到低位亦可能低位到高位,這由器件制造商確定。(dat&0x80)>>7就是取最高位右移7后賦值DIO,傳輸一位數(shù)據(jù),然后dat <<= 1; 如此運(yùn)行8次,完成由高位到低位將一個(gè)字節(jié)數(shù)據(jù)發(fā)出。
回復(fù)

使用道具 舉報(bào)

9#
ID:639666 發(fā)表于 2023-12-19 22:08 | 只看該作者
wulin 發(fā)表于 2023-12-1 19:08
串行數(shù)據(jù)只能逐位傳輸,可能由高位到低位亦可能低位到高位,這由器件制造商確定。(dat&0x80)>>7就是取最 ...

現(xiàn)在成功了嗎?有沒有用實(shí)物試過?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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