话不多说,上代码,前提是你已经知道各行代码的意思。跟着老师的代码走最好,每一行都一样,要不然会有意想不到的错误,小白阶段就不要自己创新代码了。X﹏X
#include <REGX52.H>
sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER
#define MATRIX_LED_PORT P0 //宏定义P0口
//延时函数
void Delay(unsigned int xms)
{
unsigned char i,j;
while(xms)
{
i=2;
j=239;
do
{
while(--j);
}while(--i);
xms--;
}
}
void _74HC595_WriteByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);
SCK=1;//时钟每来一个上升沿,数据就会往下移,循环8次,
//把发送来的串行数据全部放到移位寄存中去;
SCK=0;//为下次移位做准备;
}
RCK=1; //把移位寄存器的数据搬运到输出缓存器中;
RCK=0;
}
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
_74HC595_WriteByte(Data);
MATRIX_LED_PORT=~(0x80>>Column);//选中列; 1000 0000取反0111 1111即选中第一列。
这2行段选,位选的顺序不能错,要不然有问题,食不食油饼,就这个bug,我想半天没想出来。心好痛😣。
Delay(1);
MATRIX_LED_PORT=0xFF;//消影
}
void main()
{
SCK=0;//单片机上电初始化后,所有I/O口都为高电平,所以上电后RCLK和SRCLK要置零;
RCK=0;
while(1)
{
//MatrixLED_ShowColumn(0,0x24);//显示第一列
MatrixLED_ShowColumn(1,0x18);//显示第二列
MatrixLED_ShowColumn(2,0x24);
MatrixLED_ShowColumn(3,0x22);
MatrixLED_ShowColumn(4,0x11);
MatrixLED_ShowColumn(5,0x22);
MatrixLED_ShowColumn(6,0x24);
MatrixLED_ShowColumn(7,0x18);
}
}