0909 发表于 2022-11-4 16:57:57

8*8点阵逐行显示问题

用的A5板子,将示例程序下载,并没有逐行显示而是跳着显示2-4-6-8行这种。将main函数for语句里改为hc595_write_data(ghc595_buf);就不亮了,想问下是哪里出错了
#include "reg51.h"

typedef unsigned int u16;        //对系统默认数据类型进行重定义
typedef unsigned char u8;

//定义74HC595控制管脚
sbit SRCLK=P3^6;        //移位寄存器时钟输入
sbit rCLK=P3^5;                //存储寄存器时钟输入
sbit SER=P3^4;                 //串行数据输入

#define LEDDZ_COL_PORT        P0        //点阵列控制端口

u8 ghc595_buf={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void delay_10us(u16 ten_us)
{
        while(ten_us--);       
}
void delay_ms(u16 ms)
{
        u16 i,j;
        for(i=ms;i>0;i--)
                for(j=110;j>0;j--);
}
void hc595_write_data(u8 dat)
{
        u8 i=0;
       
        for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
        {
                SER=dat>>7;//优先传输一个字节中的高位
                dat<<=1;//将低位移动到高位
                SRCLK=0;
                delay_10us(1);
                SRCLK=1;
                delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中       
        }
        rCLK=0;
        delay_10us(1);
        rCLK=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出       
}
void main()
{       
        u8 i=0;

        LEDDZ_COL_PORT=0x00;//将LED点阵列全部设置为0,即LED阴极为低电平
        while(1)
        {               
                for(i=0;i<8;i++)
                {       
                        hc595_write_data(0x00);//消除前面寄存器缓存数据
                        hc595_write_data(ghc595_buf);//写入新的数据
                        delay_ms(500);//延时500ms                                       
                }                                                                       
        }               
}

0909 发表于 2022-11-5 14:12:08

已经解决,注意p35和p36口

fly666 发表于 2023-1-13 22:50:31

0909 发表于 2022-11-5 14:12
已经解决,注意p35和p36口

什么原因呢??
页: [1]
查看完整版本: 8*8点阵逐行显示问题