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

举报
DS小龙哥 发表于 2021/12/09 23:05:04 2021/12/09
【摘要】 3.7 LED 16*16点阵 3.7.1 点阵原理图 图3-7-1 LED点阵使用连线说明:P595_A接J17、P595_B接J18、JP595跳线帽需要接上、JP1302断开、J11(P3.3)断开 图3-7-2  图3-7-3 8*8的点阵原理图 从上面LED点阵原理图中看出,点阵里的...

3.7 LED 16*16点阵

3.7.1 点阵原理图

图3-7-1

LED点阵使用连线说明:P595_A接J17、P595_B接J18、JP595跳线帽需要接上、JP1302断开、J11(P3.3)断开

图3-7-2 

图3-7-3 8*8的点阵原理图

从上面LED点阵原理图中看出,点阵里的每个LED的阴端接在行上面,阳端接在列上面

 图3-7-4 二极管

 图3-7-5 发光二极管

图3-7-6 二极管电路图

点亮一个LED二极管只需要根据正负极给对应的电源即可发光。

根据实验板的16*16点阵原理图来看,只要给横向()16个IO输出低电平,纵向(列)16个IO口输出高电平,即可点亮点阵上面的所有LED

3.7.2 点阵原理介绍

实验板上的16*16点阵是由4个8*8LED点阵组成的,一个 8*8 的点阵是由 64个LED小灯组成。

16*16点阵分别由4片74HC595控制,4片74HC595采用级联的方式连接。

图3-7-7 16*16LED点阵

3.7.3 74HC595缓存器

74HC595是一个8位串行输入、平行输出的位移缓存器:平行输出为三态输出。

在SCK的上升沿,单行数据由SDL输入到内部的8位位移缓存器,并由Q7‘输出,而平行输出则是在LCK的上升沿将在8位位移缓存器的数据存人到8位平行输出缓存器。

当串行数据输人端OE的控制信号为低使能时,平行输出端的输出值等于平行输出缓存器所存储的值。而当OE为高电位,也就是输出关闭时,平行输出端会维持在高阻抗状态。

74HC595支持级联,当多个595级联到一起时,通过数据线发送的一个数据最终会移位给最后的一个595

因为级联数据是被挤出到下一级的,所以先发送的数据最后是到最后一级的595。

每次向74HC595发送一个字节,74HC595最先收到的一位数据是高位,也就是最先收到的数据就到达Q7脚,如果我们先输出数据高位的话,最高位在8个脉冲后就会跑到Q7脚(数据脚最高位)。这就像我们排队一样,一个寄存器里面有8个位置,每次给一个脉冲就好比一次呼叫:“大家可以往前移一位了!”就这样,队伍不断得往前移。

这个过程就像在向前挤一样:

图3-7-8 

 

图3-7-9 

 

图3-7-10 HC595管脚功能图 

 

图3-7-11 HC595真值表

通过真值表得知:

发送一个数据0的时序代码如下:

HC595_DATA=0;HC595_SCK=0;HC595_SCK=1;
 

发送一个数据1的时序代码如下:

HC595_DATA=1;HC595_SCK=0;HC595_SCK=1;
 

3.7.4 示例代码: LED点阵单点扫描显示

下面代码实现,点阵依次从左上角点亮一个点,等待一段时间,再关闭所有点,再点亮第二个点,等待一段时间,再关闭所有点,从左到右,从上到下,依次把所有点亮都点亮一遍。


  
  1. #include <reg51.h>
  2. //定义HC595使用的IO口
  3. sbit HC595_DATA=P3^4//串行数据输出
  4. sbit HC595_RCK=P3^5;  //存储寄存器时钟
  5. sbit HC595_SCK=P3^6;  //移位寄存器时钟
  6. /*
  7. 通过HC595发送一个字节数据
  8. 先发送高位,在HC959上对应的是低位(也就是LED点阵的最左边)
  9. */
  10. void HC595_Send_Byte(u8 byte)
  11. {
  12.     u8 i;
  13.     for(i=0;i<8;i++)
  14.     {
  15.         if(byte&0x80)HC595_DATA=1;
  16.         else HC595_DATA=0;
  17.         HC595_SCK=0;
  18.         HC595_SCK=1;
  19.         byte<<=1//依次发送高位
  20.     }
  21. }
  22. /*
  23. 将HC959存储器里的数据输出到总线上
  24. */
  25. void HC595_DataOut(void)
  26. {
  27.     //将移位存储器的输出并行输出到总线上
  28.     HC595_RCK=0;
  29.     HC595_RCK=1;
  30.     HC595_RCK=0;
  31. }
  32. /*
  33. HC595的3、4级是控制点阵的列 (低电平)
  34. HC595的1、2级是控制点阵的行 (高电平)
  35. 给HC595第1级发送的数据会移动到最后一个HC595。
  36. */
  37. int main()
  38. {
  39.     u8 i,j;
  40.     u16 Row; //行
  41.     u16 col; //列
  42.     while(1)
  43.     {
  44.         for(i=0;i<16;i++)
  45.         {
  46.             Row=0x0000;
  47.             Row|=1<<i; //行
  48.             for(j=0;j<16;j++)
  49.             {
  50.                 col=0xFFFF;
  51.                 col&=~(1<<j); //列
  52.                 HC595_Send_Byte(col>>8);
  53.                 HC595_Send_Byte(col);
  54.                 HC595_Send_Byte(Row>>8);
  55.                 HC595_Send_Byte(Row);
  56.                 HC595_DataOut();  
  57.                 DelayMs(100); //延时一段时间,再关闭所有显示
  58.                 HC595_Send_Byte(0xFF);
  59.                 HC595_Send_Byte(0xFF);
  60.                 HC595_Send_Byte(0x00);
  61.                 HC595_Send_Byte(0x00);
  62.                 HC595_DataOut(); 
  63.             }
  64.         }
  65.     }
  66. }

3.7.5 示例代码: 控制LED点阵显示指定效果

(1). 实现点阵按照指定时间间隔全亮和全灭


  
  1. #include <reg51.h>
  2. int main()
  3. {
  4.     u8 i,j;
  5.     while(1)
  6.     {
  7.       //下面4行代码,开启点阵
  8.       HC595_Send_Byte(0x00);//4列: 低位对应右边第8列开始,8~15
  9.       HC595_Send_Byte(0x00);//3列: 低位对应左边第0列开始,0~7
  10.       HC595_Send_Byte(0xFF);//2行: 低位对应上面第8行,依次8~15
  11.       HC595_Send_Byte(0xFF);//1行: 低位对应上面第0行,依次0~7
  12.       HC595_DataOut();  
  13.       DelayMs(500);
  14.       //下面4行代码,关闭点阵
  15.       HC595_Send_Byte(0xFF);//4列: 低位对应右边第8列开始,8~15
  16.       HC595_Send_Byte(0xFF);//3列: 低位对应左边第0列开始,0~7
  17.       HC595_Send_Byte(0x00);//2行: 低位对应上面第8行,依次8~15
  18.       HC595_Send_Byte(0x00);//1行: 低位对应上面第0行,依次0~7
  19.       HC595_DataOut();  
  20.       DelayMs(500);
  21. }
  22. }

(2). 实现点阵旋转效果,按照8*8为单位,点亮4个小方块

点亮的顺序,看下面代码的注释。


  
  1. int main()
  2. {
  3.     while(1)
  4.     {
  5.         //点亮左上角8*8方块
  6.         HC595_Send_Byte(0xFF);
  7.         HC595_Send_Byte(0x00);
  8.         HC595_Send_Byte(0x00);
  9.         HC595_Send_Byte(0xFF);
  10.         HC595_DataOut();
  11.         DelayMs(100);
  12.         
  13.         //点亮右上角8*8方块
  14.         HC595_Send_Byte(0x00);
  15.         HC595_Send_Byte(0xFF);
  16.         HC595_Send_Byte(0x00);
  17.         HC595_Send_Byte(0xFF);
  18.         HC595_DataOut();
  19.         DelayMs(100);
  20.         
  21.         //点亮右下角8*8方块
  22.         HC595_Send_Byte(0x00);
  23.         HC595_Send_Byte(0xFF);
  24.         HC595_Send_Byte(0xFF);
  25.         HC595_Send_Byte(0x00);
  26.         HC595_DataOut(); 
  27.         DelayMs(100);  
  28.         
  29.         //点亮左下角8*8方块
  30.         HC595_Send_Byte(0xFF);
  31.         HC595_Send_Byte(0x00);
  32.         HC595_Send_Byte(0xFF);
  33.         HC595_Send_Byte(0x00);
  34.         HC595_DataOut();
  35.         DelayMs(100);      
  36. }
  37. }

3.7.6 示例代码: 控制LED点阵显示汉字

使用LED点阵显示汉字,需要用到汉字取模软件,本章节使用的取模软件“PCtoLCD2002”,软件的取模方式配置如下。

图3-7-12 

 

图3-7-13

示例代码:  在LED点阵上显示一个中文


  
  1. #include <reg51.h>
  2. //定义HC595使用的IO口
  3. sbit HC595_DATA=P3^4//串行数据输出
  4. sbit HC595_RCK=P3^5;  //存储寄存器时钟
  5. sbit HC595_SCK=P3^6;  //移位寄存器时钟
  6. /*
  7. 通过HC595发送一个字节数据
  8. 先发送高位,在HC959上对应的是低位(也就是LED点阵的最左边)
  9. */
  10. void HC595_Send_Byte(u8 byte)
  11. {
  12.     u8 i;
  13.     for(i=0;i<8;i++)
  14.     {
  15.         if(byte&0x80)HC595_DATA=1;
  16.         else HC595_DATA=0;
  17.         HC595_SCK=0;
  18.         HC595_SCK=1;
  19.         byte<<=1//依次发送高位
  20.     }
  21. }
  22. /*
  23. 将HC959存储器里的数据输出到总线上
  24. */
  25. void HC595_DataOut(void)
  26. {
  27.     //将移位存储器的输出并行输出到总线上
  28.     HC595_RCK=0;
  29.     HC595_RCK=1;
  30.     HC595_RCK=0;
  31. }
  32. /*
  33. 在LED点阵上显示一个16*16数据
  34. */
  35. void LED_DisplayData(u8 *p)
  36. {
  37.     u8 i;
  38.     u16 Row; //控制行的状态,每次只点亮1行
  39.     for(i=0;i<16;i++)
  40.     {
  41.         Row=0x0000;
  42.         Row|=1<<i;
  43.         HC595_Send_Byte(*(p+1)); //控制列右8个IO
  44.         HC595_Send_Byte(*p);     //控制列左8个IO
  45.         p+=2;
  46.         HC595_Send_Byte(Row>>8); //控制行下8个IO
  47.         HC595_Send_Byte(Row);    //控制行上8个IO
  48.         HC595_DataOut();
  49.     } 
  50. }
  51. u8 code 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};/*"中",0*/
  52. int main()
  53. {
  54.     while(1)
  55.     {
  56.         LED_DisplayData(font); //显示中文
  57.     }        
  58. }

图3-7-14

3.7.7 示例代码: 控制LED点阵显示多个中文

下面代码实现,在LED点阵上循环显示多个文字或者图案,所有的功能都使用子函数封装,调用逻辑清晰。


  
  1. #include <reg51.h>
  2. //定义HC595使用的IO口
  3. sbit HC595_DATA=P3^4//串行数据输出
  4. sbit HC595_RCK=P3^5;  //存储寄存器时钟
  5. sbit HC595_SCK=P3^6;  //移位寄存器时钟
  6. /*
  7. 通过HC595发送一个字节数据
  8. 先发送高位,在HC959上对应的是低位(也就是LED点阵的最左边)
  9. */
  10. void HC595_Send_Byte(u8 byte)
  11. {
  12.     u8 i;
  13.     for(i=0;i<8;i++)
  14.     {
  15.         if(byte&0x80)HC595_DATA=1;
  16.         else HC595_DATA=0;
  17.         HC595_SCK=0;
  18.         HC595_SCK=1;
  19.         byte<<=1//依次发送高位
  20.     }
  21. }
  22. /*
  23. 将HC959存储器里的数据输出到总线上
  24. */
  25. void HC595_DataOut(void)
  26. {
  27.     //将移位存储器的输出并行输出到总线上
  28.     HC595_RCK=0;
  29.     HC595_RCK=1;
  30.     HC595_RCK=0;
  31. }
  32. /*
  33. 在LED点阵上显示一个16*16数据
  34. */
  35. void LED_DisplayData(u8 *p)
  36. {
  37.     u8 i;
  38.     u16 Row; //控制行的状态,每次只点亮1行
  39.     for(i=0;i<16;i++)
  40.     {
  41.         Row=0x0000;
  42.         Row|=1<<i;
  43.         HC595_Send_Byte(*(p+1)); //控制列右8个IO
  44.         HC595_Send_Byte(*p);     //控制列左8个IO
  45.         p+=2;
  46.         HC595_Send_Byte(Row>>8); //控制行下8个IO
  47.         HC595_Send_Byte(Row);    //控制行上8个IO
  48.         HC595_DataOut();
  49.     } 
  50. }
  51. /*
  52. 关闭点阵所有点
  53. */
  54. void LED_Clear(void)
  55. {
  56.     HC595_Send_Byte(0xFF);//4列: 低位对应右边第8列开始,8~15
  57.     HC595_Send_Byte(0xFF);//3列: 低位对应左边第0列开始,0~7
  58.     HC595_Send_Byte(0x00);//2行: 低位对应上面第8行,依次8~15
  59.     HC595_Send_Byte(0x00);//1行: 低位对应上面第0行,依次0~7
  60.     HC595_DataOut(); 
  61. }
  62. code u8 buff[][32]=
  63. {
  64.     {0xFF,0xFF,0xFF,0xFF,0x00,0x80,0xDF,0xFF,0xDF,0xFF,0xDF,0xFF,0x1F,0xF0,0xDF,0xF7,0xDF,0xF7,0xEF,0xF7,0xEF,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xF7,0xFD,0xFA,0xFE,0xFD},/*"万",0*/
  65.     {0xEF,0xFF,0xEF,0xC1,0xEF,0xDD,0x00,0xED,0xEF,0xED,0xEF,0xF5,0x81,0xED,0xEF,0xED,0xEF,0xDD,0x00,0xDD,0xEF,0xDD,0xF7,0xE9,0xF7,0xF5,0xFB,0xFD,0xFD,0xFD,0xFE,0xFD},/*"邦",1*/
  66.     {0x0F,0xF0,0xEF,0xF7,0xEF,0xF7,0x0F,0xF0,0xEF,0xF7,0xEF,0xF7,0x0F,0xF0,0xDF,0xFF,0xEF,0xFF,0x07,0xC0,0xBB,0xDD,0xBD,0xDD,0xDF,0xDE,0xEF,0xDE,0x77,0xEB,0xBF,0xF7},/*"易",2*/
  67.     {0x7F,0xFF,0x7B,0xEF,0x7B,0xEF,0x03,0xE0,0xFF,0xFB,0xBB,0xFB,0xBB,0x83,0x00,0xBD,0xBB,0xD6,0xBB,0xF7,0x83,0xF7,0xBB,0xF7,0xBB,0xEB,0x83,0xEB,0xBB,0xDD,0xFF,0xBE},/*"嵌",3*/
  68. };
  69. #define TIME 100 
  70. int main()
  71. {
  72.     u8 i,j;
  73.     while(1)
  74.     {
  75.         for(i=0;i<sizeof(buff)/sizeof(buff[0]);i++)
  76.         {
  77.             for(j=0;j<TIME;j++) //停留的时间
  78.             {
  79.                LED_DisplayData(buff[i]); //显示中文,需要循环调用
  80.             }
  81.             LED_Clear();  //清除显示
  82.         }
  83. }        
  84. }

文章来源: xiaolong.blog.csdn.net,作者:DS小龙哥,版权归原作者所有,如需转载,请联系作者。

原文链接:xiaolong.blog.csdn.net/article/details/121017014

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。