久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3613|回復: 0
打印 上一主題 下一主題
收起左側

MAX7219驅動8X8點陣級聯,翻頁 附源程序

[復制鏈接]
跳轉到指定樓層
樓主
買了幾塊MAX7219點陣模塊,弄了個點陣級聯,時間上翻顯示,有秒點上下閃動,里面有兩段,一段是點陣屏水平放置時數字上翻,另一段是點陣屏垂直放置時數字上翻,程序純屬業余愛好,高手勿噴,下面直接代碼,3個IO口不能有其他器件,下面是壓縮過的圖像,有點變化,其實是沒有拖影的,
單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <max7219.h>
  4. #include <zimo.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int


  7. uchar timecount,point,sec;
  8. void timedeal();

  9. void Delay_xms(uint x)
  10. {
  11.         uint i,j;
  12.         for(i=0;i<x;i++)
  13.           for(j=0;j<112;j++);
  14. }

  15. void main(void)
  16. {
  17.         uchar i,j,a,b,c,d;

  18.         IE=0x82;     //允許定時器0工作
  19.         TR0=1;       //定時器0可以工作  
  20.         TMOD=0x01;   //timer0為模式1  
  21.          
  22.         TH0 = 0x4c;
  23.         TL0 = 0x00;
  24.         Delay_xms(50);
  25.          
  26.         InitMAX7219();
  27.         
  28.         while (1)        
  29.         {
  30.                     a=sec%10;
  31.                   c=sec/10;
  32.         /*******************************以下屏幕旋轉90度**************/
  33.                 if(b==a)
  34.                 {
  35.                         for(i=0;i<8;i++)           
  36.                         {                                                                                   
  37.                                 for(j=0;j<8;j++)
  38.                                 {        
  39.                                         Write_1(8-j,logo_1[a][j]);
  40.                                         Write_2(8-j,logo_2[c][j]|logo_1[11][j]);        
  41.                                 }
  42.                         }
  43.                  }
  44.                 else
  45.                 {
  46.                         for(i=0;i<8;i++)            
  47.                         {                                                                                   
  48.                                 for(j=0;j<8;j++)
  49.                                 {        
  50.                                         Write_1(8-j,(logo_1[b][j]<<i|logo_1[b+1][j]>>8-i));        
  51.                                         if(d==c) Write_2(8-j,logo_2[d][j]|logo_1[12][j]);
  52.                                         else  Write_2(8-j,(logo_2[d][j]<<i|logo_2[d+1][j]>>8-i)|logo_1[12][j]);
  53.                                 }
  54.                         Delay_xms(50);
  55.                         }
  56.                  }
  57.                 b=a;
  58.                 d=c;
  59.          
  60.           /*******************************以下屏幕旋轉90度**************
  61.                 if(b==a)
  62.                 {
  63.                           for(j=1;j<9;j++)
  64.                         {               
  65.                                 Write_1(j,logo_3[b][j-1]);          //1
  66.                                 Write_2(j,logo_4[d][j-1]|logo_3[11][j-1]);          //2
  67.                
  68.                         }
  69.                 }
  70.                 else   
  71.                 for(i=0;i<8;i++)
  72.                 {        
  73.                         for(j=1;j<9;j++)
  74.                         {               
  75.                                 Write_1(j,logo_3[b][(j-1+i)]);  //1
  76.                                 if(d==c)Write_2(j,logo_4[d][(j-1)]|logo_3[12][j-1]);        //2
  77.                                 else Write_2(j,logo_4[d][(j-1+i)]|logo_3[12][j-1]);//2
  78.                         }
  79.                         Delay_xms(50);
  80.                 }
  81.                 b=a;
  82.                 d=c;
  83. /**************************************************************************/                  
  84.         }
  85. }



  86. /****************************************************/
  87. void time50ms(void) interrupt 1  //計時模式
  88. {
  89.            TH0 = 0x4c;
  90.         TL0 = 0x00;
  91.         timecount++;
  92.         if(timecount==10)  
  93.         {  
  94.                 timecount=0;
  95.                  point=!point;   
  96.                   if(point)   
  97.                   {   
  98.                           sec++;   
  99.                              if(sec>=60)
  100.                         sec=0;
  101.                   }  
  102.         }
  103. }



  104. /*************************************************/
  105. #ifndef _MAX7219_H_
  106. #define _MAX7219_H_
  107. #include <REGX51.H>
  108. /*********************** 定義MAX7219 內部寄存器 **********************/
  109. #define REG_DECODE        0x09            // 譯碼方式寄存器
  110. #define REG_INTENSITY     0x0a            // 亮度寄存器
  111. #define REG_SCAN_LIMIT    0x0b            // 掃描界限寄存器
  112. #define REG_SHUTDOWN      0x0c            // 停機寄存器
  113. #define REG_DISPLAY_TEST  0x0f            // 顯示測試寄存器
  114. #define INTENSITY_MIN     0x00            // 最小顯示亮度
  115. #define INTENSITY_MAX     0x0f            // 最大顯示亮度
  116. /*********************** 定義MAX7219 端口信號 ************************/
  117. sbit DATA=P3^5;
  118. sbit LOAD=P3^4;
  119. sbit CLK=P3^3;

  120. #define        DATA_high        DATA=1
  121. #define        DATA_low        DATA=0
  122. #define        LOAD_high        LOAD=1
  123. #define        LOAD_low        LOAD=0
  124. #define        CLK_high        CLK=1
  125. #define        CLK_low                CLK=0
  126. /************************** 函數原型說明 *****************************/
  127. void Write_1 (unsigned char, unsigned char);
  128. void Write_2 (unsigned char, unsigned char);
  129. void SendByte (unsigned char);
  130. void Clear (void);
  131. /************************************************************************
  132. *  函數原型:void Init()
  133. *  功    能: 對MAX7219進行初始化,調用任何其他函數之前必需先調用此函數
  134. *************************************************************************/
  135. void InitMAX7219(void)
  136. {
  137.           DATA_high;
  138.         LOAD_high;
  139.         CLK_high;
  140.           Write_1(REG_SCAN_LIMIT, 7);      // 掃描8位數字
  141.           Write_1(REG_DECODE, 0);          // 設置不譯碼方式
  142.           Write_1(REG_SHUTDOWN,1);         // 結束停機方式,正常工作
  143.           Write_1(REG_DISPLAY_TEST, 0);    // 結束顯示測試,正常工作
  144.         Write_1(REG_INTENSITY, 0);       // 設置亮度
  145.          
  146.         Write_2(REG_SCAN_LIMIT, 7);      // 掃描8位數字
  147.           Write_2(REG_DECODE, 0);          // 設置不譯碼方式
  148.           Write_2(REG_SHUTDOWN,1);         // 結束停機方式,正常工作
  149.           Write_2(REG_DISPLAY_TEST, 0);    // 結束顯示測試,正常工作
  150.         Write_2(REG_INTENSITY, 0);       // 設置亮度
  151.         
  152.         Clear();                       // 清零全部顯示器



  153. }
  154. /*************************************************************************
  155. *  函數原型:void Clear()
  156. *  功    能:關閉全部顯示器
  157. **************************************************************************/
  158. void Clear (void)
  159. {
  160.           unsigned char i;
  161.           for (i=1;i<=8;i++)
  162.     Write_1(i, 0);                          // 關閉全部顯示器
  163.         Write_2(i, 0);
  164. }
  165. /*************************************************************************
  166. *  函數原型:static void Write (unsigned char reg_add, unsigned char dat)
  167. *  功    能:向指定的MAX7219內部寄存器寫入數據
  168. *  參    數: reg_add = MAX7219內部寄存器地址
  169.            dat = 待寫入的數據
  170. **************************************************************************/
  171. void Write_1 (unsigned char reg_add, unsigned char dat)
  172. {
  173.           LOAD_low;                               // 使LOAD變低,啟動串行數據發送
  174.           SendByte(reg_add);                                 // 發送MAX7219內部寄存器地址
  175.         if(reg_add>8) SendByte(dat);            // 發送待寫入的數據
  176.         else  SendByte((dat<<7)|(dat>>1));                //如發送的是顯示數據,則根據硬件轉換一下數據位
  177.           LOAD_high;                              // 使LOAD變高,串行數據結束
  178. }
  179. /*************************************************************************
  180. *  函數原型:static void Write (unsigned char reg_add, unsigned char dat)
  181. *  功    能:向指定的MAX7219內部寄存器寫入數據
  182. *  參    數: reg_add = MAX7219內部寄存器地址
  183.            dat = 待寫入的數據
  184. **************************************************************************/
  185. void Write_2 (unsigned char reg_add, unsigned char dat)
  186. {
  187.           LOAD_low;                               // 使LOAD變低,啟動串行數據發送
  188.           SendByte(reg_add);                                 // 發送MAX7219內部寄存器地址//寫入地址,即數碼管編號
  189.         if(reg_add>8) SendByte(dat);            // 發送待寫入的數據 //寫入數據,即數碼管顯示數字
  190.         else  SendByte((dat<<7)|(dat>>1));                //如發送的是顯示數據,則根據硬件轉換一下數據位
  191.           CLK_high;
  192.           SendByte(0x00);                                                        //        第一片空
  193.         SendByte(0x00);                                                        //        第一片空
  194.           LOAD_high;                              // 使LOAD變高,串行數據結束
  195. }

  196. /*************************************************************************
  197. *  函數原型:static void SendByte (unsigned char dat)
  198. *  功    能:向MAX7219發送一個字節串行數據
  199. *  參    數:dat = 待發送的數據
  200. **************************************************************************/
  201. void SendByte (unsigned char dat)
  202. {
  203.           unsigned char i;
  204.           for (i=0; i<8; i++)
  205.           {   
  206.             CLK_low;                                   // 使CLK變低
  207.             if(dat&0x80)                      // 發送一位數據"1"或"0"
  208.                       DATA_high;                                       
  209.             else                                             
  210.                       DATA_low;   
  211.                 dat<<=1;
  212.               CLK_high;                                    // 使CLK變高
  213.           }
  214. }
  215. #endif


  216. /************************************************************************/
  217. unsigned char code logo_1[][8]=
  218. {
  219.         0x00,0x00,0x3E,0x41,0x41,0x41,0x41,0x3E,//0
  220.            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,//1
  221.            0x00,0x00,0x46,0x49,0x49,0x49,0x49,0x31,//2
  222.         0x00,0x00,0x41,0x49,0x49,0x49,0x49,0x36,//3
  223.         0x00,0x00,0x70,0x08,0x08,0x08,0x08,0x7F,//4
  224.            0x00,0x00,0x31,0x49,0x49,0x49,0x49,0x46,//5
  225.            0x00,0x00,0x3E,0x49,0x49,0x49,0x49,0x46,//6
  226.            0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x3F,//7
  227.            0x00,0x00,0x36,0x49,0x49,0x49,0x49,0x36,//8
  228.            0x00,0x00,0x31,0x49,0x49,0x49,0x49,0x3E,//9
  229.            0x00,0x00,0x3E,0x41,0x41,0x41,0x41,0x3E,//0
  230.         0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  231.         0x41,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  232. };
  233. unsigned char code logo_2[][8]=
  234. {
  235.         0x00,0x00,0x3E,0x41,0x41,0x41,0x41,0x3E,//0
  236.            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,//1
  237.            0x00,0x00,0x46,0x49,0x49,0x49,0x49,0x31,//2
  238.         0x00,0x00,0x41,0x49,0x49,0x49,0x49,0x36,//3
  239.         0x00,0x00,0x70,0x08,0x08,0x08,0x08,0x7F,//4
  240.            0x00,0x00,0x31,0x49,0x49,0x49,0x49,0x46,//5
  241.           0x00,0x00,0x3E,0x41,0x41,0x41,0x41,0x3E,//0
  242. };

  243. unsigned char code logo_3[][8]=
  244. {
  245.         0x00,0x1E,0x21,0x21,0x21,0x21,0x21,0x1E,//0
  246.         0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//1
  247.            0x00,0x3E,0x01,0x01,0x1E,0x20,0x20,0x1F,//2
  248.           0x00,0x3E,0x01,0x01,0x1E,0x01,0x01,0x3E,//3
  249.          0x00,0x21,0x21,0x21,0x1F,0x01,0x01,0x01,//4
  250.         0x00,0x1F,0x20,0x20,0x1E,0x01,0x01,0x3E,//5
  251.         0x00,0x1F,0x20,0x20,0x3E,0x21,0x21,0x1E,//6
  252.         0x00,0x3E,0x01,0x01,0x01,0x01,0x01,0x01,//7
  253.         0x00,0x1E,0x21,0x21,0x1E,0x21,0x21,0x1E,//8
  254.         0x00,0x1E,0x21,0x21,0x1F,0x01,0x01,0x3E,//9        
  255.         0x00,0x1E,0x21,0x21,0x21,0x21,0x21,0x1E,//0
  256.         0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,
  257.            0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x80,
  258. };
  259. unsigned char code logo_4[][8]=
  260. {
  261.         0x00,0x1E,0x21,0x21,0x21,0x21,0x21,0x1E,//0
  262.         0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//1
  263.            0x00,0x3E,0x01,0x01,0x1E,0x20,0x20,0x1F,//2
  264.           0x00,0x3E,0x01,0x01,0x1E,0x01,0x01,0x3E,//3
  265.          0x00,0x21,0x21,0x21,0x1F,0x01,0x01,0x01,//4
  266.         0x00,0x1F,0x20,0x20,0x1E,0x01,0x01,0x3E,//5        
  267.         0x00,0x1E,0x21,0x21,0x21,0x21,0x21,0x1E,//0
  268. };
復制代碼

圖片:鏈接:https://pan.baidu.com/s/1ae95GQXkaVLrqg8nV1oE8w
提取碼:5q6j

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品欧美一区二区三区不卡 | 亚洲国产黄 | 欧美性极品xxxx做受 | 欧美日韩视频在线播放 | 91精品久久久久久久久久入口 | 国产精品免费看 | 99热精品在线 | 综合久久av| 蜜桃视频在线观看免费视频网站www | 亚洲一区二区久久 | 欧美日韩在线综合 | 国产成人精品福利 | 成人二区 | 国产精品久久国产精品 | 午夜天堂精品久久久久 | 久久久久久成人 | 日韩久久精品 | 一级毛片免费完整视频 | 免费黄色的网站 | 一区二区三区不卡视频 | 日本五月婷婷 | 欧美成人精品一区二区三区 | 91久久精品国产91久久 | 日批av| 99久热在线精品视频观看 | 精品国产乱码久久久久久蜜柚 | 国产精品久久久久久中文字 | 国产99久久久国产精品 | 香蕉久久久 | 激情一区二区三区 | 亚洲视频网 | 日韩精品一区二区三区中文在线 | 欧美国产亚洲一区二区 | 色婷婷精品久久二区二区蜜臂av | 精久久久 | 亚洲成人自拍网 | 黄色在线网站 | 国产成人99久久亚洲综合精品 | 国产美女久久 | 亚洲码欧美码一区二区三区 | 在线观看国产视频 |