我是初学者,大家帮我看看我想用AT89C52通过MAX7219驱动8x8点阵的程序哪里错了怎么改?

2024年11月20日 11:36
有2个网友回答
网友(1):

  亲,嗮出来的程序不够全哦,不过既然用MAX7219,那么对它的通信部分则都是一样的

  MAX7219 除了电源两根线之外,还需要三根信号线连接至单片机

  1、使能,即用来控制MAX7219是否允许写入数据的
  2、时钟、每更换一位字节数据则需要输出一个脉冲,作为时钟信号
  3、数据、在脉冲有效状态下传送数据,此数据是二进制位传递,非0即1

  只要对MAX7219的数据传输摆弄明白,那么久可以随意控制MAX7219驱动的电子元件了,数码管也好,LED点阵也罢,都在掌握之内

  MAX7219在进行通信的时候,是需要先送地址再送数据的,就是说要传递一个数据,就要进行两次通信

  打个比方,例如想把鞋子收起来,然而鞋柜却很多,那么收起鞋子的步骤只能是 先确定要放在哪里,然后再将鞋子放进去,所以MAX7219的通信原理就是这么简单

  话不多说,贴出个经过硬件测试通过的程序出来,供大家参考!

  这是一个利用一片MAX7219的八位数码管显示模块,程序中只是为了试验,所以只显示固定数字12-34-56,程序中的星号是各个函数之间区分用的,可以删除

  #include //通用89C52头文件
  sbit DN=P3^7; sbit CS=P3^6; sbit CL=P3^5;//MAX7219 端口定义
  void MaxINT(void); void Max(char Xi,char Yi); void MaxR(char ch);// Max7219
  void XSa(void);
  /***************************************************************************/
  void main(void)//主函数
  {
  MaxINT(); // MAX7219初始化

  while(1)
  {
  XSa(); //数据显示
  }
  }
  /***************************************************************************/
  void XSa(void)//显示时钟数据
  {
  Max(1,6); Max(2,5); Max(3,0x0a);
  Max(4,4); Max(5,3); Max(6,0x0a);
  Max(7,2); Max(8,1);
  }
  /***************************************************************************/
  void MaxINT(void)// MAX7219初始化
  {
  Max(0x0b,0x07);// 设置扫描界限
  Max(0x09,0xff);// 设置译码模式
  Max(0x0a,0x0a);// 设置亮度
  Max(0x0c,0x01);// 设置工作模式
  }
  /***************************************************************************/
  void Max(char Xi,char Yi)// Max7219 数据写入 主函数
  {CS=0;MaxR(Xi);MaxR(Yi);CS=1;}
  /***************************************************************************/
  void MaxR(char ch)// Max7219 数据写入 子函数
  {
  char m,temp;
  for (m=0;m<8;m++)
  {
  temp=ch&0x80; ch=ch<<1;
  if(temp){DN=1;CL=0;CL=1;}
  else{DN=0;CL=0;CL=1;}
  }
  }

网友(2):

错误在哪里?把错误列出来