目的/效果
在《51单片机STC89C52RC——8.1 8*8 LED点阵模块(点亮一个LED)》我们点亮一个LED,接下来我们将在8*8的矩阵中展示动态的图像。
1:单列展示:
2:单行展示
3:笑脸
4:右移箭头
一,STC单片机模块
二,8*8 点阵
在 《51单片机STC89C52RC——8.1 8*8 LED点阵模块(点亮一个LED)》,我们了解了如何点亮点阵的LED。
在《51单片机STC89C52RC——3.2 数码管动态展示(多位动态)_stc89c52单只数码管显示0到f电路图-CSDN博客》中我们要多个LED展示需要 动态显示轮流显示各个字符。利用人眼视觉暂留的特点,循环顺序变更位码,同时数据线上发送相应的显示内容。
2.1 一列一列 亮
#include <REGX52.H>
#include "74HC595.h"
#include "Delay.h"
/*** 函 数:主函数* 参 数:无* 返 回 值:无*/
void main()
{ while(1){_74HC595_Show(0,0xff); //第一列Delay_ms(500);//延时500毫秒_74HC595_Show(1,0xff); //第二列Delay_ms(500);//延时500毫秒_74HC595_Show(2,0xff); //第三列Delay_ms(500);//延时500毫秒_74HC595_Show(3,0xff); //第四列Delay_ms(500);//延时500毫秒_74HC595_Show(4,0xff); //第五列Delay_ms(500);//延时500毫秒_74HC595_Show(5,0xff); //第六列Delay_ms(500);//延时500毫秒_74HC595_Show(6,0xff); //第七列Delay_ms(500);//延时500毫秒_74HC595_Show(7,0xff); //第八列Delay_ms(500);//延时500毫秒}
}
2.2 一行一行 亮
#include <REGX52.H>
#include "74HC595.h"
#include "Delay.h"
/*** 函 数:主函数* 参 数:无* 返 回 值:无*/
void main()
{ P0=0x00;//先全部置高电平while(1){_74HC595_WriteByte(0x80);Delay_ms(500);//延时500毫秒_74HC595_WriteByte(0x40);Delay_ms(500);//延时500毫秒_74HC595_WriteByte(0x20);Delay_ms(500);//延时500毫秒_74HC595_WriteByte(0x10);Delay_ms(500);//延时500毫秒_74HC595_WriteByte(0x08);Delay_ms(500);//延时500毫秒_74HC595_WriteByte(0x04);Delay_ms(500);//延时500毫秒_74HC595_WriteByte(0x02);Delay_ms(500);//延时500毫秒_74HC595_WriteByte(0x01);Delay_ms(500);//延时500毫秒 }
}
2.3 笑脸
#include <REGX52.H>
#include "74HC595.h"
#include "Delay.h"
/*** 函 数:主函数* 参 数:无* 返 回 值:无*/
void main()
{ P0=0x00;//先全部置高电平while(1){//笑脸_74HC595_Show(0,0x3C);_74HC595_Show(1,0x42);_74HC595_Show(2,0xA9);_74HC595_Show(3,0x85);_74HC595_Show(4,0x85);_74HC595_Show(5,0xA9);_74HC595_Show(6,0x42);_74HC595_Show(7,0x3C);}
}
2.4 右移箭头
#include <REGX52.H>
#include "74HC595.h"
#include "Delay.h"/*** 函 数:动态展示向右的箭头* 参 数:无* 返 回 值:无*/
void Show_RightArrow()
{int i=0,j=0,temp;unsigned char rightArrow_colData[8]= {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //箭头列数据unsigned char rightArrow_rowData[10]= {0x10,0x10,0x10,0x10,0x92,0x54,0x38,0x10,0x00,0x00}; //箭头行数据while(1){//交换行数据temp=rightArrow_rowData[9];for(j=9; j>0; j--){rightArrow_rowData[j]=rightArrow_rowData[j-1];}rightArrow_rowData[0]=temp;for(j=0; j<50; j++){rightArrow_rowData[0]=temp;for(i=0; i<8; i++) //循环8次扫描8行、列{P0=rightArrow_colData[i];//传送列选数据_74HC595_WriteByte(rightArrow_rowData[i]);//传送行选数据Delay_10us(10);//延时一段时间,等待显示稳定_74HC595_WriteByte(0x00);//消影} }}
}
/*** 函 数:主函数* 参 数:无* 返 回 值:无*/
void main()
{ Show_RightArrow();
}
三,创建Keil项目
详细参考:51单片机STC89C52RC——创建Keil项目-CSDN博客
四,代码
main.c
#include <REGX52.H>
#include "74HC595.h"
#include "Delay.h"/*** 函 数:动态展示向右的箭头* 参 数:无* 返 回 值:无*/
void Show_RightArrow()
{int i=0,j=0,temp;unsigned char rightArrow_colData[8]= {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //箭头列数据unsigned char rightArrow_rowData[10]= {0x10,0x10,0x10,0x10,0x92,0x54,0x38,0x10,0x00,0x00}; //箭头行数据while(1){//交换行数据temp=rightArrow_rowData[9];for(j=9; j>0; j--){rightArrow_rowData[j]=rightArrow_rowData[j-1];}rightArrow_rowData[0]=temp;for(j=0; j<50; j++){rightArrow_rowData[0]=temp;for(i=0; i<8; i++) //循环8次扫描8行、列{P0=rightArrow_colData[i];//传送列选数据_74HC595_WriteByte(rightArrow_rowData[i]);//传送行选数据Delay_10us(10);//延时一段时间,等待显示稳定_74HC595_WriteByte(0x00);//消影} }}
}
/*** 函 数:主函数* 参 数:无* 返 回 值:无*/
void main()
{ Show_RightArrow();
// P0=0x00;//先全部置高电平
// while(1)
// {
// //笑脸
// _74HC595_Show(0,0x3C);
// _74HC595_Show(1,0x42);
// _74HC595_Show(2,0xA9);
// _74HC595_Show(3,0x85);
// _74HC595_Show(4,0x85);
// _74HC595_Show(5,0xA9);
// _74HC595_Show(6,0x42);
// _74HC595_Show(7,0x3C);//一行行显示
// _74HC595_WriteByte(0x80);
// Delay_ms(500);//延时500毫秒
// _74HC595_WriteByte(0x40);
// Delay_ms(500);//延时500毫秒
// _74HC595_WriteByte(0x20);
// Delay_ms(500);//延时500毫秒
// _74HC595_WriteByte(0x10);
// Delay_ms(500);//延时500毫秒
// _74HC595_WriteByte(0x08);
// Delay_ms(500);//延时500毫秒
// _74HC595_WriteByte(0x04);
// Delay_ms(500);//延时500毫秒
// _74HC595_WriteByte(0x02);
// Delay_ms(500);//延时500毫秒
// _74HC595_WriteByte(0x01);
// Delay_ms(500);//延时500毫秒//一列列显示
// _74HC595_Show(0,0xff); //第一列
// Delay_ms(500);//延时500毫秒
// _74HC595_Show(1,0xff); //第二列
// Delay_ms(500);//延时500毫秒
// _74HC595_Show(2,0xff); //第三列
// Delay_ms(500);//延时500毫秒
// _74HC595_Show(3,0xff); //第四列
// Delay_ms(500);//延时500毫秒
// _74HC595_Show(4,0xff); //第五列
// Delay_ms(500);//延时500毫秒
// _74HC595_Show(5,0xff); //第六列
// Delay_ms(500);//延时500毫秒
// _74HC595_Show(6,0xff); //第七列
// Delay_ms(500);//延时500毫秒
// _74HC595_Show(7,0xff); //第八列
// Delay_ms(500);//延时500毫秒// }
}
Delay.c
/*** 函 数:延时函数 毫秒* 参 数:ms 延时多少毫秒* 返 回 值:无*/
void Delay_ms(int ms) //@12.000MHz
{unsigned char data i, j;while(ms--){ i = 2;j = 239;do{while (--j);} while (--i);}
}
/*** 函 数:延时函数 毫秒* 参 数:ms 延时多少毫秒* 返 回 值:无*/
void Delay_us(int ms) //@12.000MHz
{unsigned char data i, j;while(ms--){ i = 2;j = 239;do{while (--j);} while (--i);}
}
/*** 函 数:延时函数 10微秒* 参 数:无* 返 回 值:无*/
void Delay_10us(int _10us) //@11.0592MHz
{unsigned char data i;while(_10us--){i = 2;while (--i);}
}
Delay.h
#ifndef __DELAY_H_
#defind __DELAY_H_
void Delay_ms(int ms);
void Delay_10us(int _10us);
#endif
74HC595.c
#include <REGX52.H>
#include "Delay.h"//定义74HC595控制管脚
sbit _SRCLK=P3^6; //移位寄存器时钟输入
sbit _RCLK=P3^5; //存储寄存器时钟输入 注意:在 REGX52.H 中已经申明了RCLK
sbit _SER=P3^4; //串行数据输入 /*** 函 数:74HC595写入一个字节* 参 数:Byte 要写入的字节* 返 回 值:无*/
void _74HC595_WriteByte(unsigned int Byte)
{ unsigned char i;for(i=0;i<8;i++){_SER=Byte&(0x80>>i); //将1000 0000 右移i位后 & Byte_SRCLK=0; //移位寄存器置搞电平Delay_10us(1);_SRCLK=1; //移位寄存器置低电平/*这里有需要可以延时10微秒*/Delay_10us(1);}_RCLK=1; //存储寄存器置低电平Delay_10us(1);_RCLK=0; //存储寄存器置搞电平
}
/*** 函 数:LED点阵屏显示一列数据* 参 数:Column 要选择的列,范围:0~7,0在最左边,Data 选择列显示的数据,高位在上,1为亮,0为灭* 返 回 值:无*/
void _74HC595_Show(unsigned char Column,Byte)
{_74HC595_WriteByte(Byte); //向行写入数据P0=~(0x80>>Column); //向列写入数据Delay_10us(1); //等待显示稳定
}
74HC595.h
#ifndef __74HC595_H_
#defind __74HC595_H_
void _74HC595_WriteByte(unsigned int Byte);
void _74HC595_Show(unsigned char Column,Byte);
#endif
五,代码编译、下载到51单片机
代码编译请参考
《51单片机STC89C52RC——代码编译-CSDN博客》
代码下载请参考
《51单片机STC89C52RC——STCAI-ISP代码下载-CSDN博客》