??專欄【51單片機】
??喜歡的詩句:更喜岷山千里雪 三軍過后盡開顏。
??音樂分享【W(wǎng)aiting For Love】
大一同學小吉,歡迎并且感謝大家指出我的問題??
目錄
??74HC595圖片
??74HC595原理
??”上升沿“是什么意思
??LED點陣屏顯示圖形?
??現(xiàn)象
???代碼(三部分)
main.c?
Delay.c
Delay.h
??代碼分析
建議小白仔細閱讀下面的內(nèi)容
??74HC595有兩種,一種是接高電平的,一種是接低電平的
下面進行講解?
?
??接高電平
??原理
給SERCLK這個上升沿移位給低電平(因為上電的時候默認是高電平):比如給SER輸入一個值(第一個值是最高位),然后再給上升沿一位給高電平,進行移位,當給最到滿了給上升沿鎖存放置高電平,存放在右邊,
QH’指的是多片級聯(lián),如果超過8位的時候就使用這個多片級聯(lián),這樣就可以實現(xiàn)三位控制八位,十六位,三十二位等等這種,大大節(jié)省了io口,常常用于io口的擴展。
剛開始是空的,然后后面會從SER口傳入數(shù)據(jù)?
RCLK有什么用呢?
看下圖
就是把左邊的復制到右邊去,進行存儲?
如果存滿了,還從SER口傳入數(shù)據(jù)?,會怎么樣呢
會從右邊的QH',再開辟一個空間進行存儲
??”上升沿“是什么意思
在數(shù)字電路中,“上升沿”是指當一個數(shù)字信號由低電平變?yōu)楦唠娖降乃查g。也就是說,在上升沿之前這個信號的電平始終是低電平,在上升沿之后這個信號的電平就變成了高電平。
與“上升沿”相對應(yīng)的是“下降沿”,即當一個數(shù)字信號由高電平變?yōu)榈碗娖降乃查g。在下降沿之前這個信號的電平始終是高電平,在下降沿之后這個信號的電平就變成了低電平。
在數(shù)字電路中,上升沿和下降沿通常被用作時序分析和時序控制的基礎(chǔ)。比如,在移位寄存器中,時鐘脈沖的上升沿通常被用來控制數(shù)據(jù)的向寄存器內(nèi)部移動。當時鐘脈沖發(fā)生上升沿時,數(shù)據(jù)就會被“鎖存”到寄存器內(nèi)部,然后在下一個時鐘周期內(nèi)再根據(jù)時鐘脈沖的控制進行移位操作。?
?文章來源地址http://www.zghlxwxcb.cn/news/detail-431620.html
??LED點陣屏顯示圖形?
??現(xiàn)象
???代碼(三部分)
main.c?
#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寫入一個字節(jié)
* @param Byte 要寫入的字節(jié)
* @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 LED點陣屏顯示一列數(shù)據(jù)
* @param Column 要選擇的列,范圍:0~7,0在最左邊
* @param Data 選擇列顯示的數(shù)據(jù),高位在上,1為亮,0為滅
* @retval 無
*/
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
_74HC595_WriteByte(Data);
MATRIX_LED_PORT=~(0x80>>Column);
Delay(1);
MATRIX_LED_PORT=0xFF;
}
void main()
{
SCK=0;
RCK=0;
while(1)
{
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);
}
}
Delay.c
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
不明白這一段代碼怎么寫的同學建議看一下這一篇博客
【51單片機】使用STC燒錄軟件自動生成延時代碼_在下小吉.的博客-CSDN博客
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
??代碼分析
建議小白仔細閱讀下面的內(nèi)容
?
??接低電平?
因為接的是低電平,所以和第一種情況剛好相反?
在上升沿之后這個信號的電平就變成了低電平(高電平 —>低電平)
所以
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
?? ?u8 a;?? ???????SRCLK = 1;
? ? ??????RCLK = 1;?? ?for(a=0;a<8;a++)?? ??? ? //發(fā)送8位數(shù)
?? ?{
?? ??? ?SER = dat1 >> 7;?? ??? ? //從最高位開始發(fā)送
?? ??? ?dat1 <<= 1;? ? ? ? ??SRCLK = 0;?? ??? ??? ? //發(fā)送時序
?? ??? ?_nop_();
?? ??? ?_nop_();
? ? ? ? ??SRCLK = 1;?? ?
?? ?}??
? ? ??RCLK = 0;
?? ?_nop_();
?? ?_nop_();
? ? ??RCLK = 1;
}
剛好相反
??現(xiàn)象?
??連線?
??代碼例子以及分析
/**************************************************************************************
LED點陣--點亮一個點實驗
實現(xiàn)現(xiàn)象:下載程序后,LED點陣左上角第一個點的LED被點亮果
注意事項:必須將74HC595模塊的JP595短接片短接,否則不會出現(xiàn)現(xiàn)象
***************************************************************************************/
#include "reg51.h" //此文件中定義了單片機的一些特殊功能寄存器
#include "intrins.h"
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
typedef unsigned char u8;
//--定義使用的IO口--//
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
/*******************************************************************************
* 函 數(shù) 名 : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
* 函數(shù)功能 : 通過595發(fā)送四個字節(jié)的數(shù)據(jù)
* 輸 入 : dat1:第4個595輸出數(shù)值
* * dat2: 第5個595輸出數(shù)值
* * dat3:第2個595輸出數(shù)值
* * dat4:第1個595輸出數(shù)值
* 輸 出 : 無
*******************************************************************************/
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++) //發(fā)送8位數(shù)
{
SER = dat1 >> 7; //從最高位開始發(fā)送
dat1 <<= 1;
SRCLK = 0; //發(fā)送時序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //發(fā)送8位數(shù)
{
SER = dat2 >> 7; //從最高位開始發(fā)送
dat2 <<= 1;
SRCLK = 0; //發(fā)送時序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //發(fā)送8位數(shù)
{
SER = dat3 >> 7; //從最高位開始發(fā)送
dat3 <<= 1;
SRCLK = 0; //發(fā)送時序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //發(fā)送8位數(shù)
{
SER = dat4 >> 7; //從最高位開始發(fā)送
dat4 <<= 1;
SRCLK = 0; //發(fā)送時序
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
void main()
{
Hc595SendByte(0xff,0xfe,0x00,0x01);
while(1)
{
}
}
??注意
必須將74HC595模塊的JP595短接片短接,否則不會出現(xiàn)現(xiàn)象?? ?
就是下圖的東西
?
? ? ??如果大家有不明白的地方,或者文章有問題,歡迎大家在評論區(qū)討論,指正??文章來源:http://www.zghlxwxcb.cn/news/detail-431620.html
?
到了這里,關(guān)于【51單片機】LED點陣屏的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!