目錄
?文章來源地址http://www.zghlxwxcb.cn/news/detail-416579.html
一、關(guān)于數(shù)碼管、LED點(diǎn)陣屏顯示的注意點(diǎn)
二、功能介紹
三、主要模塊的介紹
3.1 74HC595模塊和點(diǎn)陣屏顯示函數(shù)
3.1.1 74HC595介紹
3.1.2 點(diǎn)陣屏顯示函數(shù)MatrixLED()
3.2定時(shí)器中斷模塊
四、程序?qū)崿F(xiàn)
五、效果展示
?文章來源:http://www.zghlxwxcb.cn/news/detail-416579.html
一、關(guān)于數(shù)碼管、LED點(diǎn)陣屏顯示的注意點(diǎn)
- 一定要消影,不然顯示的畫面有重影。不管是數(shù)碼管還是LED點(diǎn)陣屏,都是"段選--位選--段選--位選"或者"位選--段選--位選--段選"循環(huán)來顯示的,在每一個(gè)"段選--位選"或者"位選--段選"單元后面都要加一個(gè)延時(shí)函數(shù),延時(shí)1ms等待顯示穩(wěn)定后,再進(jìn)行"位選"或者"段選"的清零,即"段選—位選—延時(shí)1ms—清零位選—段選—位選"或者"位選—段選—延時(shí)1us—清零段選—位選—段選"。注意是清零段選還是清零位選。
- 判斷按鍵按下操作。有時(shí)按下按鍵,數(shù)碼管就顯示一下,又滅了,這可能就是沒有對按鍵按下進(jìn)行判斷。在使用按鍵時(shí),只有當(dāng)我們按下按鍵時(shí)才會把鍵值返回,在沒按的期間,返回的值是初始化的值。也就是說,返回的鍵值沒有保存下來,只會在你按下的時(shí)候顯示一次鍵值,沒按的時(shí)候顯示的是初始的值。
二、功能介紹
? ? ? ? 用LED點(diǎn)陣屏顯示滾動的畫面。
三、主要模塊的介紹
3.1 74HC595模塊和點(diǎn)陣屏顯示函數(shù)
3.1.1 74HC595介紹
? ? ? ? 74HC595是串行輸入,并行輸出的移位寄存器,可用3根線輸入串行數(shù)據(jù),8根線輸出并行數(shù)據(jù)。這里主要用來拓展I/O口。
? ? ? ?74HC595的8個(gè)輸出端DPh~DPa分別接點(diǎn)陣屏列的輸入端D7~D0。從而控制列的顯示。
? ? ? 通過SER口輸入串行的數(shù)據(jù),當(dāng)SRCLK有上升沿信號時(shí),數(shù)據(jù)就往下移一位,當(dāng)數(shù)據(jù)滿了8位時(shí),給RCLK上升沿信號時(shí),8位數(shù)據(jù)就鎖存到QA~QH,QH'連接到下一片74HC595,繼續(xù)拓展16位、32位....,這里只是3線拓展到8線,QH'就不用接了。這樣單片機(jī)通過3個(gè)I/O口連接74HC595,輸出8位數(shù)據(jù)。
3.1.2 74HC595初始化函數(shù)和輸入函數(shù)
sbit SER=P3^4;
sbit SCL=P3^6;
sbit RCL=P3^5;
/*
*函數(shù)名: _74HC595Write(unsigned char byte)
*函數(shù)功能:向74HC595串行輸入一個(gè)字節(jié)的數(shù)據(jù)
*輸入: byte :一個(gè)字節(jié)數(shù)據(jù)
*輸出: 無
*/
void _74HC595Write(unsigned char byte)
{
int i=0;
for(i=0;i<8;i++)
{
SER=byte&(0x80>>i);
SCL=1;
SCL=0;
}
RCL=1;
RCL=0;
}
/*
*函數(shù)名: _74HC595_Init()
*函數(shù)功能:初始化74HC595的SCL、RCL
*輸入: 無
*輸出: 無
*/
void _74HC595_Init()
{
SCL=0;
RCL=0;
}
3.1.3?點(diǎn)陣屏顯示函數(shù)MatrixLED()
? ? ? ? 這里需要注意的就是要消影。
/*
*函數(shù)名: MatrixLED(unsigned char COL,unsigned char byte)
*函數(shù)功能: 控制點(diǎn)陣屏某一列的顯示
*輸入: COL:列 范圍0~7; byte:要顯示數(shù)據(jù)的二進(jìn)制形式(8位)
*輸出: 無
*/
void MatrixLED(unsigned char COL,unsigned char byte)
{
_74HC595Write(byte);
P0=~(0x80>>COL);
Delay(1);
P0=0xff;//消影
}
3.2定時(shí)器中斷模塊
? ? ? ? 這里用定時(shí)器控制畫面的移動速度,每100ms移動一下。
void Timer0_Init()//定時(shí)器0,工作方式1
{
TMOD=0x01;
TH0=0xfc;//1ms
TL0=0x18;
EA=1;
ET0=1;
TR0=1;
}
//定時(shí)100ms中斷
void Timer0_ISR() interrupt 1
{
static int count=0;
count++;
TH0=0xfc;
TL0=0x18;
if(count==100)//每100ms,offset加一,畫面移動左一下
{
count=0;
offset++;
if(offset>34)
{
offset=0;
}
}
}
四、程序?qū)崿F(xiàn)
#include <REGX52.H>
#include<INTRINS.H>
int offset=0;
sbit SER=P3^4;
sbit SCL=P3^6;
sbit RCL=P3^5;
unsigned char Animation[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x7E,0x81,0x81,0x81,0x81,0x82,0x00,0x03,
0x03,0x03,0x03,0x03,0x00,0xFE,0x01,0x01,
0x01,0x01,0x01,0xFE,0x00,0xFF,0x90,0x90,
0x90,0xE0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};//C_UP
void Delay(unsigned int Xms) //11.0592Mhz 1ms
{
unsigned char i, j;
while(Xms--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void Timer0_Init()//定時(shí)器0,工作方式1
{
TMOD=0x01;
TH0=0xfc;//1ms
TL0=0x18;
EA=1;
ET0=1;
TR0=1;
}
void _74HC595Write(unsigned char byte)
{
int i=0;
for(i=0;i<8;i++)
{
SER=byte&(0x80>>i);
SCL=1;
SCL=0;
}
RCL=1;
RCL=0;
}
void _74HC595_Init()
{
SCL=0;
RCL=0;
}
void MatrixLED(unsigned char COL,unsigned char byte)
{
_74HC595Write(byte);
P0=~(0x80>>COL);
Delay(1);
P0=0xff;//消影
}
//定時(shí)100ms中斷
void Timer0_ISR() interrupt 1
{
static int count=0;
count++;
TH0=0xfc;
TL0=0x18;
if(count==100)//每100ms,offset加一,畫面移動左一下
{
count=0;
offset++;
if(offset>34)//42-8
{
offset=0;
}
}
}
int main()
{
int i=0;
_74HC595_Init();
Timer0_Init();//T0初始化
while(1)
{
for(i=0;i<8;i++)
{
MatrixLED(i,Animation[i+offset]);
}
}
}
五、效果演示
LED點(diǎn)陣屏滾動顯示
?
?
?
?
?
?
?
到了這里,關(guān)于51單片機(jī)——LED點(diǎn)陣屏(顯示滾動畫面)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!