#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芯片行列都置零低电平
}
}
}