8x8LED点阵+单片机+普中+江科大自化协
1 功能:
(1)静态显示:显示一个笑脸;
(2)动态显示:a,移动显示“HELLO!”,b,显示笑脸哭脸的变化;
2 原理
3 框图
4 硬件原理图
5 软件设计
5.1 静态显示源程序
(1)主函数
#include <REGX52.H> #include "delay100ms.h" sbit SER = P3^4; //74HC595的串行数据输入DS sbit RCK = P3^5; //74HC595的移位寄存器SH_CP sbit SCK = P3^6; //74HC595的锁存寄存器ST_CP #define matrixled_col P0 //笑脸的数据,列向取模 unsigned char code disp[]={0x3C,0x42,0xA9,0x85,0x85,0xA9,0x42,0x3C}; /** * @brief:74HC595写入一个字节 * @param:需要写入的字节 * @retval:无 */ void hc74595_wrbyte(unsigned char byte) { unsigned char i; for(i=0;i<8;i++) { SER = byte & (0x80>>i); SCK = 1; SCK = 0; } RCK = 1; RCK = 0; } /** * @brief:LED点阵显示屏显示1列数据 * @param: column 选择要显示的列,范围0-7,0在最左边 * @param: dat 选择列显示的数据,高位在上,1为亮,0为灭 * @retval:无 */ void matrixled_showcol(unsigned char column,dat) { hc74595_wrbyte(dat); matrixled_col = ~(0x80>>column); delay100ms(1); matrixled_col = 0xff; } void main() { unsigned char i; SCK = 0; RCK = 0; while(1) { for(i=0;i<8;i++) { matrixled_showcol(i,disp[i]); } } }
(2)延时函数及头文件
#include <REGX52.H> #include <intrins.H> void delay100ms(unsigned int x) //@11.0592MHz { unsigned char i; while(x--) { _nop_(); i = 43; while (--i); } }
#ifndef _delay100ms_h_ #define _delay100ms_h_ void delay100ms(unsigned int x); #endif
5.2 动态显示
5.2.1 移动显示HELLO!!
(1)主函数
#include <REGX52.H> #include "matrix_8x8led.h" unsigned char code disp[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //0-7,空白区域 0x00,0x7F,0x08,0x08,0x7F,0x00,0x7F,0x49, //8-39,HELLO!! 0x49,0x49,0x00,0x7F,0x49,0x49,0x49,0x00, 0x7F,0x01,0x01,0x01,0x00,0x7F,0x41,0x41, 0x7F,0x00,0x00,0x7B,0x7B,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 //40-47,空白区域 }; void main() { unsigned char i; unsigned char offset=0; //偏移量 unsigned char count=0; //延时计数 matrix_8x8led_init(); //LED点阵初始化 while(1) { for(i=0;i<8;i++) //循环8次,显示8列数据,即一帧数据 { matrix_8x8led_showcol(i,disp[i+offset]); count++; //计数延时,影响数据移动快慢 if(count>20) { count = 0; offset++; if(offset>40) offset=0; } } } }
(2)LED点阵驱动函数
#include <REGX52.H> #include "delay100ms.h" #define matrixled_col P0 sbit SER = P3^4; //74HC595的串行数据输入DS sbit RCK = P3^5; //74HC595的移位寄存器SH_CP sbit SCK = P3^6; //74HC595的锁存寄存器ST_CP /** * @brief:74HC595写入一个字节 * @param:需要写入的字节 * @retval:无 */ void hc74595_wrbyte(unsigned char byte) { unsigned char i; for(i=0;i<8;i++) { SER = byte & (0x80>>i); SCK = 1; SCK = 0; } RCK = 1; RCK = 0; } /** * @brief: LED点阵显示屏初始化 * @param: 无 * @retval:无 */ void matrix_8x8led_init() { SCK = 0; RCK = 0; } /** * @brief:LED点阵显示屏显示1列数据 * @param: column 选择要显示的列,范围0-7,0在最左边 * @param: dat 选择列显示的数据,高位在上,1为亮,0为灭 * @retval:无 */ void matrix_8x8led_showcol(unsigned char column,dat) { hc74595_wrbyte(dat); matrixled_col = ~(0x80>>column); delay100ms(10); matrixled_col = 0xff; }
#ifndef _matrix_8x8led_h_ #define _matrix_8x8led_h_ void matrix_8x8led_init(); void matrix_8x8led_showcol(unsigned char column,dat); #endif
(3)延时函数:略
5.2.2 笑脸哭脸变化
(1)主函数
#include <REGX52.H> #include "matrix_8x8led.h" unsigned char code disp[]={ 0x3C,0x42,0xA9,0x85,0x85,0xA9,0x42,0x3C, //笑脸 0x3C,0x42,0xA1,0x85,0x85,0xA1,0x42,0x3C, //一般 0x3C,0x42,0xA5,0x89,0x89,0xA5,0x42,0x3C //哭脸 }; void main() { unsigned char i; unsigned char offset=0; //偏移量 unsigned char count=0; //延时计数 matrix_8x8led_init(); //LED点阵初始化 while(1) { for(i=0;i<8;i++) //循环8次,显示8列数据,即一帧数据 { matrix_8x8led_showcol(i,disp[i+offset]); count++; //计数延时,影响数据移动快慢 if(count>20) { count = 0; offset+=8; //偏移+8,切换下一帧画面 if(offset>16) offset=0; } } } }
6 仿真电路图
6.1 显示笑脸效果
6.2 移动HELLO! 略
6.3 笑脸和哭脸变化 略
7 相关资料
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了