LED点阵屏滚动显示——基于51单片机

目录

 

一、关于数码管、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口。

    9ca2b39aa3cb4f2580799aaed5af7598.png

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

    8dcb314814914ffba92e714fff140da1.jpg

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

    79f0219bb45a46099a8f15d3ba6315c4.jpg

    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;	
    }
    

    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    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;//消影
    }

    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    3.2定时器中断模块

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

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

    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    四、程序实现

    #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()//定时器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;//消影
    }
    //定时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]);
    		}	 
    	}
    }

    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    五、效果演示

    LED点阵屏滚动显示

    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

     

     

     

     

     

     

     

    物联沃分享整理
    物联沃-IOTWORD物联网 » LED点阵屏滚动显示——基于51单片机

    发表评论