找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2937|回复: 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 单片机教程网

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