注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
编号洞洞拐的个人空间 https://home.eeworld.com.cn/space-uid-377095.html [收藏] [复制] [分享] [RSS]
日志

MAX7219单片和两片级联驱动程序

已有 4146 次阅读2011-12-4 23:14 |个人分类:学习笔记|

MAX7219单片和两片级联驱动程序

说明一下:

    这个word版式是从百度上下载的,在原版中,作者只是写了驱动一片MAX7219的程序。

第一次使用MAX7219,用了两片级联来驱动15个数码管,按照原版程序驱动一片MAX7219是没有问题的,但是,驱动两片MAX7219就不行了。自己先认真看了MAX7219DataSsheet,看的迷迷糊糊,似懂非懂,又在网上搜索也没发现有正确的程序(都是有点儿问题,上网贴出来请教各位大虾的),没办法只能自力更生了,终于调出来了。将原版增删修改,传上来共享,希望对以后某位爱好者第一次使用MAX7219时有所帮助。

 

#include<reg52.h>

typedef unsigned char uchar

 

#define NO_OP 0x00       // 定义空操作 register

#define DIG_1 0x01        // 定义数码管1 register

#define DIG_2 0x02        // 定义数码管2 register

#define DIG_3 0x03        // 定义数码管3 register

#define DIG_4 0x04        // 定义数码管4 register

#define DIG_5 0x05        // 定义数码管5 register

#define DIG_6 0x06        // 定义数码管6 register

#define DIG_7 0x07        // 定义数码管7 register

#define DIG_8 0x08        // 定义数码管8 register

#define REG_DECODE 0x09       // 定义解码控制 register

#define REG_INTENSITY 0x0a     // 定义显示亮度 register

#define REG_SCAN_LIMIT 0x0b    // 定义扫描限制 register

#define REG_SHUTDOWN 0x0c    // 定义"shutdown"模式 register

#define REG_DISPLAY_TEST 0x0f  // 定义"display test"模式 register

#define INTENSITY_MIN 0x00      // 定义最低显示亮度

#define INTENSITY_MAX 0x0f      // 定义最高显示亮度

/********************可以根据自己需要选择不同的管脚****************/ 

sbit DATA P2^3;   //定义P2_3连接MAX7219 DATA引脚  

sbit CLK P2^5;    //定义P2_5连接MAX7219 CLK 引脚

sbit CS P2^4;     //定义P2_4连接MAX7219 CS 引脚

 

uchar code code_table[10]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};   /*采用数组*/

 

void send (uchar datain)

{

char Itemp;

for (i=8; i>0; i--)

{

CLK=0;                     // CLK 置低

temp=datain&0x80;

if (temp==0x80)              // 判断并输出一位

DATA=1;                // 输出"1"

else                        //

DATA=0;                // 输出"0"

      datain<<=1;                 //datain左移位,以便再次与0x80按位与

CLK=1;                     // CLK 置高

}

}

 

void MAX7219_Writeone (uchar add1, uchar dat1)  //向第一片MAX7219写数据

{

CS=0;                    // CS置低选通 MAX7219

send(add1);               // register number MAX7219

send(dat1);                // data MAX7219

CS=1;                    // 利用CS上升沿锁存以上移位进输入的16位数据

}

 

void MAX7219_Writetwo(uchar add2,uchar dat2)    //向第二片MAX7219写数据

{

       CS=0;

       sent(add2);             

       sent(dat2);

       CLK=1;       // 16.5个时钟周期,数据从第一片MAX7219DOUT端开始输出

       sent(REG_NO_OP);   //对第一片MAX7219进行空操作,

       sent(0x00);

       CS=1;

}

 

void MAX7219_Clearone(void)

{

uchar i;

for (i=0; i < 8; i++)

MAX7219_Writeone (i, 0x00);          // 清除第一片MAX7219所有位的显示

}

 

void MAX7219_Cleartwo(void)

{

       uchar i;

       for(i=1;i<=8;i++)

              MAX7219_Writetwo (i,0x00);     //清除第二片MAX7219所有位的显示

}

PS:可以两片一起清楚数据,但建议分开较好。

 

void MAX7219_SetBrightness (char brightness)

{

brightness &= 0x0f;                             // 屏蔽高位字节

MAX7219_Writeone (REG_INTENSITY, brightness);   // 设置数码管显示亮度

MAX7219_Writetwo (REG_INTENSITY, brightness);  //第二片MAX7219

}

 

void MAX7219_DisplayTestStart (void)

{

MAX7219_Writeone (REG_DISPLAY_TEST, 1);   //MAX7219 test 模式

MAX7219_Writetwo (REG_DISPLAY_TEST, 1); //第二片MAX7219

}

 

void MAX7219_DisplayTestStop (void)

{

MAX7219_Writeone (REG_DISPLAY_TEST, 0); // MAX7219为正常显示模式

MAX7219_Writetwo (REG_DISPLAY_TEST, 0); //第二片MAX7219

}

 

void MAX7219_ShutdownStart (void)

{

MAX7219_Writeone (REG_SHUTDOWN, 0); //MAX7219 shutdown 模式

MAX7219_Writetwo (REG_SHUTDOWN, 0); //第二片MAX7219

}

 

void MAX7219_ShutdownStop (void)

{

MAX7219_Writeone (REG_SHUTDOWN, 1);  //MAX7219为正常显示模式

MAX7219_Writetwo (REG_SHUTDOWN, 1);  //第二片MAX7219

}

 

void MAX7219_Init (void)          //MAX7219初始化

{  

DATA=1;                  // DATA1

CLK=1;                   // CLK 1

CS=1;                    // CS 1

MAX7219_Writeone (REG_SCAN_LIMIT, 7);       // 设置为全显示

MAX7219_Writetwo (REG_SCAN_LIMIT, 7);     //第二片MAX7219

MAX7219_Writeone (REG_DECODE, 0x00);     // 所有位设置为非解码方式

MAX7219_Writetwo (REG_DECODE, 0x00);     //第二片MAX7219

MAX7219_ShutdownStop();   //MAX7219为正常显示模式 (shutdown模式)

MAX7219_DisplayTestStop();   // MAX7219为正常显示模式 (test模式)

MAX7219_Clearone();                            // 清除所有位的显示

MAX7219_Cleartwo();                          //第二片MAX7219

MAX7219_SetBrightness(INTENSITY_MAX);    // 置最大亮度

}

 

PS:如果只需驱动一片MAX7219,将关于驱动第二片MAX7219的函数去除就可以。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章