微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机初学,LED点阵求助

单片机初学,LED点阵求助

时间:10-02 整理:3721RD 点击:
  刚开始接触单片机,自己做到控制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;
  }
}

谢谢,因为开始也是对照着别人写好的代码,然后再进行修改扩充的。自己还是太粗心了,非常感谢!

非常感谢你的回答!

你好,我发现了位定义的错误,你的代码我也确认过,但是现在烧入到我的单片机里依然是原样……我开始怀疑是我的开发板有问题了……

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top