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);
}
}
}
请问各位老哥是哪里出现了问题
因为不知道你要实现什么效果,所以就把我写的代码发上来了
我写的代码:
#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;阳极可以消影,阴极不行
}
}
}
有一点你弄错了,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
谢谢,找到了错误,主要是那个跳线帽没弄到接地。
我的LED点阵也不亮,能说一下那个跳线帽怎么接地嘛{:3_52:} 那个led点阵旁边的j24的帽子摘下来就可以解决
页:
[1]