四片HC595控制16*16点阵显示数字或汉字实例

时间:2025-03-07 11:52:59

#include""
#include""                     //微秒时间函数头文件

typedef unsigned int u16;           //对默认数据类型重新定义
typedef unsigned char u8;

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

//点阵列控制数据
u8 gled_col[32]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,             //显示数字0数据
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
//0x40,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x20,0x00,0x20,0x00,0x20,0x00,0xE0,0x0F,              //显示文字方数据
//0x20,0x08,0x20,0x08,0x20,0x08,0x10,0x08,0x10,0x08,0x08,0x08,0x04,0x05,0x02,0x02
};

//点阵行控制数据
u8 gled_row[32]=
{0x00,0x00,0xE0,0x03,0x10,0x04,0x08,0x08,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,
0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x08,0x10,0x04,0xE0,0x03,0x00,0x00
};

void delay_10us(u16 ten_us)                        //延时函数微秒
{
  while(ten_us--);
}

void delay_ms(u16 ms)                            //延时函数毫秒
{
   u8 i,j;
   for(i=ms;i>0;i--)
     for(j=110;j>0;j--);
}

void hc595_write_data(u8 dat1,u8 dat2,u8 dat3,u8 dat4)                   //dat1为行1-8,dat2为行9-16,dat3为列1-8,dat4为列9-16
{
  u8 i=0;
  for(i=0;i<8;i++)
  {
     SER=dat4>>7;
     dat4<<=1;
     SRCLK=0;
      _nop_();                  //空操作函数,不执行任何操作,但占用一个机器周期的时间。
                              //它常用于程序中的短暂延时或精确计时,它对应于汇编语言中的NOP指令。在单片机C语言中,nop();
                              //函数一般包含在头文件中,您需要#include <>才能使用它
     SRCLK=1;
      _nop_();
  }

  for(i=0;i<8;i++)
  {
     SER=dat3>>7;
     dat3<<=1;
     SRCLK=0;
     _nop_();
     SRCLK=1;
      _nop_();
  }

  for(i=0;i<8;i++)
  {
     SER=dat2>>7;
     dat2<<=1;
     SRCLK=0;
     _nop_();
     SRCLK=1;
     _nop_();
  }

  for(i=0;i<8;i++)
  {
    SER=dat1>>7;
    dat1<<=1;
    SRCLK=0;
    _nop_();
    SRCLK=1;
    _nop_();
  }
}


void main()                                                //主函数,1显示dat3行 HC595 3数据,2显示对应dat4行8-16行数据,3显示对应dat1    列1-8数据,4显示对应dat2列8-16数据
{
  u8 i=0;
  while(1)
  {
    for(i=0;i<16;i++)
    {
      hc595_write_data(gled_row[i],gled_row[i+16],~gled_col[i*2],~gled_col[i*2+1]);
      delay_10us(10);
      hc595_write_data(0x00,0x00,0x00,0x00);           //消隐,将四片HC595芯片行列都置零低电平
    }  
  }
}