关于16*16点阵,用74HC595控制问题请教,谢谢老师
时间:10-02
整理:3721RD
点击:
用的某开发板,其原理图如下:
通过4个74HC595控制点阵的行与列
通过一次性向74HC595发送4个字节的方式,分别控制LED点阵的行与列
现碰到问题如下,为简单描述,用开发板自带的程序向老师们请教(这是显示一个点的程序):
============================================================
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit SCK=P3^6;
sbit LCK=P3^5;
sbit SDI=P3^4;
void HC595_Send(uchar dat1,uchar dat0,uchar dat2,uchar dat3);
void main()
{
while(1)
{
HC595_Send(0xff,0xfe,0x80,0x00);
}
}
void HC595_Send(uchar dat1,uchar dat0,uchar dat2,uchar dat3)
{
uchar i;
SCK=1;
LCK=1;
for(i=0;i<8;i++)
{
SDI=dat0&0x01; //从高位到低位
dat0>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)
{
SDI=dat1&0x01; //从高位到低位
dat1>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)
{
SDI=dat2&0x01; //从高位到低位
dat2>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)
{
SDI=dat3&0x01; //从高位到低位
dat3>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
LCK=0; //下面是输出时钟
_nop_();
_nop_();
LCK=1;
_nop_();
_nop_();
}
=====================================================
这个自带的程序dat0和dat1搞混了,在这里不是重点
我的疑问点在于,通过实验:
如果
while(1)
{
HC595_Send(0xff,0xfe,0x80,0x00);
}
我增加一行,同时去掉while(1)
HC595_Send(0xff,0xfe,0x80,0x00);
HC595_Send(只能显示一个点的数据);
那么一共显示两个点,但应该是第一个点瞬间显示一下,之后595数据更新,显示第二个点,不更新不变化
可实际上这两个点一直常亮,经过多次试验都是如此
如果有多个HC595_Send,按照道理每次595更新一次数据后点阵对应的点亮,上次更新前的不应该亮了
可实际做多次试验却是每次HC595_Send对应的点阵都亮
请老师指点!
通过4个74HC595控制点阵的行与列
通过一次性向74HC595发送4个字节的方式,分别控制LED点阵的行与列
现碰到问题如下,为简单描述,用开发板自带的程序向老师们请教(这是显示一个点的程序):
============================================================
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit SCK=P3^6;
sbit LCK=P3^5;
sbit SDI=P3^4;
void HC595_Send(uchar dat1,uchar dat0,uchar dat2,uchar dat3);
void main()
{
while(1)
{
HC595_Send(0xff,0xfe,0x80,0x00);
}
}
void HC595_Send(uchar dat1,uchar dat0,uchar dat2,uchar dat3)
{
uchar i;
SCK=1;
LCK=1;
for(i=0;i<8;i++)
{
SDI=dat0&0x01; //从高位到低位
dat0>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)
{
SDI=dat1&0x01; //从高位到低位
dat1>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)
{
SDI=dat2&0x01; //从高位到低位
dat2>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
for(i=0;i<8;i++)
{
SDI=dat3&0x01; //从高位到低位
dat3>>=1;
SCK=0;
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
}
LCK=0; //下面是输出时钟
_nop_();
_nop_();
LCK=1;
_nop_();
_nop_();
}
=====================================================
这个自带的程序dat0和dat1搞混了,在这里不是重点
我的疑问点在于,通过实验:
如果
while(1)
{
HC595_Send(0xff,0xfe,0x80,0x00);
}
我增加一行,同时去掉while(1)
HC595_Send(0xff,0xfe,0x80,0x00);
HC595_Send(只能显示一个点的数据);
那么一共显示两个点,但应该是第一个点瞬间显示一下,之后595数据更新,显示第二个点,不更新不变化
可实际上这两个点一直常亮,经过多次试验都是如此
如果有多个HC595_Send,按照道理每次595更新一次数据后点阵对应的点亮,上次更新前的不应该亮了
可实际做多次试验却是每次HC595_Send对应的点阵都亮
请老师指点!
请老师们指教!
我是刚刚接触单片机的菜鸟,也正在做16*16的点阵,请小编分享点经验
小编找到解决办法没?
学期实习要做这个,收藏一下
有用
谢谢小编了,谢谢
找了几个人,据说是编译器为防止程序跑飞编译成自动循环,和加while1一样
顺带,贪吃蛇已经做完了,正在看12864
增加延时试试。
12864驱动已完成:)
学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习
我也在做这个,但我的一个点都不亮,想请教一下,最简单的一个都不成功,下面复杂的做不下去,恳请会的解释一下
请问小编一次发送4个字节如何控制行与列啊,没看懂
楼楼,我硬件部分的链接不会啊怎么办?我用的是msp430,驱动芯片跟你一样的,能告诉我怎么连吗?
很有用 收藏了 小编一个赞