寫這個文章是用來學習的,記錄一下我的學習過程。希望我能一直堅持下去,我只是一個小白,只是想好好學習,我知道這會很難,但我還是想去做!
本文寫于:2025.03.16
51單片機學習——第22節: LED點陣屏顯示圖形&動畫
- 前言
- 開發板說明
- 引用
- 解答和科普
- 一、LED顯示動畫(取幀)
- 二、LED動畫(流水)
- 問題
- 總結
前言
? ?本次筆記是用來記錄我的學習過程,同時把我需要的困難和思考記下來,有助于我的學習,同時也作為一種習慣,可以督促我學習,是一個激勵自己的過程,讓我們開始51單片機的學習之路。
? ?歡迎大家給我提意見,能給我的嵌入式之旅提供方向和路線,現在作為小白,我就先學習51單片機了,就跟著B站上的江協科技開始學習了.
? ?在這里會記錄下江協科技51單片機開發板的配套視頻教程所作的實驗和學習筆記內容,因為我之前有一個開發板,我大概率會用我的板子模仿著來做.讓我們一起加油!
? ?另外為了增強我的學習效果:每次筆記把我不知道或者問題在后面提出來,再下一篇開頭作為解答!
開發板說明
? ?本人采用的是慧凈的開發板,因為這個板子是我N年前就買的板子,索性就拿來用了。不再另外購買視頻中的普中開發板了。
? ?原理圖如下
視頻中的都用這個開發板來實現,如果有資源就利用起來。
仔細看了看:開發板的晶振為:11.0592Mhz;12Mhz晶振是用來給CH340G芯片外置晶振;
下圖是實物圖
引用
51單片機入門教程-2020版 程序全程純手打 從零開始入門
還參考了下圖中的書籍:
手把手教你學51單片機(C語言版)
STC89C52手冊
解答和科普
一、LED顯示動畫(取幀)
原理:
就是要把你展示的畫面逐幀的放入進數組中,讓他循環8次取的一幀的畫面,然后延遲一下,然后再展示下一幀動畫,這樣就動起來了。如本次實驗用來3幀,分別為M\、U、P,然后還做了越界判斷。這是一些細節。
1.1江協科技
#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"//動畫數據
unsigned char code Animation[]={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,Offset=0,Count=0;MatrixLED_Init();while(1){for(i=0;i<8;i++) //循環8次,顯示8列數據{MatrixLED_ShowColumn(i,Animation[i+Offset]);}Count++; //計次延時if(Count>15){Count=0;Offset+=8; //偏移+8,切換下一幀畫面if(Offset>16){Offset=0;}}}
}
#include <REGX52.H>
#include "Delay.h"sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER#define MATRIX_LED_PORT P0/*** @brief 74HC595寫入一個字節* @param Byte 要寫入的字節* @retval 無*/
void _74HC595_WriteByte(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 點陣屏初始化* @param 無* @retval 無*/
void MatrixLED_Init()
{SCK=0;RCK=0;
}/*** @brief LED點陣屏顯示一列數據* @param Column 要選擇的列,范圍:0~7,0在最左邊* @param Data 選擇列顯示的數據,高位在上,1為亮,0為滅* @retval 無*/
void MatrixLED_ShowColumn(unsigned char Column,Data)
{_74HC595_WriteByte(Data);MATRIX_LED_PORT=~(0x80>>Column);Delay(1);MATRIX_LED_PORT=0xFF;
}
#ifndef __MATRIX_LED_H__
#define __MATRIX_LED_H__void MatrixLED_Init();
void MatrixLED_ShowColumn(unsigned char Column,Data);#endif
1.2 慧凈開發板
#include <REGX52.H>
#include <INTRINS.H>sbit wei= P2^1;
sbit duan=P2^0;
sbit dianzhen=P2^2;
sbit LCDEN=P2^5;unsigned char code Animation[]={0xFF,0x11,0x55,0x6D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x7D,0x83,0xFF,0x07,0x7B,0x7B,0x7B,0x07,0x7F,0x7F,0x7F};void Delay(unsigned int xms) //@11.0592MHz
{while(xms--){unsigned char i, j;i = 2;j = 199;do{while (--j);} while (--i);}
}void MatrixLED_ShowColumn(unsigned char Column,Data)
{duan=1;P0=(0x80>>Column);duan=0;dianzhen=1;P0=Data;Delay(1);dianzhen=0;duan=1;P0=0x00;duan=0;}void main()
{unsigned char i,Offset=0,Count=0;LCDEN=0;wei=1;P0=0xff;wei=0;dianzhen=0;while(1){for(i=0;i<8;i++){MatrixLED_ShowColumn(i,Animation[i+Offset]);}Count++; //計次延時if(Count>50){Count=0;Offset+=8;//偏移+1,切換下一幀畫面if(Offset>16){Offset=0;}}}}
實驗現象:
LED點陣屏顯示動畫逐幀
二、LED動畫(流水)
注意取模的方式,最好先用88的動畫來看看是不是和開發板的選取模式相對應,我在這上面走了不少坑,昨天晚上調試了一晚上,可以選擇88的看看選的數據對不對驗證一下。
#include <REGX52.H>
#include <INTRINS.H>sbit wei= P2^1;
sbit duan=P2^0;
sbit dianzhen=P2^2;
sbit LCDEN=P2^5;unsigned char code Animation[]={0x3C,0x5A,0x66,0x7E,0x7E,0x7E,0xFF,0x7E,0x7E,0x7E,0x7E,0x7E,0x81,0xFF,0x03,0x7B,0x7B,0x03,0x7F,0x7F,0x7F,0x7F,0x83,0x7F,0x7F,0x01,0x7D,0x7D,0x7D,0x83,0xFF,0xFF
};void Delay(unsigned int xms) //@11.0592MHz
{while(xms--){unsigned char i, j;i = 2;j = 199;do{while (--j);} while (--i);}
}void MatrixLED_ShowColumn(unsigned char Column,Data)
{duan=1;P0=(0x80>>Column);duan=0;dianzhen=1;P0=Data;Delay(1);dianzhen=0;duan=1;P0=0x00;duan=0;}void main()
{unsigned char i,Offset=0,Count=0;LCDEN=0;wei=1;P0=0xff;wei=0;dianzhen=0;while(1){for(i=0;i<8;i++){MatrixLED_ShowColumn(i,Animation[i+Offset]);}Count++; //計次延時if(Count>50){Count=0;Offset++;//偏移+1,切換下一幀畫面if(Offset>24){Offset=0;}}}}
實驗現象:
LED點陣屏顯示動畫流動只移動一行
問題
1、能不能換個方向流動,目前來看我的LED點陣是往下流動,我想著是不是能做到左右移動。
總結
本節課主要學了LED點陣屏動畫,動畫的形成其實就是每一幀動畫再加上延遲,就會形成流動的動畫,我們只需要加上延遲,還有偏移量就能實現LED點陣屏來完成動畫的效果。