新人求问~74hc595的串行数据怎么输出的
如题,操作数码管时总是乱码,或者是不闪,但是关掉了重新开数据就又不一样了 用逻辑分析仪抓波形分析。对应 时钟 数据 锁存看看。没记错的话 应该是上升沿采样。 void hc595_output(void){
unsigned char i;
unsigned long temp;
STCP_L();
temp=0x01;
for (i=0;i<32;i++)
{
SHCP_L();
if (hc595_rg.b & temp) DS_H();
else DS_L();
SHCP_H();
temp<<=1;
}
STCP_H();
} 这是4片595级联的,所以for循环32次,只有一片的话,把for循环改为8次 huangyiting1990 发表于 2013-12-23 16:07
用逻辑分析仪抓波形分析。对应 时钟 数据 锁存看看。没记错的话 应该是上升沿采样。 ...
试了,可是时钟波形不是正常的高低信号 dlmaowf 发表于 2013-12-23 16:25
这是4片595级联的,所以for循环32次,只有一片的话,把for循环改为8次
#include <reg52.h>
#include <intrins.h>
sbit SCLK=P2^4;
sbit DAT=P2^5;
sbit SLCK=P2^6;
unsigned char code tab[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
void out595(void)
{
SLCK=0;
_nop_();
SLCK=1;
}
void sendbyte(unsigned char a)
{
unsigned char i;
for(i=0;i<32;i++)
{
SCLK=0;
DAT=a&0x80;
a=a<<1;
SCLK=1;
}
}
main()
{
unsigned char i;
unsigned intf=60000;
while(1)
{
for(i=0;i<9;i++)
{
sendbyte(tab);
out595();
while(f--);
}
}
}
大神你帮我看看,哪里不对呢 建议发数据的流程为:
移位输出数据 -> 锁存数据 -> OE使能并行输出.不要把OE设置为直接就输出了 仔细看数据手册吧,用了这么多年了,也没出现过什么问题。 unsigned char i;
for(i=0;i<32;i++)
只有一片595,不需要循环32次吧
sendbyte(tab);
out595();
数组tab的下标呢?
qinshi1208 发表于 2013-12-23 16:39
建议发数据的流程为:
移位输出数据 -> 锁存数据 -> OE使能并行输出.不要把OE设置为直接就输出了 ...
我的OE接的是地,但是我不明白的是为什么我的是乱码 dlmaowf 发表于 2013-12-23 16:54
unsigned char i;
for(i=0;i
我的事四片的 dlmaowf 发表于 2013-12-23 16:54
unsigned char i;
for(i=0;i
tab的下标没有粘贴出来,可能是未识别,下标是i void sendbyte(unsigned char a)
{
unsigned char i;
for(i=0;i<32;i++)
{
SCLK=0;
DAT=a&0x80;
a=a<<1;
SCLK=1;
}
}
unsigned char a;
a是一个字节,所以你循环32次没有用,后面都是0了
另外 DAT=a&0x80 ,即使循环32次,a左移的话,DAT=a&0x80000000
a右移的话,DAT=a&0x01 我用过三片级联的,驱动程序你看看还有帮助
#include "stm32f10x.h"
INT8U HC595DataBuf = {0};
/*
//23 22 21 20 19 18 17 16
R1 G1 R2 G2 R3 G3 R4
//15 14 13 12 11 10 9 8
G4 R5 G5 R6 G6
//7 6 5 4 3 2 1 0
ALED4 ALED3 ALED2 ALED1
*/
/*初始化硬件*/
void HC595InitIO (void)
{
Pin pindo[] = {PIO_74HC595};
PIO_74HC595RCCConf();
PIO_Configure(pindo,PIO_LISTSIZE(pindo));
HC595_LEDOnOff(&HC595DataBuf);//初始状态设置
}
/*串行数据输入IO*/
void DATA_IO(INT8U Value)
{
if(Value == 0)
{
GPIOE->BRR = GPIO_Pin_6;
}
else
{
GPIOE->BSRR = GPIO_Pin_6;
}
}
/*串行数据移位引脚控制*/
void SHIFT_IO(INT8U Value)
{
if(Value == 0)
{
GPIOE->BRR = GPIO_Pin_4;
}
else
{
GPIOE->BSRR = GPIO_Pin_4;
}
}
/*串行数据存储引脚控制*/
void DISP_IO(INT8U Value)
{
if(Value == 0)
{
GPIOE->BRR = GPIO_Pin_5;
}
else
{
GPIOE->BSRR = GPIO_Pin_5;
}
}
/*8位数据输入函数*/
void HC595_DataIn(INT8U Data)
{
for(INT8U i = 0; i < 8; i++)
{
SHIFT_IO(0);
DATA_IO(Data&0x01);
Data >>= 1;
__NOP();
SHIFT_IO(1);
}
}
/*8位数据移位输入完成后输出*/
void HC595_StatuOut(void)
{
DISP_IO(0);
__NOP();
__NOP();//72M下延时14ns
DISP_IO(1);
}
/*控制不同LED灯开关*/
void HC595_LEDOnOff(INT8U *pBuf)
{
HC595_DataIn(pBuf);
HC595_DataIn(pBuf);
HC595_DataIn(pBuf);
HC595_StatuOut();
}
需要显示哪一个就相应位置1,最后统一输出一次就好了。 墨逸、 发表于 2013-12-23 16:32
试了,可是时钟波形不是正常的高低信号
这是关键,连时钟信号都不标准 ,那就先查电路,时钟线,数据线可以适当的拉高试试。 365mcu 发表于 2013-12-23 17:14
我用过三片级联的,驱动程序你看看还有帮助
32的...看不懂 huangyiting1990 发表于 2013-12-23 17:56
这是关键,连时钟信号都不标准 ,那就先查电路,时钟线,数据线可以适当的拉高试试。 ...
实现循环了,只不过还是乱码,应该是数据输入的问题,不过问题已经基本解决了,感谢帮助
页:
[1]