找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1304|回复: 8
收起左侧

请教74HC595数码管显示程序的问题

[复制链接]
ID:891876 发表于 2023-11-30 20:31 | 显示全部楼层 |阅读模式
从坛上复制的74HC595程序仿真不显示?请帮我看看,谢谢!

595a.JPG

单片机源程序如下:
#include <reg52.h>                           
#define uint unsigned int
#define uchar unsigned char

sbit  ds_595    =P2^0;      //串行数据输入
sbit  b_cp_595   =P2^2;      //输出锁存器控制脉冲 st_cp_595
sbit  a_cp_595   =P2^1;      //串行移位时钟脉冲  sh_cp_595
extern uchar  datas[6];                         //存放6个数码管的显示数字
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++)  //选中数码管
   movebit[ i]=ledcode[datas[ i]];
   delay(1);
   for(i=0;i<6;i++)           //数据移位
   {
      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;
     }                                //数据移位  
   }
           b_cp_595=0;
           b_cp_595=1;
           b_cp_595=0;
}
void main()
{
        
    led_display();
          while (1);

}
回复

使用道具 举报

ID:69038 发表于 2023-11-30 22:21 | 显示全部楼层
ds被你吃了?
回复

使用道具 举报

ID:213173 发表于 2023-11-30 22:28 | 显示全部楼层
无标题.jpg

  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,//共阴数码管段码0~f
  8.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  9. uchar code dis_buf[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴数码管位码

  10. /******************1ms延时子程序(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发送一个字节函数 ******************/
  18. void Send_595(uchar dat)
  19. {               
  20.         uchar i;
  21.         for(i=0;i<8;i++)
  22.         {
  23.                 HC595_DIO=(dat&0x80)>>7;//由高位到低位赋值数据输出端
  24.                 HC595_SCLK = 1;        //移位时钟
  25.                 HC595_SCLK = 0;
  26.                 dat <<= 1;                        //dat左移一位
  27.         }
  28. }
  29. /**************** 数码管显示函数 ******************/
  30. void DisplayScan()
  31. {       
  32.         static uchar i=0;
  33.         Send_595(dis_buf[i]);//向HC595发送位码(共阴数码管)
  34.         Send_595(table[i]);        //向HC595发送段码(共阴数码管)
  35. //        Send_595(~dis_buf[i]);//向HC595发送位码(共阳数码管)
  36. //        Send_595(~table[i]);        //向HC595发送段码(共阳数码管)
  37.         HC595_RCLK = 1;                //锁存输出数据
  38.         HC595_RCLK = 0;
  39.         i++;
  40.         i%=6;
  41. }

  42. void main()
  43. {
  44.         while(1)
  45.         {
  46.                 DisplayScan();        //数码管显示函数
  47.                 delayms(1);                //延时1ms
  48.         }
  49. }
复制代码




回复

使用道具 举报

ID:57657 发表于 2023-11-30 22:40 | 显示全部楼层
74HC系列芯片不用的输入脚不能悬空,否则会干扰乱码甚至静电击穿。
回复

使用道具 举报

ID:829223 发表于 2023-12-1 10:37 | 显示全部楼层
很明显图画错了
回复

使用道具 举报

ID:277550 发表于 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,//共阴数码管段码0~f
  8.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  9. uchar code dis_buf[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//共阴数码管位码
  10. uint secs = 0;
  11. uchar disp[6]= {0};

  12. /******************1ms延时子程序(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发送一个字节函数 ******************/
  19. void Send_595(uchar dat){               
  20.         uchar i;
  21.         for(i=0; i<8; i++){
  22.                 HC595_DIO=(dat&0x80)>>7;        //由高位到低位赋值数据输出端
  23.                 HC595_SCLK = 1;                                //移位时钟
  24.                 HC595_SCLK = 0;
  25.                 dat <<= 1;                                        //dat左移一位
  26.         }
  27. }
  28. /**************** 数码管显示函数 ******************/
  29. void DisplayScan(){      
  30.         static uchar i=0;
  31.         Send_595(dis_buf[i]);                //向HC595发送位码(共阴数码管)
  32.         Send_595(table[disp[i]]);        //向HC595发送段码(共阴数码管)
  33. //        Send_595(~dis_buf[i]);                //向HC595发送位码(共阳数码管)
  34. //        Send_595(~table[i]);                //向HC595发送段码(共阳数码管)
  35.         HC595_RCLK = 1;                                //锁存输出数据
  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();                //数码管显示函数
  45.                 delayms(1);                        //延时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. }

复制代码

路过,将楼上的代码,改成“活”的,演示一下 —— 硬件连线和楼上相同的。

回复

使用道具 举报

ID:891876 发表于 2023-12-1 12:03 | 显示全部楼层

谢谢指导,但不明白25段码&0x80后为什么向右移7位呢?
回复

使用道具 举报

ID:213173 发表于 2023-12-1 19:08 | 显示全部楼层
芙蓉焊料 发表于 2023-12-1 12:03
谢谢指导,但不明白25段码&0x80后为什么向右移7位呢?

串行数据只能逐位传输,可能由高位到低位亦可能低位到高位,这由器件制造商确定。(dat&0x80)>>7就是取最高位右移7后赋值DIO,传输一位数据,然后dat <<= 1; 如此运行8次,完成由高位到低位将一个字节数据发出。
回复

使用道具 举报

ID:639666 发表于 2023-12-19 22:08 | 显示全部楼层
wulin 发表于 2023-12-1 19:08
串行数据只能逐位传输,可能由高位到低位亦可能低位到高位,这由器件制造商确定。(dat&0x80)>>7就是取最 ...

现在成功了吗?有没有用实物试过?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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