基于proteus的51单片机仿真实例七十九、8位数码管驱动芯片max7221应用实例

1、MAX7221是集成式共阴极数码管驱动芯片。可以用来驱动8位7段式数码管,也可以驱动条形LED或者8*8LED点阵
单片机仅仅需要3个IO口就可以控制MAX7221驱动8位数码管。注意这里的数码管是共阴极的。
 
2、在keil c51中新建工程ex67,编写如下程序代码,编译并生成ex67.hex文件
//利用数码管驱动芯片max7221实现8位数码管显示
#include <reg51.h>
#include <intrins.h>
sbit DIN = P2^0;     //数据串出引脚
sbit CS = P2^1;     //片选端
sbit CLK = P2^2;    //移位时钟端
unsigned char disp_buff[8] = {2,0,1,0,10,2,10,9}; //显示的数字,数值为10的时候,显示“-”
// 延时函数
void delayms(unsigned int x)
{
  unsigned char i;
 while(x--)
 {
   for(i = 0;i < 120;i++);
 }
}
//写数据函数
void write_data(unsigned char addr,unsigned char dat)
{
  unsigned char i;
 CS = 0;        // 先写地址,片选置低,串行数据加载到移位寄存器
 for(i = 0;i < 8;i++)   //
 {
   CLK = 0;     //时钟上升沿数据移入内部移位寄存器
  addr <<= 1;    //待发送的地址,每次左移一次,高位在前发送,
  DIN = CY;    //数据移位后,如果有溢出,则可以从进位位CY中获得溢出的数据位
  CLK = 1;
  _nop_();
  _nop_();
  CLK = 0;    //下降沿时数据从DOUT移出
 }
 for(i = 0;i < 8;i++)
 {
   CLK = 0;   //
  dat <<= 1;   //发送数据
  DIN = CY;
  CLK = 1;
  _nop_();
  _nop_();
  CLK = 0;
 }
 CS = 1;      //CS上升沿,数据锁存
}
//初始化函数
void init_max7221(void)
{
 write_data(0x09,0xff);    //编码模式
 write_data(0x0a,0x07);    //亮度控制
 write_data(0x0b,0x07);    //扫描数码管的位数
 write_data(0x0c,0x01);     //工作模式
}
void main(void)
{
  unsigned char i;
 init_max7221();    // 初始化
 delayms(2);
 for(i = 0;i < 8;i++)
 {
   write_data(i+1,disp_buff[i]);   // 显示8位
 }
 while(1);
}
3、在proteus中新建仿真文件ex67.dsn,电路原理图如下所示
基于proteus的51单片机仿真实例七十九、8位数码管驱动芯片max7221应用实例

4、将ex67.hex文件载入at89c51中,启动仿真,按动拨码开关,观察运行结果。下图是某一时刻程序运行结果
基于proteus的51单片机仿真实例七十九、8位数码管驱动芯片max7221应用实例