欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8039|回復: 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, 下載次數: 67, 下載積分: 黑幣 -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 單片機教程網

快速回復 返回頂部 返回列表