|
用的是普中的EM3 V2.2的板子,在做运用两个595芯片控制8*8点阵时,遇到的问题:74HC595芯片的存储寄存器的控制引脚(STCP),手册上说上升沿触发,将移位寄存器里面的8位数据转移到输出引脚上,我的问题是在移位之前将STCP置0还是8次移位之后再进行置0然后触发上升沿呢?
我看的普中教程里面是(只截取了595芯片的驱动程序子函数):
void HC595_Send(unsigned char dat1,unsigned char dat2)
{
unsigned char i;
for(i=0;i<8;i++)
{
SDI(串行数据输入)=dat1>>7;
dat1<<=1;
SHCP(移位寄存器控制引脚)=0;
_nop_();
_nop_();
SHCP=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)
{
SDI=dat2>>7;
dat2<<=1;
SHCP=0;
_nop_();
_nop_();
SHCP=1;
_nop_();
_nop_();
}
STCP(移位寄存器控制引脚)=0;
_nop_();
_nop_();
STCP=1;
_nop_();
_nop_();
}
但我根据这个程序,我的 点阵是全亮。后来我更改了程序,就达到了实验效果,以下是我改后的程序:
#include<reg51.h>
#include<intrins.h>
unsigned char code ledbyte1[]={0xFF,0xC9,0xB6,0xBE,0xDD,0xEB,0xF7,0xFF};
unsigned char code ledbyte2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//定义两个数组,让点阵显示心型。
sbit SHCP=P3^6;
sbit STCP=P3^5;
sbit SDI=P3^4;
void main()
{
EA=1;
TMOD = 0x01;
TH0 = 0xFD;
TL0 = 0xD7; //配置定时器以及打开定时器和定时器中断
TR0 = 1;
ET0 = 1;
while(1);
}
void HC595_Send(unsigned char dat1,unsigned char dat2)
{
unsigned char i;
STCP=0;
for(i=0;i<8;i++)
{
SDI=dat1>>7;
dat1<<=1;
SHCP=0;
_nop_();
_nop_();
SHCP=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)
{
SDI=dat2>>7;
dat2<<=1;
SHCP=0;
_nop_();
_nop_();
SHCP=1;
_nop_();
_nop_();
}
STCP=1;
_nop_();
_nop_();
}
void InterruptT0 () interrupt 1
{
static unsigned char i=0;
TH0 = 0xFD;
TL0 = 0xD7;
//定时器定时0.6ms
switch(i)
{
case 0: HC595_Send(ledbyte1[0],ledbyte2[0]);i++;break;
case 1: HC595_Send(ledbyte1[1],ledbyte2[1]);i++;break;
case 2: HC595_Send(ledbyte1[2],ledbyte2[2]);i++;break;
case 3: HC595_Send(ledbyte1[3],ledbyte2[3]);i++;break;
case 4: HC595_Send(ledbyte1[4],ledbyte2[4]);i++;break;
case 5: HC595_Send(ledbyte1[5],ledbyte2[5]);i++;break;
case 6: HC595_Send(ledbyte1[6],ledbyte2[6]);i++;break;
case 7: HC595_Send(ledbyte1[7],ledbyte2[7]);i=0;break;
default:break;
}
}
看了好多人的程序都没有涉及到我想知道的这个点,在这想问问大神们595芯片STCP到底是如何触发的?
|
|