找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6859|回复: 5
收起左侧

MAX7219点阵屏+DS12C887+51单片机程序 高精度时钟日历显示

[复制链接]
ID:687408 发表于 2020-3-7 20:52 | 显示全部楼层 |阅读模式
本帖最后由 zsq198926 于 2020-3-13 16:14 编辑

  在网上看到有人用MAX7219显示屏结合arduino做的显示时间的屏幕,网上查了一下用51做MAX7219显示的好像很少,都是用1602显示的比较多,就自己动手用51单片及做了一个类似的。自己网上查了显示的驱动程序,参考了郭天祥的书,组合修改了部分代码,买了块DS12C887(这块时钟模块比较精准,有掉电走时功能,避免反复设置时间,一年时间误差1分钟左右)。主要功能显示时间(前两块显示小时,三四块显示分钟),显示星期(前三块显示英文缩写,第四块显示数字周几),显示月份(第一块月份,如果超过9,第一块上显示两个数字,第二块汉子“月”,第三四块显示日期)。另外在显示星期时调整了一下大小写,用取模软件美化了一下数字的显示(网上找的大同小异,8*8的美化效果毕竟有限)

月份显示

月份显示

月份显示


星期显示

星期显示

星期显示


时间显示

时间显示

时间显示


单片机代码如下:比较杂乱,高手请多多指教
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. //sfr WDT_CONTR=0xe1;
  6. //定义Max7219端口
  7. sbit Max7219_pinCLK = P3^7;
  8. sbit Max7219_pinCS  = P3^6;
  9. sbit Max7219_pinDIN = P3^5;
  10. //DS12C887 端口定义
  11. sbit cs=P2^4;            //片选信号,低电平有效
  12. sbit as=P2^3;        //地址选通输入端
  13. sbit rw=P2^2;      //读写输入端
  14. sbit ds=P2^1;      //读输入脚
  15. //sbit IRQ=P3^3;     //外部中断
  16. uchar code disp1[41][8]={
  17. {0x1C,0x22,0x63,0x63,0x63,0x63,0x22,0x1C},//0
  18. {0xC,0x1C,0xC,0xC,0xC,0xC,0xC,0x1E},//1
  19. {0x1C,0x22,0x22,0x4,0x8,0x10,0x3E,0x3E},//2
  20. {0x1C,0x22,0x2,0x1C,0x2,0x2,0x22,0x1C},//3
  21. {0x6,0xE,0x16,0x26,0x46,0x7F,0x6,0xF},//4
  22. {0x3E,0x40,0x40,0x7E,0x2,0x2,0x62,0x3C},//5
  23. {0xC,0x10,0x20,0x3C,0x42,0x42,0x42,0x3C},//6
  24. {0x7E,0x7E,0x2,0x4,0x8,0x10,0x30,0x30},//7
  25. {0x1C,0x22,0x22,0x1C,0x22,0x22,0x22,0x1C},//8
  26. {0x3C,0x42,0x42,0x42,0x3E,0x6,0xC,0x38},//9
  27. {0x0,0x0,0x38,0x44,0x44,0x44,0x44,0x3A},//a 11
  28. {0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C,0x0},//B
  29. {0x3C,0x40,0x40,0x40,0x40,0x40,0x3C,0x0},//C
  30. {0x0,0x8,0x8,0x38,0x48,0x48,0x78,0x38},//D
  31. {0x0,0x0,0x0,0x38,0x44,0x7C,0x40,0x38},//E        15
  32. {0x7C,0x40,0x40,0x7C,0x40,0x40,0x40,0x40},//F        16
  33. {0x3C,0x40,0x40,0x40,0x40,0x44,0x44,0x3C},//G
  34. {0x0,0x20,0x20,0x38,0x24,0x24,0x24,0x24},//H        18
  35. {0x0,0x10,0x0,0x10,0x10,0x10,0x10,0x10},//I          19
  36. {0x3C,0x8,0x8,0x8,0x8,0x8,0x48,0x30},//J  20
  37. {0x0,0x24,0x28,0x30,0x20,0x30,0x28,0x24},//K
  38. {0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C},//L
  39. {0x0,0x6C,0x6C,0x6C,0x7C,0x74,0x54,0x54},//M         24
  40. {0x0,0x0,0x40,0x7C,0x44,0x44,0x44,0x44},//N                   25
  41. {0x0,0x0,0x0,0x38,0x44,0x44,0x44,0x38},//O          26
  42. {0x3C,0x22,0x22,0x22,0x3C,0x20,0x20,0x20},//P
  43. {0x1C,0x22,0x22,0x22,0x22,0x26,0x22,0x1D},//Q
  44. {0x0,0x0,0x14,0x18,0x10,0x10,0x10,0x10},//R           28
  45. {0x0,0x1E,0x20,0x20,0x3E,0x2,0x2,0x3C},//S                29
  46. {0x0,0x3E,0x8,0x8,0x8,0x8,0x8,0x8},//T                                31
  47. {0x0,0x0,0x44,0x44,0x44,0x44,0x44,0x3A},//U                 32
  48. {0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18},//V
  49. {0x0,0x82,0x82,0x82,0x92,0xAA,0xC6,0x82},//W                        34
  50. {0x0,0x41,0x22,0x14,0x8,0x14,0x22,0x41},//X
  51. {0x41,0x22,0x14,0x8,0x8,0x8,0x8,0x8},//Y
  52. {0x0,0x7F,0x2,0x4,0x8,0x10,0x20,0x7F},//Z
  53. {0x1E,0x22,0x3E,0x22,0x3E,0x22,0x22,0x42},//月
  54. {0x5F,0xD1,0x51,0x51,0x51,0x51,0x51,0x5F},//10
  55. {0x22,0x66,0x22,0x22,0x22,0x22,0x22,0x22},//11
  56. {0x5F,0xC1,0x41,0x5F,0x50,0x50,0x50,0x5F},//12
  57. };                                                      
  58. /*n毫秒的延时程序*/
  59. void Delay_xms(uint x)
  60. {
  61.    uint  a,b;
  62.    for(a=0;a<x;a++)
  63.      for(b=0;b<112;b++);
  64. }
  65. void write_ds(uchar add,uchar date)
  66. {
  67.                 cs=0;
  68.                 as=1;
  69.                 ds=1;
  70.                 rw=1;
  71.                 P0=add;
  72.                 as=0;
  73.                 rw=0;
  74.                 P0=date;
  75.                 rw=1;
  76.                 as=1;
  77.                 cs=1;
  78. }
  79. // ---------------读887函数-------
  80. uchar read_ds(uchar  rs_add)
  81. {
  82.             uchar ds_date;
  83.                 as=1;
  84.                 ds=1;
  85.                 rw=1;
  86.                 cs=0;
  87.                 P0=rs_add;         //写地址
  88.                 as=0;
  89.                 ds=0;
  90.                 P0=0xff;
  91.                 ds_date=P0;  //读数据
  92.             ds=1;
  93.                 as=1;
  94.                 cs=1;
  95.     return ds_date;
  96. }                 
  97. //-------首次上电对时         --------
  98. /*
  99. void set_time()
  100. {
  101.   write_ds(0,30);           //秒
  102.   write_ds(1,0);                //闹钟秒
  103.   write_ds(2,5);                //分钟
  104.   write_ds(3,0);                //闹钟分钟
  105.   write_ds(4,21);                //小时
  106.   write_ds(5,0);                // 闹钟小时
  107.   write_ds(6,5);            //        星期几
  108.   write_ds(7,6);                //        日期
  109.   write_ds(8,3);                //        月份
  110.   write_ds(9,20);                //         年

  111. }          */

  112. void  INit_887()
  113. {
  114.   //------------------887首次使用,----初始化-------------

  115. write_ds(0x0A,0x20);  //   打开振荡器
  116. write_ds(0x0B,0x06);  //        24小时模式,二级制格式,闹铃中断开

  117. }      

  118. //--------------------------------------------
  119. //向MAX7219(U3)写入字节
  120. void Write_Max7219_byte(uchar DATA)         
  121. {
  122.             uchar i;   
  123.                 Max7219_pinCS=0;                                //CS=0有效,CS=1锁存      
  124.             for(i=8;i>=1;i--)
  125.           {                  
  126.             Max7219_pinCLK=0;
  127.             Max7219_pinDIN=DATA&0x80; //&10000000, 编译器对位操作的理解:非0即为1
  128.                         DATA=DATA<<1;
  129.             Max7219_pinCLK=1;                //上升沿把数据送出去
  130.            }                                 
  131. }
  132. //-------------------------------------------
  133. /*向M第一片MAX7219写入数据*/
  134. void Write_Max7219_1(uchar add1,uchar dat1)
  135. {
  136.      Max7219_pinCS=0;
  137.          Write_Max7219_byte(add1);           //写入地址,即数码管编号
  138.          Write_Max7219_byte(dat1);               //写入数据,即数码管显示数字
  139.          Max7219_pinCS=1;                        
  140. }
  141. /*第二片MAX7219的写入数据*/
  142. void Write_Max7219_2(uchar add2,uchar dat2)
  143. {
  144.         Max7219_pinCS=0;
  145.     //Max7219_pinCLK=1;
  146.         Write_Max7219_byte(add2);
  147.         Write_Max7219_byte(dat2);
  148.         Max7219_pinCLK=1;
  149.         Write_Max7219_byte(0x00);  //片1写入空
  150.         Write_Max7219_byte(0x00);
  151.         Max7219_pinCS=1;
  152. }
  153. /*第三片MAX7219的写入数据*/
  154. void Write_Max7219_3(uchar add3,uchar dat3)
  155. {
  156.         Max7219_pinCS=0;
  157.         //Max7219_pinCLK=1;
  158.         Write_Max7219_byte(add3);
  159.         Write_Max7219_byte(dat3);
  160.         Max7219_pinCLK=1;
  161.         Write_Max7219_byte(0x00); //片1写入空
  162.         Write_Max7219_byte(0x00);
  163.         Write_Max7219_byte(0x00); //片2写入空
  164.         Write_Max7219_byte(0x00);
  165.         Max7219_pinCS=1;
  166. }

  167. /*第四片MAX7219的写入数据*/
  168. void Write_Max7219_4(uchar add4,uchar dat4)
  169. {
  170.         Max7219_pinCS=0;
  171.         //Max7219_pinCLK=1;
  172.         Write_Max7219_byte(add4);
  173.         Write_Max7219_byte(dat4);
  174.         Max7219_pinCLK=1;
  175.         Write_Max7219_byte(0x00); //片1写入空
  176.         Write_Max7219_byte(0x00);
  177.         Write_Max7219_byte(0x00); //片2写入空
  178.         Write_Max7219_byte(0x00);
  179.         Write_Max7219_byte(0x00); //片3空
  180.         Write_Max7219_byte(0x00);
  181.         Max7219_pinCS=1;
  182. }
  183. /*初始化芯片*/
  184. void Init_MAX7219()
  185. {
  186. Write_Max7219_1(0x09, 0x00);       //译码方式:BCD码
  187. Write_Max7219_1(0x0a, 0x00);       //亮度
  188. Write_Max7219_1(0x0b, 0x07);       //扫描界限;8个数码管显示
  189. Write_Max7219_1(0x0c, 0x01);       //掉电模式:0,普通模式:1
  190. Write_Max7219_1(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0

  191. Write_Max7219_2(0x09, 0x00);       //译码方式:BCD码
  192. Write_Max7219_2(0x0a, 0x00);       //亮度
  193. Write_Max7219_2(0x0b, 0x07);       //扫描界限;8个数码管显示
  194. Write_Max7219_2(0x0c, 0x01);       //掉电模式:0,普通模式:1
  195. Write_Max7219_2(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0

  196. Write_Max7219_3(0x09, 0x00);       //译码方式:BCD码
  197. Write_Max7219_3(0x0a, 0x00);       //亮度
  198. Write_Max7219_3(0x0b, 0x07);       //扫描界限;8个数码管显示
  199. Write_Max7219_3(0x0c, 0x01);       //掉电模式:0,普通模式:1
  200. Write_Max7219_3(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0

  201. Write_Max7219_4(0x09, 0x00);       //译码方式:BCD码
  202. Write_Max7219_4(0x0a, 0x00);       //亮度
  203. Write_Max7219_4(0x0b, 0x07);       //扫描界限;8个数码管显示
  204. Write_Max7219_4(0x0c, 0x01);       //掉电模式:0,普通模式:1
  205. Write_Max7219_4(0x0f, 0x00);
  206. }
  207.   void weekshow(void)
  208. {      
  209.     uchar i,week;

  210.          
  211.         week=read_ds(6);
  212.          switch(week)
  213.                   {
  214.                      case 1:
  215.                      for(i=1;i<9;i++)
  216.                     {
  217.                       Write_Max7219_1(i,disp1[week][i-1]);
  218.                       Write_Max7219_2(i,disp1[24][i-1]);
  219.                       Write_Max7219_3(i,disp1[25][i-1]);         
  220.                       Write_Max7219_4(i,disp1[23][i-1]);                                            
  221.                      }
  222.                      break;                        
  223.                            case 2:
  224.                      for(i=1;i<9;i++)
  225.                     {
  226.                       Write_Max7219_1(i,disp1[week][i-1]);
  227.                       Write_Max7219_2(i,disp1[13][i-1]);
  228.                       Write_Max7219_3(i,disp1[30][i-1]);         
  229.                       Write_Max7219_4(i,disp1[29][i-1]);                                            
  230.                      }
  231.                      break;
  232.                          case 3:
  233.                      for(i=1;i<9;i++)
  234.                     {
  235.                       Write_Max7219_1(i,disp1[week][i-1]);
  236.                       Write_Max7219_2(i,disp1[13][i-1]);
  237.                       Write_Max7219_3(i,disp1[14][i-1]);         
  238.                       Write_Max7219_4(i,disp1[32][i-1]);                                            
  239.                      }
  240.                      break;
  241.                           case 4:
  242.                      for(i=1;i<9;i++)
  243.                     {
  244.                       Write_Max7219_1(i,disp1[week][i-1]);
  245.                       Write_Max7219_2(i,disp1[31][i-1]);
  246.                       Write_Max7219_3(i,disp1[17][i-1]);         
  247.                       Write_Max7219_4(i,disp1[29][i-1]);                                            
  248.                      }
  249.                      break;
  250.                           case 5:
  251.                      for(i=1;i<9;i++)
  252.                     {
  253.                       Write_Max7219_1(i,disp1[week][i-1]);
  254.                       Write_Max7219_2(i,disp1[18][i-1]);
  255.                       Write_Max7219_3(i,disp1[27][i-1]);         
  256.                       Write_Max7219_4(i,disp1[15][i-1]);                                            
  257.                      }
  258.                      break;
  259.                          case 6:
  260.                      for(i=1;i<9;i++)
  261.                     {
  262.                       Write_Max7219_1(i,disp1[week][i-1]);
  263.                       Write_Max7219_2(i,disp1[29][i-1]);
  264.                       Write_Max7219_3(i,disp1[10][i-1]);         
  265.                       Write_Max7219_4(i,disp1[28][i-1]);                                            
  266.                      }
  267.                      break;
  268.                          case 7:
  269.                      for(i=1;i<9;i++)
  270.                     {
  271.                       Write_Max7219_1(i,disp1[week][i-1]);
  272.                       Write_Max7219_2(i,disp1[24][i-1]);
  273.                       Write_Max7219_3(i,disp1[30][i-1]);         
  274.                       Write_Max7219_4(i,disp1[28][i-1]);                                            
  275.                      }
  276.                      break;
  277.                    }
  278. }                 
  279. void timeshow (void)
  280. {                 
  281.          uchar i,shi,shiwei,shige,fen,fenshi,fenge ;

  282.             
  283.                 shi=read_ds(4);
  284.                 fen=read_ds(2);
  285.                 Delay_xms(5);      
  286.             shiwei=shi/10;
  287.              shige=shi%10;                  
  288.             fenshi=fen/10;
  289.              fenge=fen%10;
  290.                  for(i=1;i<9;i++)
  291.            {
  292.                       Write_Max7219_1(i,disp1[fenge][i-1]);
  293.                 Write_Max7219_2(i,disp1[fenshi][i-1]);
  294.                   Write_Max7219_3(i,disp1[shige][i-1]);
  295.                  Write_Max7219_4(i,disp1[shiwei][i-1]);
  296.                 }                    
  297. }

  298. void dayshow()
  299. {               

  300.     uchar i,yue,day,dayshi,dayge;


  301.         yue=read_ds(8);
  302.         day=read_ds(7);
  303.         Delay_xms(5);
  304.         dayshi=day/10;
  305.         dayge=day%10;
  306.           if(yue<10)
  307.            {      
  308.              for(i=1;i<9;i++)
  309.                  {
  310.                   Write_Max7219_1(i,disp1[dayge][i-1]);
  311.                   Write_Max7219_2(i,disp1[dayshi][i-1]);
  312.                   Write_Max7219_3(i,disp1[36][i-1]);        
  313.                   Write_Max7219_4(i,disp1[yue][i-1]);
  314.                   }
  315.                 }
  316.               switch (yue)
  317.               {  
  318.                        case 10:
  319.                         for(i=1;i<9;i++)
  320.                      {
  321.                       Write_Max7219_1(i,disp1[dayge][i-1]);
  322.                       Write_Max7219_2(i,disp1[dayshi][i-1]);
  323.                       Write_Max7219_3(i,disp1[36][i-1]);        
  324.                       Write_Max7219_4(i,disp1[38][i-1]);
  325.                       }
  326.                          break;
  327.                         case 11:
  328.                           for(i=1;i<9;i++)
  329.                       {
  330.                         Write_Max7219_1(i,disp1[dayge][i-1]);
  331.                         Write_Max7219_2(i,disp1[dayshi][i-1]);
  332.                         Write_Max7219_3(i,disp1[36][i-1]);        
  333.                         Write_Max7219_4(i,disp1[39][i-1]);
  334.                        }
  335.                              break;
  336.                           case 12:
  337.                           for(i=1;i<9;i++)
  338.                       {
  339.                         Write_Max7219_1(i,disp1[dayge][i-1]);
  340.                         Write_Max7219_2(i,disp1[dayshi][i-1]);
  341.                         Write_Max7219_3(i,disp1[36][i-1]);        
  342.                         Write_Max7219_4(i,disp1[40][i-1]);
  343.                        }
  344.                              break;
  345.                 }                  
  346. }         

  347. /**********************主程序**************************/
  348. void main()
  349. {
  350.       // uchar i;//j;

  351.       Init_MAX7219();
  352.       INit_887();
  353.           Delay_xms(5);
  354.       // set_time();   44
  355.     while(1)
  356.      {         
  357.           // WDT_CONTR=0x35;
  358.                   weekshow();
  359.              //         WDT_CONTR=0x35;
  360.            Delay_xms(5000);
  361.                     timeshow();                  
  362.               Delay_xms(5000);
  363.                  // dayshow();               
  364.                  // Delay_xms(5000);                  
  365.       }
  366. }
复制代码


MAX7219点阵时钟驱动程序.rar

47.96 KB, 下载次数: 66, 下载积分: 黑币 -5

配套程序

评分

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

查看全部评分

回复

使用道具 举报

ID:490777 发表于 2020-3-11 11:31 | 显示全部楼层
文件共享一下呗
回复

使用道具 举报

ID:687408 发表于 2020-3-12 22:06 | 显示全部楼层

邮箱给我发给你,后续加上想加上温度和湿度模块,模块的接线自己看程序,我没有画出来
回复

使用道具 举报

ID:638632 发表于 2020-4-16 20:43 | 显示全部楼层
可以共享一下原理图吗,小白刚想学习单片机,谢谢大神
回复

使用道具 举报

ID:258542 发表于 2020-7-12 21:40 | 显示全部楼层
您好,您这个7219级联时,点阵有没有出现残影的现象,我参照您的程序第三片老是出现第一片的残影数据?
回复

使用道具 举报

ID:687408 发表于 2020-9-18 23:53 | 显示全部楼层
绊脚石13 发表于 2020-7-12 21:40
您好,您这个7219级联时,点阵有没有出现残影的现象,我参照您的程序第三片老是出现第一片的残影数据?

解决了吗?残影因为显示的之前的残留,程序全部刷0一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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