LED點(diǎn)陣屏幕和驅(qū)動(dòng)代碼
我們先搞清楚74HC595的原理
sfr 特殊功能寄存器聲明
sbit 特殊位聲明
就舉個(gè)例子,我們?cè)谥暗母鞣N測試中對(duì)LED進(jìn)行控制會(huì)直接輸入P2=什么什么,那我想問你怎么知道P2口控制的就是LED呢,其實(shí)這些就是已經(jīng)在內(nèi)部聲明完成了,我們可以直接拿來使用
內(nèi)部已經(jīng)聲明完成了
sfr P0=0x80;
聲明P0口寄存器,物理地址為0x80
sbit P0_1=0x81;
聲明P0寄存器的第一位
因?yàn)閮?nèi)部已經(jīng)偷偷將其進(jìn)行了地址編碼了現(xiàn)在我們還與其他的方法實(shí)現(xiàn)
可位尋址和不可位尋址
因?yàn)槲挥?位,我們?cè)谶M(jìn)行設(shè)計(jì)的時(shí)候不可能完全照顧到每一位的方方面面,所以在設(shè)計(jì)的時(shí)候就已經(jīng)弱化了位數(shù)的概念,在每8個(gè)寄存器中,只有一個(gè)可位尋址的。
就像我們以前的TCON是可位尋址的
而TMOD是不可位
我們先寫一個(gè)
void _74HC595_WriteByte(unsigned char Byte)
{
//首先把數(shù)值賦給SER 而且有種入棧高位在前
//怎么取出第八位就是用
//因?yàn)樗皇钦f的那種地可尋
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);
SCK=1;
SCK=0;
}
RCK=1;
RCK=0;
}
這個(gè)目的就是我們寫入的數(shù)據(jù)都會(huì)通過SER進(jìn)入這幾個(gè)引腳上
然后我們?cè)賹懸粋€(gè)
void MatrixLED_Showcolumn(unsigned char column , Data)
{
_74HC595_WriteByte(Data);
P0=~(0x80>>column);
}
SER輸入的第一個(gè)數(shù)字是D7 然后依次類推
我懂了這兩個(gè)組合才可以生成一系列的數(shù)字
第一個(gè)相當(dāng)于是對(duì)行進(jìn)行操作
就是你輸入的后入先出 第一個(gè)是最大的,依次
下面這個(gè)代碼的作用是控制列 用來確定列的一些信息
MatrixLED_Showcolumn(0,0xAA);
所以我在輸入這句話之后,得出的結(jié)論是 先鎖定第0行再確定燈是10101010 因?yàn)槭?6進(jìn)制 ,
我覺得我發(fā)現(xiàn)一個(gè)問題就是 我并不是特別需要考慮后入先出的問題 因?yàn)槲业臒羰荄7 D6-----D0如此排列的 maybe 我們只要按照自己的常規(guī)思路去搭建就行了
and 為什么你說是0就是第0列 原因在這里
因?yàn)槲矣玫氖荘0=~(0x80>>column);
而例如我們選擇了P7 那相當(dāng)于把P7置于0 其他位上都是1 就是0111 1111
相對(duì)來說豈不是 1000 0000 的翻版
我選擇第1列 1011 1111相當(dāng)于0100 0000 的翻版 很合理
所以是如此選擇
我們每次進(jìn)行亮燈之后 我們都需要即時(shí)把燈的信息更新歸位?不然會(huì)影響下一次的操作
就像之前的那個(gè)一樣 一閃一閃不方便
我們就像之前做數(shù)字燈管,進(jìn)行 段選 位選 段選 位選 段選 位選 中間有一個(gè)小小的隔開的操作 以便快閃的發(fā)生
整個(gè)流程就是 段選 位選 延時(shí) 位清零 , 段選 位選 延時(shí) 位清零 , 段選 位選 延時(shí) 位清零
//此處添加代碼 完成 了上述各項(xiàng)操作
//此處添加代碼 完成 了上述各項(xiàng)操作
#include <REGX52.H>
#include"Delay.h"
sbit RCK=P3^5;//是P3的第五位 RCLK
sbit SCK=P3^6; // SRCLK
sbit SER=P3^4; // SER
//編譯的時(shí)候可能會(huì)出錯(cuò)因?yàn)槲覀冊(cè)谙到y(tǒng)內(nèi)部已經(jīng)有了一個(gè)RCLK的存在了
//所以我們稍微修改一下名字
void _74HC595_WriteByte(unsigned char Byte)
{
//首先把數(shù)值賦給SER 而且有種入棧高位在前
//怎么取出第八位就是用
//因?yàn)樗皇钦f的那種地可尋
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);
SCK=1;
SCK=0;
}
RCK=1;
RCK=0;
}
void MatrixLED_Showcolumn(unsigned char column , Data)
{
_74HC595_WriteByte(Data);
P0=~(0x80>>column);
Delay(1);
P0=0xFF;//段選 位選 位清零
}
void main()
{
//為了方便串口的實(shí)現(xiàn)將串口名字進(jìn)行統(tǒng)一的修改
SCK=0;
RCK=0;
//操縱點(diǎn)陣屏需要用到數(shù)碼管類似的代碼
while(1)
{
MatrixLED_Showcolumn(0,0x80);
MatrixLED_Showcolumn(1,0x40);
MatrixLED_Showcolumn(2,0x20);
MatrixLED_Showcolumn(3,0x10);
}
}
//顯示效果是點(diǎn)陣對(duì)角線
maybe 我們可以用excel先劃定大概的范圍確定 圖形的樣子 例如我們可以畫出一整個(gè)愛心什么的
MatrixLED_Showcolumn(0,0x3c);
MatrixLED_Showcolumn(1,0x42);
MatrixLED_Showcolumn(2,0xA9);
MatrixLED_Showcolumn(3,0x85);
MatrixLED_Showcolumn(4,0x85);
MatrixLED_Showcolumn(5,0xA9);
MatrixLED_Showcolumn(6,0x42);
MatrixLED_Showcolumn(7,0x3C);
/愛心代碼
對(duì)于整個(gè)數(shù)字的偏移的話,我們可以就是畫完整個(gè)圖然后一幀一幀的偏移移動(dòng)
取字是不是太麻煩了 ,我們選擇用文字取模軟件 嘻嘻
0xFF,0x08,0x08,0x08,0x08,0x08,0xFF,0x00,0x0E,0x15,0x15,0x15,0x09,0x00,0xFF,0x00,
0xFF,0x00,0x00,0x0F,0x09,0x09,0x0F,0x00,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x00,
存東西要存的很大我們可以放在flash 里面
unsigned char code Animation[]
但是存在flash里面 只能讀取不能修改
//以下是流動(dòng)顯示HELLO ! 的代碼
main.c
#include <REGX52.H>
#include"Delay.h"
#include"MatrixLED.h"
unsigned char Animation[]={
0xFF,0x08,0x08,0x08,0x08,0x08,0xFF,0x00,0x0E,0x15,0x15,0x15,0x09,0x00,0xFF,0x00,
0xFF,0x00,0x00,0x0F,0x09,0x09,0x0F,0x00,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x00};
void main()
{
unsigned char i , offset=1,count=3;
//為了方便串口的實(shí)現(xiàn)將串口名字進(jìn)行統(tǒng)一的修改
MatrixLED_Init();
//操縱點(diǎn)陣屏需要用到數(shù)碼管類似的代碼
while(1)
{
for(i=0;i<8;i++)
{
MatrixLED_Showcolumn(i,Animation[i+offset]);
}
count++;
if(count>10)
{
count=0;
offset++;
if(offset>24)
{
offset=0;
}
}
}
}
Delay.c
void Delay(unsigned int xms)
//
//
//
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
MartixLED.c文章來源:http://www.zghlxwxcb.cn/news/detail-510222.html
#include <REGX52.H>
#include"Delay.h"
#include"MatrixLED.h"
sbit RCK=P3^5;//是P3的第五位 RCLK
sbit SCK=P3^6; // SRCLK
sbit SER=P3^4; // SER
//編譯的時(shí)候可能會(huì)出錯(cuò)因?yàn)槲覀冊(cè)谙到y(tǒng)內(nèi)部已經(jīng)有了一個(gè)RCLK的存在了
//所以我們稍微修改一下名字
#define MATRIX_LED_PORT P0
//74HC595 寫入一個(gè)字節(jié)
//要寫入的字節(jié)
//第一個(gè)是控制整行
//然后下一個(gè)是確定單列的數(shù)據(jù)
//
//
//
void _74HC595_WriteByte(unsigned char Byte)
{
//首先把數(shù)值賦給SER 而且有種入棧高位在前
//怎么取出第八位就是用
//因?yàn)樗皇钦f的那種地可尋
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);
SCK=1;
SCK=0;
}
RCK=1;
RCK=0;
}
void MatrixLED_Init()
{
SCK=0;
RCK=0;
}
matrixLED.h文章來源地址http://www.zghlxwxcb.cn/news/detail-510222.html
#ifndef __MATRIX_LED_H_
#define __MATRIX_LED_H_
void MatrixLED_Init();
void MatrixLED_Showcolumn(unsigned char column , Data);
#endif
到了這里,關(guān)于【【51單片機(jī)實(shí)現(xiàn)LED點(diǎn)陣屏幕和動(dòng)畫顯示】】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!