失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 51单片机——LED点阵屏(显示滚动画面)

51单片机——LED点阵屏(显示滚动画面)

时间:2019-03-17 14:18:03

相关推荐

51单片机——LED点阵屏(显示滚动画面)

目录

一、关于数码管、LED点阵屏显示的注意点

二、功能介绍

三、主要模块的介绍

3.1 74HC595模块和点阵屏显示函数

3.1.1 74HC595介绍

3.1.2 点阵屏显示函数MatrixLED()

3.2定时器中断模块

四、程序实现

五、效果展示

一、关于数码管、LED点阵屏显示的注意点

一定要消影,不然显示的画面有重影。不管是数码管还是LED点阵屏,都是"段选--位选--段选--位选"或者"位选--段选--位选--段选"循环来显示的,在每一个"段选--位选"或者"位选--段选"单元后面都要加一个延时函数,延时1ms等待显示稳定后,再进行"位选"或者"段选"的清零,即"段选—位选—延时1ms—清零位选—段选—位选"或者"位选—段选—延时1us—清零段选—位选—段选"。注意是清零段选还是清零位选。判断按键按下操作。有时按下按键,数码管就显示一下,又灭了,这可能就是没有对按键按下进行判断。在使用按键时,只有当我们按下按键时才会把键值返回,在没按的期间,返回的值是初始化的值。也就是说,返回的键值没有保存下来,只会在你按下的时候显示一次键值,没按的时候显示的是初始的值。

二、功能介绍

用LED点阵屏显示滚动的画面。

三、主要模块的介绍

3.1 74HC595模块和点阵屏显示函数

3.1.1 74HC595介绍

74HC595是串行输入,并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据。这里主要用来拓展I/O口。

74HC595的8个输出端DPh~DPa分别接点阵屏列的输入端D7~D0。从而控制列的显示。

通过SER口输入串行的数据,当SRCLK有上升沿信号时,数据就往下移一位,当数据满了8位时,给RCLK上升沿信号时,8位数据就锁存到QA~QH,QH'连接到下一片74HC595,继续拓展16位、32位....,这里只是3线拓展到8线,QH'就不用接了。这样单片机通过3个I/O口连接74HC595,输出8位数据。

3.1.2 74HC595初始化函数和输入函数

sbit SER=P3^4;sbit SCL=P3^6;sbit RCL=P3^5;/**函数名: _74HC595Write(unsigned char byte)*函数功能:向74HC595串行输入一个字节的数据*输入: byte:一个字节数据*输出: 无*/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; }/**函数名: _74HC595_Init()*函数功能:初始化74HC595的SCL、RCL*输入: 无*输出: 无*/void _74HC595_Init(){SCL=0;RCL=0;}

3.1.3点阵屏显示函数MatrixLED()

这里需要注意的就是要消影。

/**函数名: MatrixLED(unsigned char COL,unsigned char byte)*函数功能: 控制点阵屏某一列的显示*输入:COL:列 范围0~7; byte:要显示数据的二进制形式(8位)*输出:无*/void MatrixLED(unsigned char COL,unsigned char byte){_74HC595Write(byte);P0=~(0x80>>COL);Delay(1);P0=0xff;//消影}

3.2定时器中断模块

这里用定时器控制画面的移动速度,每100ms移动一下。

void Timer0_Init()//定时器0,工作方式1{TMOD=0x01;TH0=0xfc;//1msTL0=0x18;EA=1;ET0=1;TR0=1;}//定时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;}} }

四、程序实现

#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_UPvoid 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()//定时器0,工作方式1{TMOD=0x01;TH0=0xfc;//1msTL0=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;//消影}//定时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点阵屏滚动显示

如果觉得《51单片机——LED点阵屏(显示滚动画面)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。