直流电机驱动10秒,然后LED显示“磊”字

#include "reg52.h"
#include "intrins.h"// 调用_nop_()函数,一个nop就是一个机器周期,1us
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;//定义74HC595控制管脚
sbit SRCLK=P3^6; //移位寄存器时钟输入
sbit RCLK=P3^5; //存储寄存器时钟输入
sbit SER=P3^4; //串行数据输入
sbit DC_Motor=P1^0;
#define DC_MOTOR_RUN_TIME 10000 //宏定义
void delay_ms(u16 ms)//延时函数,输入1,延时1ms
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
//LED点阵显示汉字磊的列控制数据。第三片595控制前8列,第四片595控制后8列
u8 gled_col[32]=
{0xFE,0x3F,0x20,0x00,0x10,0x00,0xF8,0x0F,0x14,0x08,0x12,0x08,0xF1,0x0F,0x00,0x00,
0x7E,0x7F,0x08,0x04,0x04,0x02,0x7E,0x3F,0xC5,0x22,0x44,0x22,0x7C,0x3E,0x44,0x22,};//最后一个逗号可去可留
//LED点阵显示汉字磊的行控制数据。第一片595控制前8行,第二片595控制后8行
u8 gled_row[32]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//0x01第一行高有效,0x02第二行高有效。控制前8行时,后8行数据全低无效
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//摆放顺序可以替换,但要保证每一行都被扫描到,同时其他行为0,main函数中调用函数也要修改,
//上下对应的两个为整个16行,如0x01与0x00对应一次扫描,第一行高有效,其他行都为低无效。所以main函数中调用行前8行gled_row[i],后8行gled_row[i+16],
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void hc595_write_data(u8 dat1,u8 dat2,u8 dat3,u8 dat4)//dat1,dat2,dat3,dat4,分别是第一、二、三、四个595
{
u8 i=0;
for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
{
SER=dat4>>7;//优先传输一个字节中的高位
dat4<<=1;//将低位移动到高位
SRCLK=0;
// delay_10us(1);
_nop_();
SRCLK=1;
_nop_();
// delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
}
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_();
}
RCLK=1;
delay_10us(1);
RCLK=0;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出
}
void main()
{
u8 i=0;
DC_Motor=1;
delay_ms(DC_MOTOR_RUN_TIME);
DC_Motor=0;
while(1)
{
for(i=0;i<16;i++)//循环16次扫描16行、列
{
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);//消影
}
}
}