找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3941|回复: 6
收起左侧

16*64点阵时钟仿真+源程序

  [复制链接]
ID:140489 发表于 2018-4-9 18:20 | 显示全部楼层 |阅读模式
16*64点阵仿真,74HC138做行驱动,74HC595做列驱动,文字上移、下移、静止显示,时钟“:”闪烁;有完整的源程序和仿真文件;
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
QQ截图20180409180406.jpg 0.png

单片机源码:
  1. /************16*16LED点阵屏显示*****************/
  2. #include<reg52.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit R=P2^0;          //595数据输入端口
  7. sbit CLK=P2^1;          //595 时钟信号
  8. sbit STB=P2^2;          // 595锁存端
  9. uchar cont,num,xs;
  10. char miao=30,fen=30,shi=12;
  11. //bit flag;

  12. char code table[][32]={
  13.                                    
  14.                   
  15. /////////////////////////////////////////////////////////////////////////
  16. // 汉字字模表                                                          //
  17. // 汉字库: 宋体16.dot,横向取模左高位,数据排列:从左到右从上到下 ,对应R=1 else R=0的写法        //
  18. /////////////////////////////////////////////////////////////////////////

  19.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  20.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  21.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  22.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,


  23. /*"点",*/ 0x02,0x00,0x02,0x00,0x02,0x08,0x03,0xFC,
  24.       0x02,0x00,0x02,0x10,0x3F,0xF8,0x20,0x10,
  25.       0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,
  26.       0x29,0x10,0x24,0xC8,0x44,0x44,0x80,0x04,

  27.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  28.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  29.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  30.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,


  31. /*"阵",*/ 0x00,0x80,0x78,0x84,0x4F,0xFE,0x50,0x80,
  32.       0x50,0xA0,0x61,0x20,0x51,0x28,0x4B,0xFC,
  33.       0x48,0x20,0x48,0x20,0x68,0x24,0x57,0xFE,
  34.       0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,

  35.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  36.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  37.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  38.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,


  39. /*"时",*/ 0x00,0x08,0x04,0x08,0x7E,0x08,0x44,0x08,
  40.       0x47,0xFE,0x44,0x08,0x44,0x08,0x7C,0x88,
  41.       0x44,0x48,0x44,0x48,0x44,0x08,0x44,0x08,
  42.       0x7C,0x08,0x44,0x48,0x00,0x28,0x00,0x10,

  43.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  44.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  45.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  46.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,


  47. /*"钟",*/ 0x10,0x20,0x10,0x20,0x10,0x20,0x1C,0x24,
  48.       0x21,0xFE,0x21,0x24,0x7D,0x24,0x91,0x24,
  49.       0x11,0x24,0xFD,0xFC,0x11,0x24,0x10,0x20,
  50.       0x14,0x20,0x18,0x20,0x10,0x20,0x00,0x20,

  51.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  52.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  53.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  54.           0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00


  55. };

  56. uchar code tab[][16]={

  57.         0x00,0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,  // -0-
  58.         0xD6,0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,

  59.         0x00,0x00,0x00,0x18,0x38,0x78,0x18,0x18,  // -1-
  60.         0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,

  61.         0x00,0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,  // -2-
  62.         0x30,0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,

  63.         0x00,0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,  // -3-
  64.         0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,

  65.         0x00,0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,  // -4-
  66.         0xFE,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,

  67.         0x00,0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,  // -5-
  68.         0x0E,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,

  69.         0x00,0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,  // -6-
  70.         0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,

  71.         0x00,0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,  // -7-
  72.         0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,

  73.         0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,  // -8-
  74.         0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,

  75.         0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,  // -9-
  76.         0x06,0x06,0x06,0x0C,0x78,0x00,0x00,0x00,

  77.         0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,  // -:-
  78.         0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,

  79.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  80.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  81. };   

  82. void delay(uint z)
  83. {
  84.         uint x,y;
  85.         for(x=0;x<z;x++)
  86.                 for(y=0;y<110;y++);
  87. }


  88. void WriteByte(uchar dat)   
  89. {
  90.         uchar i;
  91.         /* 通过8循环将8位数据一次移入74HC595 */
  92.         CLK = 0;
  93.         for(i = 0; i < 8; i++)
  94.         {
  95.                 if(dat & 0x80)
  96.                         R = 1;
  97.                 else
  98.                          R = 0;
  99.                 dat = dat << 1;
  100.                 CLK = 0;                                          
  101.         _nop_();_nop_();
  102.                 CLK = 1;
  103.         }
  104. }

  105. void main()
  106. {
  107. //        uint num;
  108.         uint num,move,speed;
  109.         TMOD |=0x01;
  110.         TH0=(65536-50000)/256;
  111.         TL0=(65536-50000)%256;
  112.         EA=1;
  113.         ET0=1;
  114.         TR0=1;
  115.         while(1)
  116.         {
  117.                  switch(xs)
  118.                  {
  119.                  
  120.                         case 0:
  121.                         {
  122.                                  for(num=0;num<16;num++)  //静止显示4个汉字
  123.                                 {
  124.                                           WriteByte(~table[7][2*num+1]);          //送出一个字节  
  125.                                           WriteByte(~table[7][2*num]);
  126.                         
  127.                                           WriteByte(~table[5][2*num+1]);          //送出一个字节  
  128.                                           WriteByte(~table[5][2*num]);
  129.                         
  130.                                           WriteByte(~table[3][2*num+1]);          //送出一个字节  
  131.                                           WriteByte(~table[3][2*num]);
  132.                         
  133.                                           WriteByte(~table[1][2*num+1]);          //送出一个字节  
  134.                                           WriteByte(~table[1][2*num]);
  135.                         
  136.                         
  137.                                           P1=num;     //行选
  138.                                           STB=0;          //输出锁存器中的数据
  139.                                           STB=1;                  
  140.                                           delay(1);
  141.                                 }
  142.                         }         break;  
  143.         
  144.                         case 1:
  145.                          {
  146.                                  for(num=0;num<16;num++)  //时钟显示88:88:88
  147.                                 {
  148.                                           WriteByte(~tab[miao%10][num]);          //小时十位  
  149.                         
  150.                                           WriteByte(~tab[miao/10][num]);          //小时个位  
  151.                                           
  152.                                           if(cont>=10)
  153.                                           WriteByte(~tab[10][num]);          //显示‘:’号   
  154.                                           else
  155.                                           WriteByte(~tab[11][num]);           //不显
  156.                                           
  157.                                           WriteByte(~tab[fen%10][num]);          //分钟十位  
  158.                         
  159.                                           WriteByte(~tab[fen/10][num]);          //分钟个位
  160.                                           
  161.                                           if(cont>=10)
  162.                                           WriteByte(~tab[10][num]);          //显示‘:’号
  163.                                           else
  164.                                           WriteByte(~tab[11][num]);           //不显
  165.                         
  166.                                           WriteByte(~tab[shi%10][num]);          //秒钟十位  
  167.                         
  168.                                           WriteByte(~tab[shi/10][num]);          //秒钟个位  
  169.                         
  170.                                           P1=num;     //行选
  171.                                           STB=0;           
  172.                                           STB=1;        //输出锁存器中的数据,上升沿         
  173.                                           delay(1);
  174.                                 }
  175.                   }        break;           
  176.                   
  177.                   case 2:
  178.         
  179.                   {
  180.                           if(++speed>4)   //移动速度控制
  181.                          {
  182.                                  speed=0;
  183.                                 move++;    //移位
  184.                                 if(move>16)  //是否完成移位一个汉字
  185.                                         move=0;  //从头开始
  186.                          }
  187.                         
  188.                         
  189.                         for(num=0;num<16;num++)  //上移 显示4个汉字 "点阵时钟"                74HC154+反相器,行高,74HC595 列低 ,数据取反
  190.                         {
  191.                                   WriteByte(~table[7][2*num+1+move*2]);          //送出一个字节  
  192.                                   WriteByte(~table[7][2*num+move*2]);
  193.                
  194.                                   WriteByte(~table[5][2*num+1+move*2]);          //送出一个字节  
  195.                                   WriteByte(~table[5][2*num+move*2]);
  196.                
  197.                                   WriteByte(~table[3][2*num+1+move*2]);          //送出一个字节  
  198.                                   WriteByte(~table[3][2*num+move*2]);
  199.                
  200.                                   WriteByte(~table[1][2*num+1+move*2]);          //送出一个字节  
  201.                                   WriteByte(~table[1][2*num+move*2]);
  202.                
  203.                                   P1=num;     //行选
  204.                                   STB=0;          //输出锁存器中的数据
  205.                                   STB=1;                  
  206.                                   delay(1);
  207.                         }
  208.                   
  209.                   }        break;
  210.                   
  211.                   case 3:
  212.         
  213.                   {
  214.                           if(++speed>4)   //移动速度控制
  215.                          {
  216.                                  speed=0;
  217.                                 move++;    //移位
  218.                                 if(move>16)  //是否完成移位一个汉字
  219.                                         move=0;  //从头开始
  220.                          }
  221.                         
  222.                         
  223.                         for(num=0;num<16;num++)  //上移 显示4个汉字 "点阵时钟"                74HC154+反相器,行高,74HC595 列低 ,数据取反
  224.                         {
  225.                                   WriteByte(~table[7][2*num+1-move*2]);          //送出一个字节  
  226.                                   WriteByte(~table[7][2*num-move*2]);
  227.                
  228.                                   WriteByte(~table[5][2*num+1-move*2]);          //送出一个字节  
  229.                                   WriteByte(~table[5][2*num-move*2]);
  230.                
  231.                                   WriteByte(~table[3][2*num+1-move*2]);          //送出一个字节  
  232.                                   WriteByte(~table[3][2*num-move*2]);
  233.                
  234.                                   WriteByte(~table[1][2*num+1-move*2]);          //送出一个字节  
  235.                                   WriteByte(~table[1][2*num-move*2]);
  236.                
  237.                                   P1=num;     //行选
  238.                                   STB=0;          //输出锁存器中的数据
  239.                                   STB=1;                  
  240.                                   delay(1);
  241.                         }
  242.                   
  243.                   }        break;  
  244.                   
  245.                 }
  246.         }        
  247. }

  248. void timer0() interrupt 1
  249. {
  250.         TH0=(65536-50000)/256;
  251.         TL0=(65536-50000)%256;
  252.         
  253.         cont++;
  254.         num++;

  255.         if(cont==20)
  256.         {        
  257.                 cont=0;
  258.                 miao++;
  259.                 if(miao==60)
  260.                 {
  261.                         miao=0;
  262.                         fen++;
  263.                         if(fen==60)
  264.                         {
  265.                                 fen=0;
  266.                                 shi++;
  267.                                 if(shi==24)
  268.                                         shi=0;
  269.                         }
  270.                 }
  271.         }

  272.         if(num==60)           //3秒钟换1种显示
  273.         {
  274.                 num=0;
  275.                 xs++;
  276.                 if(xs==4)
  277.                         xs=0;
  278.         }
  279. }
复制代码
完整的文件在附件里面: 16x64 -595 138 -时钟.rar (304.83 KB, 下载次数: 164)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:84791 发表于 2020-10-8 04:34 | 显示全部楼层
不错,楼主辛苦了。这个还是很受用的,好资料。
回复

使用道具 举报

ID:1089144 发表于 2023-7-20 21:19 | 显示全部楼层
这个资料不错,正在学习驱动点阵,多谢!
回复

使用道具 举报

ID:1085441 发表于 2023-7-20 23:20 | 显示全部楼层
74HC595可以用5020芯片,5020等于恒流输出的74HC595,不需要限流电阻,显示亮度更高。
行驱动也有大功率芯片,不记得具体型号了,应该容易找
回复

使用道具 举报

ID:1089144 发表于 2023-7-23 18:29 | 显示全部楼层
这个资料8不错,正在学习点阵驱动。准备按这个电路做一块板。
回复

使用道具 举报

ID:1090025 发表于 2023-7-29 20:29 | 显示全部楼层
Thank for sharing, learn
回复

使用道具 举报

ID:138707 发表于 2023-8-12 17:10 | 显示全部楼层
这个资料8不错,正在学习点阵驱动。准备按这个电路做一块板。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表