编辑代码

#include<reg51.h>

sbit SER =P3^4;//输入8位字节
sbit RCLK=P3^5;//上升时候寄存器数据全输出
sbit SRCLK=P3^6;//上升时候寄存器数据向下移动给新数据腾位置

char led[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//P00,P01,...P07的八位十六进制;0x01=00000001亮第一行
char lie[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//列P0低电平=0亮

typedef unsigned int u16;    //对系统默认数据类型进行重定义
typedef unsigned char u8;
/*******************************************************************************
* 函 数 名       : delay_10us
* 函数功能         : 延时函数,ten_us=1时,大约延时10us
* 输    入       : ten_us
* 输    出         : 无
*******************************************************************************/
void delay_10us(int ten_us)
{
    while(ten_us--);    
}

/*******************************************************************************
* 函 数 名       : delay_ms
* 函数功能         : ms延时函数,ms=1时,大约延时1ms
* 输    入       : ten_us
* 输    出         : 无
*******************************************************************************/
void delay_ms(int ms)
{
    int z,j;
    for(z=ms;z>0;z--)
        for(j=110;j>0;j--);
}


//存入八位的十六进制数据到ser中,最后rclk输出给led
void store(char c){
int i;
for(i=0;i<8;i++){

    SER=c>>7;//00000001;取最高位1存入ser
c<<=1;//左移一位去除最高位1,并自动填充:0 0000000
SRCLK=0;
delay_10us(1);
SRCLK=1;//上升寄存器的数据向下,给新数据存入
        delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中    
}

RCLK=0;
delay_10us(1);
RCLK=1;//上升寄存器的数据全部取出来
}



void main () {

int h;
  //  P0=0x00;
 
while(1){
 for(h=0;h<8;h++){//遍历存入8816进制到寄存器
 
 //nn列的点亮
store(led[h]);
P0=lie[h];

store(0x00);//寄存器清零
//delay_ms(500);
 }
}

   
}