黑戈夫 发表于 2022-3-12 22:25:07

51单片机I/O口扩展(串转并)LED点阵没有现象

代码如下
#include <REGX52.H>
typedef unsigned int u16;
typedef unsigned char u8;
//¶¨òå74595¿ØÖÆ1ü½Å
sbit SER=P3^4;//òÆλ¼Ä′æÆê±Öó÷êäèë
sbit SRCLK=P3^5;//′æ′¢¼Ä′æÆ÷ê±Öóêäèë
sbit rCLK=P3^6;//′®DDêy¾Yêäèë
//¶¨òåμãÕóáD¿ØÖƶ˿ú
#define LEDDZ_COL_PROT      P0
u8 ghc595_buf={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//Ñó3ùoˉêy
void delay_10us(u16 ten_us)
{
      while(ten_us--);
}
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
//Ïò74595êäèëêy¾Y
void hc595_write_data(u8 dat)
{
                u8 i=0;
          for(i=0;i<8;i++)
          {
                        SER=dat>>7;
                        dat<<=1;
                        SRCLK=0;
                        delay_10us(1);
                        SRCLK=1;
                        delay_10us(1);
          }
                rCLK=0;
    delay_10us(1);
                rCLK=1;
}
void main()
{
      u8 i=0;
      LEDDZ_COL_PROT=0x00;
      while(1)
      {

                for(i=0;i<8;i++)
                {
         hc595_write_data(0x00);
         hc595_write_data(ghc595_buf);
         delay_ms(500);
          }
}
}
请问各位老哥是哪里出现了问题

七夜烬天 发表于 2022-3-13 12:15:53

因为不知道你要实现什么效果,所以就把我写的代码发上来了
我写的代码:
#include "reg51.h"//如果是52,则第一列全亮
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;

sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SET=P3^4;

u8 ledLie[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
u8 ledHang[]={0x00,0x7e,0x81,0x81,0x81,0x81,0x7e,0x00};//显示数字0



void Hc595SendByte(u8 dat)
{
        u8 a;
        for(a=0;a<8;a++)
        {
                SET=dat>>7;
                dat<<=1;
                SRCLK=0;
                _nop_();
                SRCLK=1;
                _nop_();        
        }
        RCLK=0;
        _nop_();
        RCLK=1;
}

void delay(u8 i)
{
        while(i--);
}

void main()
{       
        u8 a;
        while(1)
        {
                for(a=0;a<8;a++)
                {
                        P0=ledLie;
                        Hc595SendByte(ledHang);
                        delay(100);//视觉暂留时间约为0.05至0.2秒
                        Hc595SendByte(0x00);//P0=0xff;阳极可以消影,阴极不行
                }
        }
}

七夜烬天 发表于 2022-3-13 12:27:47

有一点你弄错了,sbit SRCLK=P3^5和sbit rCLK=P3^6你弄反了,应该交换一下。
还有消影尽量在一个循环内解决
代码修改后,是亮8*8所有的LED等
修改后的代码:
#include <REGX52.H>
typedef unsigned int u16;
typedef unsigned char u8;
//¶¨òå74595¿ØÖÆ1ü½Å
sbit SER=P3^4;//òÆλ¼Ä′æÆê±Öó÷êäèë
sbit SRCLK=P3^6;//′æ′¢¼Ä′æÆ÷ê±Öóêäèë
sbit rCLK=P3^5;//′®DDêy¾Yêäèë
//¶¨òåμãÕóáD¿ØÖƶ˿ú
#define LEDDZ_COL_PROT      P0
u8 ghc595_buf[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};


//Ñó3ùoˉêy
void delay_10us(u16 ten_us)
{
      while(ten_us--);
}
/*void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}*/



//Ïò74595êäèëêy¾Y
void hc595_write_data(u8 dat)
{
                u8 i=0;
          for(i=0;i<8;i++)
          {
                        SER=dat>>7;
                        dat<<=1;
                        SRCLK=0;
                        delay_10us(1);
                        SRCLK=1;
                        delay_10us(1);
          }
                rCLK=0;
    delay_10us(1);
                rCLK=1;
}
void main()
{
      u8 i=0;
      LEDDZ_COL_PROT=0x00;
      while(1)
      {

                for(i=0;i<8;i++)
                {
         hc595_write_data(ghc595_buf);
         delay_10us(100);
               hc595_write_data(0x00);
          }
}
}

黑戈夫 发表于 2022-3-13 14:53:56

谢谢,找到了错误,主要是那个跳线帽没弄到接地。

515151 发表于 2023-10-27 12:58:58

黑戈夫 发表于 2022-3-13 14:53
谢谢,找到了错误,主要是那个跳线帽没弄到接地。

我的LED点阵也不亮,能说一下那个跳线帽怎么接地嘛{:3_52:}

yanghunag 发表于 2023-11-10 16:36:26

那个led点阵旁边的j24的帽子摘下来就可以解决
页: [1]
查看完整版本: 51单片机I/O口扩展(串转并)LED点阵没有现象