显示原理:
类似矩阵键盘,逐行or逐列扫描
74HC595是串行 寄存器 感觉就是三转八寄存器
并行:同时输出;串行:一位一位输出
先配置74HC595,重新进行位声明
sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER
显示实心爱心图形:
#include <REGX52.H>
#include "Delay.h"
sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER
void _74HC595_WriteByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);//要取第八位的数,那么如果Byte也是0x80 & 0x80的话,相当于1&1=1,那么Byte就可以取出第八位,其他为0,相当于1000 0000或者0000 0000//SER(一位数据)无论给什么数据,非零即一,所以可以直接给赋值八位的数据,赋值隐性转换为逻辑值了
SCK=1;
SCK=0;
}//放到移位寄存器
RCK=1;
RCK=0;
//P2=DPL;新板子的可以在子函数里面的RCK=0;下面加一句P2=DPL;就可以使用LED测试595了 或者 没有led灯的 可以再主函数main中加入P0=0x7F
}
void MatrixLED_ShowColumn(unsigned char Col,Data)
{
_74HC595_WriteByte(Data);
P0=~(0x80>>Col);//~是因为给0选中,给1不选中
Delay(1);
P0=0xFF;//这里清零是ff主要是共阳二极管的原因
}
void main()
{
SCK=0;
RCK=0;
while(1)
{
MatrixLED_ShowColumn(0,0x38);
MatrixLED_ShowColumn(1,0x7C);
MatrixLED_ShowColumn(2,0xFE);
MatrixLED_ShowColumn(3,0x7F);
MatrixLED_ShowColumn(4,0x7F);
MatrixLED_ShowColumn(5,0xFE);
MatrixLED_ShowColumn(6,0x7C);
MatrixLED_ShowColumn(7,0x38);
}
}
动画:
#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"
unsigned char code Animation[]={
0x00,0x18,0x3C,0x1E,0x1E,0x3C,0x18,0x00,
0x38,0x7C,0x7E,0x3F,0x3F,0x7E,0x7C,0x38,
0x00,0x18,0x3C,0x1E,0x1E,0x3C,0x18,0x00,
0x38,0x7C,0x7E,0x3F,0x3F,0x7E,0x7C,0x38,
};
void main()
{
unsigned int i,offset=0,count=0;
MatrixLED_Init();
while(1)
{
for(i=0;i<8;i++)
{
MatrixLED_ShowColumn(i,Animation[(i+offset)%32]);//animation[(i+offset)%32]可以循环播放
}
count++;
if(count>50)
{
count=0;
offset+=8;//一帧一帧的话+=8,滚动++
// if(offset>24)//32-8
// {
// break;
// }
}
}
}