5.1 单片机-16x16LED点阵屏

Posted DS小龙哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.1 单片机-16x16LED点阵屏相关的知识,希望对你有一定的参考价值。

5.1 16x16点阵滚动显示

5.1.1 点阵原理图

图5-1-1 点阵原理图 

图5-1-2

5.1.2 单个汉字纵向移动示例

图5-1-3 纵向滚动取软件模配置方式(LCD2002)

图5-1-4 纵向滚动取模软件配置方式(字模提取V2.1)

示例代码:

#include <reg51.h> //定义了一些51单片机通用的寄存器地址
/*
第一片595芯片(U4)  控制行的上8个IO口(高电平有效)
第二片595芯片(U5)  控制行的下8个IO口(高电平有效)
第三片595芯片(U16) 控制列的左8个IO口(低电平有效)
第四片595芯片(U17) 控制列的右8个IO口(低电平有效)
*/
code u8 font[]=

 0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x03,0xE0,0x7B,0xEF,0x7B,
 0xEF,0x7B,0xEF,0x7B,0xEF,0x7B,0xEF,0x03,0xE0,0x7B,0xEF,0x7F,0xFF,
 0x7F,0xFF,0x7F,0xFF,0x7F,0xFF
;/*"中",16X16 横向取模 从左到右  低位在前*/

//12MHZ  工作在12T模式下  执行i++语句花费的时间是12us
#define TIME 100
int main(void)

    u16 row; //行
    u8 i,j,n=0;
    u8 *p;
    p=font; //将数组的地址赋值给p
    while(1)
    
        for(j=0;j<TIME;j++)
        
            p=font+n; //将数组的地址赋值给p
            for(i=0;i<16;i++)
            
                row=0x0000; //行的初始值,全部关闭
                row|=1<<i; //单独点亮每一行
                if(p-font>=32) //判断指针是否溢出
                
                    HC595_WriteByte(0xFF); //控制列的右8个IO口(低电平有效)
                    HC595_WriteByte(0xFF); //控制列的左8个IO口(低电平有效)
                
                else
                
                    HC595_WriteByte(*(p+1)); //控制列的右8个IO口(低电平有效)
                    HC595_WriteByte(*p);//控制列的左8个IO口(低电平有效) 
                     p+=2; //显示下一行
                
                HC595_WriteByte(row>>8);//控制行的下8个IO口(高电平有效)
                HC595_WriteByte(row);   //控制行的上8个IO口(高电平有效)
                HC595_DatOut(); //将缓冲区 的数据输出到物理IO口上
            
        
        n+=2;
        if(n>=32)n=0;
    


//定义74HC595的IO口
sbit HC595_DAT=P3^4; //数据输出(对于单片机来说)
sbit HC595_RCK=P3^5; //控制存储器(缓存区)的输出时钟
sbit HC595_SCK=P3^6; //控制数据输出的时钟(上升沿)
/*
函数功能: 向74H595写入一个字节
函数形参: 写入的字节数据
函数说明: 先发高位
*/
void HC595_WriteByte(u8 byte)

    u8 i;
    for(i=0;i<8;i++)
    
        if(byte&0x80)HC595_DAT=1;
        else HC595_DAT=0;
        byte<<=1;
        //产生上升沿
        HC595_SCK=0;
        HC595_SCK=1;
    


/*
函数功能: 输出使能--控制595将存储器里的数据输出到总线(8)
*/
void HC595_DatOut(void)

    //上升沿将存储器的数据输出到总线
    //下降沿保持输出状态
    HC595_RCK=0;
    HC595_RCK=1;
    HC595_RCK=0;

5.1.3 多个汉字纵向移动示例

取模软件的配置方法同上(5.1.2)。

示例代码:

#include <reg51.h> //定义了一些51单片机通用的寄存器地址
#include "delay.h"
#include "type.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "hc595.h"
/*
第一片595芯片(U4)  控制行的上8个IO口(高电平有效)
第二片595芯片(U5)  控制行的下8个IO口(高电平有效)
第三片595芯片(U16) 控制列的左8个IO口(低电平有效)
第四片595芯片(U17) 控制列的右8个IO口(低电平有效)
*/
code u8 font[]=

    /*--  文字:  蓝  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    0x10,0x04,0x10,0x04,0xFF,0x7F,0x10,0x04,0x20,0x01,0x24,0x01,0x24,0x3F,0x24,0x05,
    0xA4,0x08,0x00,0x00,0xFC,0x1F,0x24,0x12,0x24,0x12,0x24,0x12,0xFF,0x7F,0x00,0x00,

    /*--  文字:  桥  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    0x04,0x08,0x04,0x1E,0xC4,0x03,0x04,0x02,0x1F,0x02,0xE4,0x7F,0x04,0x05,0x8E,0x08,
    0x56,0x10,0xA5,0x68,0x85,0x08,0x84,0x08,0x84,0x08,0x44,0x08,0x44,0x08,0x24,0x08,

    /*--  文字:  杯  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    0x08,0x00,0x08,0x00,0xC8,0x7F,0x08,0x04,0x3F,0x04,0x08,0x02,0x1C,0x02,0x2C,0x0B,
    0x8A,0x12,0x4A,0x22,0x29,0x22,0x08,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0x08,0x02,

    /*--  文字:  比  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    0x00,0x01,0x04,0x01,0x04,0x01,0x04,0x21,0x04,0x11,0x04,0x09,0x7C,0x05,0x04,0x03,
    0x04,0x01,0x04,0x01,0x04,0x01,0x04,0x41,0x64,0x41,0x1C,0x41,0x04,0x7E,0x00,0x00,

    /*--  文字:  赛  --*/
    /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
    0x80,0x00,0xFE,0x7F,0x22,0x42,0xF9,0x2F,0x20,0x02,0xFC,0x1F,0x20,0x02,0xFF,0x7F,
    0x10,0x04,0xF8,0x0F,0x94,0x14,0x93,0x64,0x90,0x04,0x50,0x05,0x20,0x02,0x18,0x04,

;/*"中",16X16 横向取模 从左到右  低位在前*/

//12MHZ  工作在12T模式下  执行i++语句花费的时间是12us
#define TIME 10
int main(void)

    u16 row; //行
    u8 i,j,n=0;
    u8 *p;
    p=font; //将数组的地址赋值给p
    while(1)
    
        for(j=0;j<TIME;j++)
        
            p=font+n; //将数组的地址赋值给p
            for(i=0;i<16;i++)
            
                row=0x0000; //行的初始值,全部关闭
                row|=1<<i; //单独点亮每一行
                if(p-font>=32*5) //判断指针是否溢出
                
                    HC595_WriteByte(0xFF); //控制列的右8个IO口(低电平有效)
                    HC595_WriteByte(0xFF); //控制列的左8个IO口(低电平有效)
                
                else
                
                    HC595_WriteByte(~(*(p+1))); //控制列的右8个IO口(低电平有效)
                    HC595_WriteByte(~(*p));//控制列的左8个IO口(低电平有效) 
                     p+=2; //显示下一行
                
                HC595_WriteByte(row>>8);//控制行的下8个IO口(高电平有效)
                HC595_WriteByte(row);   //控制行的上8个IO口(高电平有效)
                HC595_DatOut(); //将缓冲区 的数据输出到物理IO口上
            
        
        n+=2;
        if(n>=32*5)n=0;
    


//定义74HC595的IO口
sbit HC595_DAT=P3^4; //数据输出(对于单片机来说)
sbit HC595_RCK=P3^5; //控制存储器(缓存区)的输出时钟
sbit HC595_SCK=P3^6; //控制数据输出的时钟(上升沿)

/*
函数功能: 向74H595写入一个字节
函数形参: 写入的字节数据
函数说明: 先发高位
*/
void HC595_WriteByte(u8 byte)

    u8 i;
    for(i=0;i<8;i++)
    
        if(byte&0x80)HC595_DAT=1;
        else HC595_DAT=0;
        byte<<=1;
        //产生上升沿
        HC595_SCK=0;
        HC595_SCK=1;
    


/*
函数功能: 输出使能--控制595将存储器里的数据输出到总线(8)
*/
void HC595_DatOut(void)

    //上升沿将存储器的数据输出到总线
    //下降沿保持输出状态
    HC595_RCK=0;
    HC595_RCK=1;
HC595_RCK=0;

 5.1.4 多个汉字横向移动示例

图5-1-5 点阵横向滚动字模软件配置方式

示例代码:

#include <reg51.h> //定义了一些51单片机通用的寄存器地址
#include "delay.h"
#include "type.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "hc595.h"
/*
第一片595芯片(U4)  控制行的上8个IO口(高电平有效)
第二片595芯片(U5)  控制行的下8个IO口(高电平有效)
第三片595芯片(U16) 控制列的左8个IO口(低电平有效)
第四片595芯片(U17) 控制列的右8个IO口(低电平有效)
*/
code u8 font[]=

0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x08,0x21,0xF0,0x30,0x00,0x00,/*"2",0*/

0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",1*/

0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x08,0x21,0xF0,0x30,0x00,0x00,/*"2",2*/

0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",3*/

0x00,0x04,0x20,0x04,0x18,0x04,0xC7,0x07,0x44,0x04,0x44,0x04,0x44,0x04,0x44,0x04,0xFC,0xFF,0x44,0x04,0x44,0x04,0x44,0x04,0x44,0x04,0x04,0x04,0x00,0x04,0x00,0x00,/*"年",4*/

0x00,0x00,0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,/*"1",5*/

0x00,0x80,0x00,0x40,0x00,0x30,0xFE,0x0F,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x02,0x22,0x42,0x22,0x82,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,/*"月",6*/

0x00,0x00,0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,/*"1",7*/

0x00,0x00,0x18,0x00,0x08,0x00,0x08,0x3E,0x88,0x01,0x68,0x00,0x18,0x00,0x00,0x00,/*"7",8*/

0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"日",9*/
;

//12MHZ  工作在12T模式下  执行i++语句花费的时间是12us
#define TIME 10
int main(void)

    u16 col; //列
    u8 i,j;
    u8 cnt=0;
    u8 *p=font;
    while(1)
     
       for(j=0;j<TIME;j++)
       
           p=font+cnt;
           for(i=0;i<16;i++)
           
               col=0xFFFF; //列的初始值,全部关闭
               col&=~(1<<i); //单独点亮每一列
               HC595_WriteByte(col>>8); //控制列的右8个IO口(低电平有效)
               HC595_WriteByte(col);//控制列的左8个IO口(低电平有效)
               if(p-font>=(32*3)+(16*7))
               
                  HC595_WriteByte(0x0000);//控制行的下8个IO口(高电平有效)
                  HC595_WriteByte(0x0000);   //控制行的上8个IO口(高电平有效)
               
               else
               
                  HC595_WriteByte(*(p+1));//控制行的下8个IO口(高电平有效)
                  HC595_WriteByte(*p);   //控制行的上8个IO口(高电平有效)
                  p+=2; //显示下一行
                 
               HC595_DatOut(); //将缓冲区 的数据输出到物理IO口上
               
       
        cnt+=2;
        if(cnt>=(32*3)+(16*7))cnt=0;
    

//(32*3)+(16*7)   计算字模占用的字节总大小

//定义74HC595的IO口
sbit HC595_DAT=P3^4; //数据输出(对于单片机来说)
sbit HC595_RCK=P3^5; //控制存储器(缓存区)的输出时钟
sbit HC595_SCK=P3^6; //控制数据输出的时钟(上升沿)
/*
函数功能: 向74H595写入一个字节
函数形参: 写入的字节数据
函数说明: 先发高位
*/
void HC595_WriteByte(u8 byte)

    u8 i;
    for(i=0;i<8;i++)
    
        if(byte&0x80)HC595_DAT=1;
        else HC595_DAT=0;
        byte<<=1;
        //产生上升沿
        HC595_SCK=0;
        HC595_SCK=1;
    


/*
函数功能: 输出使能--控制595将存储器里的数据输出到总线(8)
*/
void HC595_DatOut(void)

    //上升沿将存储器的数据输出到总线
    //下降沿保持输出状态
    HC595_RCK=0;
    HC595_RCK=1;
    HC595_RCK=0;

以上是关于5.1 单片机-16x16LED点阵屏的主要内容,如果未能解决你的问题,请参考以下文章

stm32驱动LED点阵屏(LY-LED16x16)

stm32驱动LED点阵屏(LY-LED16x16)

51单片机开发:通过74HC595控制LED点阵

3.7 51单片机-LED 16*16点阵

单片机LED16*16点阵显示实验

基于单片机16点阵LED汉字滚动显示设计-全套资料