单片机初学,LED点阵求助
程序控制只亮左上角的一盏灯,但是在代码没有问题的情况下左边第一列都亮了……
把控制代码都换了一下,发现只有哪一列亮是可以利用高低电平准确控制的,但是行没有办法
都是一亮一列的情况……
在网上看到有人说可能是跳线的问题(懵了一会……)查完跳线知识发现自己的单片机上貌似没有那种东西……
有知道的还希望给讲讲,谢谢啦。
附程序代码:
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^6;
void datSendByte(u8 dat)
{
u8 a;
SRCLK=0;
RCLK=0;
for(a=0;a<8;a++)
{
SER=dat>>7;
dat<<=1;
SRCLK=1;
_nop_();
_nop_();
SRCLK=0;
}
RCLK=1;
_nop_();
_nop_();
RCLK=0;
}
void main()
{
datSendByte(0x80);
P0=0x7f;
while(1);
}
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^6;
这个应该是串口转并口芯片74hc595的管脚位定义,很明显有管脚定义重复;
那么分析下,根据你的程序推断,你单片机的P0口连接点阵的列,利用74hc595芯片来控制行,由于上述的错误,74hc595并没有工作,没有输出0x80,而是默认的1,所以,P0选中某一列的话,那一列自然全亮。
我根据你程序,做了些proteus仿真,并修改下了程序,可以控制任意一个点
是你自己马虎,把代码写错了!把代码写错了!把代码写错了!
sbit SRCLK = P3^6; //这一行与最后一行
sbit RCLK = P3^5;
sbit SER = P3^6; //怎么可以用同一个I/O口呢?
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SER=P3^5;
sbit SRCLK=P3^4;
sbit RCLK_1=P3^6;
#define NOP _nop_()
void delay(void)
{
uchar jj;
for(jj=0;jj<200;jj++);
while(jj--);
}
void SerialSendData(uchar dat)
{
uchar ii;
uchar sdata=dat;
SER = 0;
SRCLK= 0;
RCLK_1= 0;
for(ii=0;ii<8;ii++)
{
if(sdata&0x80) SER=1;
else SER = 0;
sdata<<=1;
SRCLK =0;
NOP;
NOP;
SRCLK = 1;
NOP;
NOP;
}
RCLK_1= 1;
NOP;
NOP;
RCLK_1 = 0;
}
void main()
{
while(1){
SerialSendData(0X80);
P0=0X7F;
}
}
谢谢,因为开始也是对照着别人写好的代码,然后再进行修改扩充的。自己还是太粗心了,非常感谢!
非常感谢你的回答!
你好,我发现了位定义的错误,你的代码我也确认过,但是现在烧入到我的单片机里依然是原样……我开始怀疑是我的开发板有问题了……