#include"reg52.h" typedef unsigned char u8; typedef unsigned int u16; //特殊管脚寄存器的对应一般不可变 sbit rCLK=P3^5;//移位寄存器时钟输入---注:RCLK已被reg52.h定义使用,需要重新定义 sbit SRCLK=P3^6;//存储寄存器时钟输入 sbit SER=P3^4;//串行数据输入 #define LEDDZ_COL_PORT P0 //点阵列控制端口 //使用矩阵控制点阵LED点亮 //如0x01是最后一行点亮,其他不亮,则最后一行是1,其他是0,此时是00000001,十六进制是0x01 u8 ghc595_buf[8]={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--); } //芯片通过移位寄存器时钟和存储寄存器(函数hc595_write_data)实现0x01 0x02 0x04 0x08 0x10等(用ghc595_buf代替)点亮灯的操作 //串行数据输入:先转化为字节,并1位1位存储在SER(串行数据输入),后通过SRCLK(移位存储器)在0-1变化产生上升沿传递给RCLK(存储寄存器) void hc595_write_data(u8 dat) { u8 i=0; for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中,因为1.2.3等都是1bit,8字节,需要1字节1字节的移动 { SER=dat>>7;//从高位到低位存储 dat<<=1;//将低位移动到高位 //形成0-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阴极为低电平,形成电势差,才能点亮led while(1) { for(i=0;i<8;i++) { hc595_write_data(0x00);//消影---消除前面寄存器缓存数据,使肉眼更清晰 hc595_write_data(ghc595_buf[i]);//写入新的数据 delay_ms(500);//延时500ms----也可以用另一个延时函数,只是数值会比较大,u16不满足 } } }