点阵屏驱动程序(MAX7219)

点阵屏驱动程序(MAX7219)
点阵屏驱动程序(MAX7219)

//自己做项目写的2*4点阵屏驱动,分享给大家,基于STC15单片机

点阵屏如上图所示

#include "stc15w4k32s4.h"

#define uchar unsigned char

#define uint unsigned int

//定义Max7219端口

sbit Max7219_pinCLK = P1^7;

sbit Max7219_pinCS = P1^6;

sbit Max7219_pinDIN = P1^5;

void Write_Max7219_byte(uchar DATA); //向MAX7219(U3)写入字节void Write_Max7219(uchar address,uchar dat); //向MAX7219写入数据

void Init_MAX7219(void); //初使化函数

void Display_1(uchar dat); //1号屏显示数字

void Display_2(uchar dat); //2号屏显示数字

void Display_3(uchar dat); //3号屏显示数字

void Display_4(uchar dat); //4号屏显示数字

void Display_5(uchar dat); //5号屏显示数字

void Display_6(uchar dat); //6号屏显示数字

void Display_7(uchar dat); //7号屏显示数字

void Display_8(uchar dat); //8号屏显示数字、

/* 8个点阵驱动程序 */

uchar code disp1[38][8] ={

{0x00,0x30,0x48,0x48,0x48,0x48,0x48,0x30}, //0

{0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38}, //1

{0x00,0x78,0x08,0x08,0x78,0x40,0x40,0x78}, //2

{0x00,0x78,0x08,0x08,0x78,0x08,0x08,0x78}, //3

{0x00,0x10,0x30,0x50,0x78,0x10,0x10,0x10}, //4

{0x00,0x78,0x40,0x40,0x78,0x08,0x08,0x78}, //5

{0x00,0x78,0x40,0x40,0x78,0x48,0x48,0x78}, //6

{0x00,0x7C,0x04,0x08,0x10,0x10,0x10,0x10}, //7

{0x00,0x78,0x48,0x48,0x78,0x48,0x48,0x78}, //8

{0x00,0x78,0x48,0x48,0x78,0x08,0x08,0x78}, //9

{0}, //显示空白10 {0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00}, //显示负数符号11 {0x00,0x7C,0x40,0x40,0x7C,0x40,0x40,0x7C}, //E 12 {0x00,0x78,0x44,0x44,0x7C,0x48,0x48,0x44}, //R 13 {0x10,0x28,0x44,0x44,0x44,0x7C,0x44,0x44}, //A 14 {0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x78}, //L 15 {0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70}, //C 16 };

//--------------------------------------------

//功能:向MAX7219(U3)写入字节

//入口参数:DATA

//出口参数:无

//说明:

void Write_Max7219_byte(uchar DATA)

{

uchar i;

Max7219_pinCS=0;

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

{

Max7219_pinCLK=0;

Max7219_pinDIN=DATA&0x80;

DATA=DATA<<1;

Max7219_pinCLK=1;

}

}

//-------------------------------------------

//功能:向MAX7219写入数据

//入口参数:address、dat

//出口参数:无

//说明:

void Write_Max7219(uchar address,uchar dat)

{

uchar i;

Max7219_pinCS=0;

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

{

Write_Max7219_byte(address); //写入地址,即数码管编号

Write_Max7219_byte(dat); //写入数据,即数码管显示数字}

Max7219_pinCS=1;

}

void Init_MAX7219(void) //初使化7219

{

Write_Max7219(0x09, 0x00); //译码方式:1;BCD码,0;非BCD模式Write_Max7219(0x0a, 0x0a); //亮度0-f (0-16)

Write_Max7219(0x0b, 0x07); //扫描界限;8个数码管显示

Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1

Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0

Write_Max7219(1,0); //清除缓冲区数据,消除显示误差

Write_Max7219(2,0); //清除缓冲区数据,消除显示误差

Write_Max7219(3,0); //清除缓冲区数据,消除显示误差

Write_Max7219(4,0); //清除缓冲区数据,消除显示误差

Write_Max7219(5,0); //清除缓冲区数据,消除显示误差

Write_Max7219(6,0); //清除缓冲区数据,消除显示误差

Write_Max7219(7,0); //清除缓冲区数据,消除显示误差

Write_Max7219(8,0); //清除缓冲区数据,消除显示误差

}

/***************************************************/

void Display_1(uchar dat)

{

uchar i;

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

{

Max7219_pinCS=0;

Write_Max7219_byte(i); //写入地址,即数码管编号

Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Max7219_pinCS=1;

Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}

}

void Display_2(uchar dat)

{

uchar i;

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

{

Max7219_pinCS=0;

Write_Max7219_byte(i); //写入地址,即数码管编号

Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Max7219_pinCS=1;

Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}

}

void Display_3(uchar dat)

{

uchar i;

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

{

Max7219_pinCS=0;

Write_Max7219_byte(i); //写入地址,即数码管编号

Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Max7219_pinCS=1;

Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}

}

void Display_4(uchar dat)

{

uchar i;

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

{

Max7219_pinCS=0;

Write_Max7219_byte(i); //写入地址,即数码管编号

Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Max7219_pinCS=1;

Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}

}

void Display_5(uchar dat)

{

uchar i;

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

{

Max7219_pinCS=0;

Write_Max7219_byte(i); //写入地址,即数码管编号

Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Max7219_pinCS=1;

Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}

}

void Display_6(uchar dat)

{

uchar i;

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

{

Max7219_pinCS=0;

Write_Max7219_byte(i); //写入地址,即数码管编号

Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Max7219_pinCS=1;

Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}

}

void Display_7(uchar dat)

{

uchar i;

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

{

Max7219_pinCS=0;

Write_Max7219_byte(i); //写入地址,即数码管编号

Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字

Write_Max7219_byte(0);

Write_Max7219_byte(0);

Max7219_pinCS=1;

Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}

}

void Display_8(uchar dat)

{

uchar i;

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

{

Max7219_pinCS=0;

Write_Max7219_byte(i); //写入地址,即数码管编号

Write_Max7219_byte(disp1[dat][i-1]); //写入数据,即数码管显示数字

Max7219_pinCS=1;

Write_Max7219(0,0); //清除缓冲区数据,消除显示误差}

}

void main(void)

{

Init_MAX7219();

Display_1(0); //1号屏显示数字0

Display_2(1); //2号屏显示数字1

Display_3(2); //3号屏显示数字2

Display_4(3); //4号屏显示数字3

Display_5(4); //5号屏显示数字4

Display_6(5); //6号屏显示数字5

Display_7(6); //7号屏显示数字6

Display_8(7); //8号屏显示数字7

while(1);

}

max7219资料及电路图

MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。。它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。MAX7219的外部引脚分配如图1所示及内部结构如图2所示。 图1 MAX7219的外部引脚分配

图2 MAX7219的内部引脚分配 各引脚的功能为: DIN:串行数据输入端 DOUT:串行数据输出端,用于级连扩展 LOAD:装载数据输入 CLK:串行时钟输入 DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流 SEG A~SEG G DP 7段驱动和小数点驱动 ISET:通过一个10k电阻和Vcc相连,设置段电流 MAX7219有下列几组寄存器:(如图3) MAX7219内部的寄存器如图3,主要有:译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。编程时只有正确操作这些寄存器,MAX7219才可工作。

图 3 MAX7219内部的相关寄存器 分别介绍如下: (1)译码控制寄存器(X9H) 如图4所示,MAX7219有两种译码方式:B译码方式和不译码方式。当选择不译码时,8个数据为分别一一对应7个段和小数点位;B译码方式是BCD译码,直接送数据就可以显示。实际应用中可以按位设置选择B译码或是不译码方式。 图4 MAX7219的译码控制寄存器 (2)扫描界限寄存器(XBH)

点阵屏驱动程序(MAX7219)

//自己做项目写的2*4点阵屏驱动,分享给大家,基于STC15单片机 点阵屏如上图所示 #include "stc15w4k32s4.h" #define uchar unsigned char #define uint unsigned int //定义Max7219端口 sbit Max7219_pinCLK = P1^7; sbit Max7219_pinCS = P1^6; sbit Max7219_pinDIN = P1^5; void Write_Max7219_byte(uchar DATA); //向MAX7219(U3)写入字节void Write_Max7219(uchar address,uchar dat); //向MAX7219写入数据 void Init_MAX7219(void); //初使化函数 void Display_1(uchar dat); //1号屏显示数字 void Display_2(uchar dat); //2号屏显示数字 void Display_3(uchar dat); //3号屏显示数字 void Display_4(uchar dat); //4号屏显示数字 void Display_5(uchar dat); //5号屏显示数字 void Display_6(uchar dat); //6号屏显示数字 void Display_7(uchar dat); //7号屏显示数字

void Display_8(uchar dat); //8号屏显示数字、 /* 8个点阵驱动程序 */ uchar code disp1[38][8] ={ {0x00,0x30,0x48,0x48,0x48,0x48,0x48,0x30}, //0 {0x00,0x10,0x30,0x10,0x10,0x10,0x10,0x38}, //1 {0x00,0x78,0x08,0x08,0x78,0x40,0x40,0x78}, //2 {0x00,0x78,0x08,0x08,0x78,0x08,0x08,0x78}, //3 {0x00,0x10,0x30,0x50,0x78,0x10,0x10,0x10}, //4 {0x00,0x78,0x40,0x40,0x78,0x08,0x08,0x78}, //5 {0x00,0x78,0x40,0x40,0x78,0x48,0x48,0x78}, //6 {0x00,0x7C,0x04,0x08,0x10,0x10,0x10,0x10}, //7 {0x00,0x78,0x48,0x48,0x78,0x48,0x48,0x78}, //8 {0x00,0x78,0x48,0x48,0x78,0x08,0x08,0x78}, //9 {0}, //显示空白10 {0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00}, //显示负数符号11 {0x00,0x7C,0x40,0x40,0x7C,0x40,0x40,0x7C}, //E 12 {0x00,0x78,0x44,0x44,0x7C,0x48,0x48,0x44}, //R 13 {0x10,0x28,0x44,0x44,0x44,0x7C,0x44,0x44}, //A 14 {0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x78}, //L 15 {0x00,0x70,0x88,0x80,0x80,0x80,0x88,0x70}, //C 16 }; //-------------------------------------------- //功能:向MAX7219(U3)写入字节 //入口参数:DATA //出口参数:无 //说明: void Write_Max7219_byte(uchar DATA) { uchar i; Max7219_pinCS=0; for(i=8;i>=1;i--) { Max7219_pinCLK=0; Max7219_pinDIN=DATA&0x80; DATA=DATA<<1; Max7219_pinCLK=1; } } //------------------------------------------- //功能:向MAX7219写入数据 //入口参数:address、dat

串行接口8位LED显示驱动MAX7219-MAX7221

```````````````````````````````````?? NBY832:0NBY8332????????0???????????????????)μQ*?9?8?MFE??????????????75????MFE?????CDE!C?????????????????????????????9y9??SBN???????????????MFE?????NBY8332???TQJ UN ?RTQJ UN ??NJDSPXJSF UN ?????????????????FNJ? ???5?????????????μQ???????????????????????????NBY832:0NBY8332????????????C?????????? ????261μB????????????????????????2?9???????????????????MFE?????? ??4W????????????????NBY7:62????? ```````````````````````````````````?? ```````````````````````````````````?? ?21NI{????????MFE??????0?????? ?261μB?????)????*!??????????????????????????MFE??? ?????????????????FNJ!)NBY8332*!?TQJ?RTQJ?NJDSPXJSF????)NBY8332*!?35??EJQ?TP?? NBY832:0NBY8332 ?????9??MFE????? ________________________________________________________________Maxim Integrated Products 1 ```````````````````````````?????? ```````````````````````````````???? 19-4452; Rev 4; 7/03 ```````````````````````````````???? ????)?*???????????*?????U B >!,36°D? TQJ?RTQJ?Npupspmb!Jod/????NJDSPXJSF?Obujpobm!Tfnjdpoevdups!Dpsq/???? ??????????? ???MFE????? ???????????????????????????????????????????????????? ????????????????Nbyjn??????ǖ21911!963!235:!)????*?21911!263!235:!)????*????Nbyjn?????ǖdijob/nbyjn.jd/dpn?

Arduino驱动MAX7219四位数码管显示时间

Arduino驱动MAX7219四位数码管显示时间 默认使用Pin 2为MOSI(数据发送)引脚,Pin 3为CS(片选)引脚,Pin 4为SCLK(时钟)引脚,如有需要请修改代码前三行的define。 #define MO 2 #define CS 3 #define CLK 4 static int time_h = 21, time_m =25, time_s = 30; //此刻时间:时,分,秒 int alarm_clock_h = 8, alarm_clock_m = 00; //闹钟时间 unsigned long time = 0; unsigned char buffer_led[5] = { 0x00,};//缓存 void SPI_init(void) //初始化SPI引脚 { pinMode(CLK, OUTPUT); pinMode(MO, OUTPUT); pinMode(CS, OUTPUT); digitalWrite(CS, HIGH); digitalWrite(CLK, LOW); digitalWrite(MO, HIGH); } void SPI_send(unsigned char reg, unsigned char data) //spi单向16位数据发送{ int x; /* Serial.print("reg = "); Serial.print(reg, HEX); Serial.print(" data = "); Serial.println(data, HEX); */ digitalWrite(CS, LOW); for (x = 0; x < 8; x++) { digitalWrite(MO, 0x80 & (reg << x)); //高位在前 digitalWrite(CLK, HIGH); digitalWrite(CLK, LOW); } for (x = 0; x < 8; x++) {

max7219驱动8个数码管代码及电路图

max7219驱动8个数码管代码及电路图 #include "reg52.h" #include "my_type.h" #define Addr_No_Op 0x00 //不工作寄存器地址 #define Addr_Digit0 0x01 #define Addr_Digit1 0x02 #define Addr_Digit2 0x03 #define Addr_Digit3 0x04 #define Addr_Digit4 0x05 #define Addr_Digit5 0x06 #define Addr_Digit6 0x07 #define Addr_Digit7 0x08 #define Addr_Decode_Mode 0x09 //译码模式寄存器地址

#define Addr_Intensity 0x0a //亮度控制寄存器地址(max7221) #define Addr_Scan_Limit 0x0b //扫描控制寄存器地址 #define Addr_Shutdowm 0x0c //掉电模式寄存器地址 #define Addr_Display_Test 0x0f //显示检测寄存器地址 sbit Max7219_Din=P1^5; sbit Max7219_Load=P1^6; sbit Max7219_Clk=P1^7; uchar code max7219_7led_code[18]={0x7e,0x30,0x6d,0x79, //0-1-2-3 0x33,0x5b,0x5f,0x70, //4-5-6-7 0x7f,0x7b,0x01,0x4e, //8-9-"-"-E 0x37,0x0e,0x67,0x00}; //H-L-P-空白 void wr_max7219(uchar addr,uchar dat) { uchar i;

MAX7219工作原理简介

MAX7219工作原理简介 MAX7219是一个采用3线串行接口的8位共阴极7段LED显示驱动器。本文分析了MAX7219各个寄存器的功能,并结合MAX7219的工作时序,给出了MAX7219在Motorola MC68HC908单片机系统中的一个应用实例。关键词: MCU;MAX7219;LED Motorola MC68HC908 MAX7219工作时序及其寄存器 MAX7219是一个高性能的多位LED显示驱动器,可同时驱动8位共阴极LED或64个独立的LED。其内部结构框图如图1所示,主要包括移位寄存器、控制寄存器、译码器、数位与段驱动器以及亮度调节和多路扫描电路等。 MAX7219 采用串行接口方式,只需LOAD、DIN、CLK三个管脚便可实现数据传送。DIN管脚上的16位串行数据包不受LOAD状态的影响,在每个CLK的上升沿被移入到内部16位移位寄存器中。然后,在LOAD的上升沿数据被锁存到数字或控制寄存器中。LOAD必须在第16个时钟上降沿或之后,但在下一个时钟上升沿之前变高,否则数据将会丢失。DIN端的数据通过移位寄存器传送,并在16.5个时钟周期后出现在DOUT端,随CLK 的下降沿输出。 MAX7219的操作时序如图2所示。 MAX7219的串行数据标记为D15~D0,其中低8位表示显示数据本身,最高的4位D15~D12未使用,寻址内部寄存器的地址位占用D11~D8,选择14个内部寄存器,见表1。 图1 MAX7219内部结构框图 图2 MAX7219的数据传送时序 MAX7219 内部具有14个可寻址数字和控制寄存器。其中的8个数字寄存器由一个片内8×8双端口SRAM实现。它们可直接寻址,因此可对单个数进行更新并且通常只要 V+超过2V数据就可保留下去。除8个数位寄存器之外,还有无操作、译码方式、亮度调整、扫描位数、睡眠模式和显示器测试6个控制寄存器。 无操作寄存器用于多片MAX7219级联,在不改变显示或不影响任意控制寄存器条件下,它允许数据从DIN传送到DOUT。 睡眠模式控制寄存器用于节省电源消耗,延长显示器的使用寿命。当睡眠模式控制寄存器控制字节中的最低位D0=0时,为睡眠模式;D0=1时,为正常操作模式。上电时所有的控制寄存器都复位,显示器都熄灭,芯片

Max7219驱动led时钟代码(包含初始化

Max7219驱动led时钟代码(包含初始化) #include //#define uint unsigned int //#define uchar unsigned char unsigned int i; sbit CLK=P2^2; //MAX7219时钟信号线 sbit LD=P2^1; //数据加载线 sbit DIN=P2^0; //数据输入线 unsigned char code num[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b, 0x77,0x1f,0x4e,0x3d,0x01,0x00}; void w_max7219(unsigned char addr,unsigned char wdata); void init_max7219(); //MAX7219 void timer_ms(unsigned char tim); unsigned char a,b; //unsigned char num[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,}; //共阳 void main(){ while(1){ init_max7219(); //MAX7219初始化函数 w_max7219(0x01,num[1]); //向MAX7219 w_max7219(0x02,num[2]); w_max7219(0x03,num[3]); w_max7219(0x04,num[4]); w_max7219(0x05,num[5]); w_max7219(0x06,num[6]); w_max7219(0x07,num[7]); w_max7219(0x08,num[8]); } } void init_max7219() { w_max7219(0x0a,0x07); w_max7219(0x0b,0x07); w_max7219(0x09,0x00); w_max7219(0x0c,0x01); w_max7219(0x0f,0x00); timer_ms(2); }

MAX7219驱动8位数码管

#include #include #define uchar unsigned char #define uint unsigned int sbit sbDIN=P2^0; sbit sbLOAD=P2^1; sbit sbCLK=P2^2; uchar disp_buffer[8]={2,0,1,2,1,1,2,4}; void delayms(uint ms) { uint i,j; for(i=0;i

delayms(10); for(i=0;i<8;i++) { write(i+1,disp_buffer[i]); } while(1) { } }

max7219驱动数码管程序(51单片机+STM32 MAX7219数码管程序案例)

max7219驱动数码管程序(51单片机+STM32 MAX7219数码管程序案例) 1、STM32 硬件SPI max7219 8位数码管显示模块数码管模块电路图 /***************************************************************** Updated TIme:12th,12,2015 FuncTIon:通过MAX7219驱动数码管 ******************************************************************/ #include delay.h #include sys.h #include usart.h//串口通信 #define Max7219_pinCLK PAout(5) #define Max7219_pinCS PAout(3) #define Max7219_pinDIN PAout(7) /**************************************************************************** * 名称:SPI1_Init(void) * 功能:STM32_SPI1硬件配置初始化 * 入口参数:无 * 出口参数:无 * 说明:STM32_SPI1硬件配置初始化,使用3V3 ****************************************************************************/ void SPI1_Init(void) { SPI_InitTypeDef SPI1_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //配置SPI1管脚 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);

用DS18B20和MAX7219完成温度实时测量与显示

/*DS18B20、MAX7219驱动数码管、温度测量与显示程序*/ #include #include //#include"7219display.h" #define uchar unsigned char #define uint unsigned int sbit ds=P2^0; sbit beep=P3^6; sbit L1=P3^0; uchar flag ; uchar tempH,tempL; uint num; uchar setValue_low=15; uchar setValue_high=30; #include char bright=0x04; /*亮度设置*/ /********************************* 定义MAX7219内部寄存器***************/ #define reg_decode 0x09 /*译码控制寄存器*/ #define reg_intensity 0x0a /*亮度寄存器*/ #define reg_scan_limit 0x0b /*扫描寄存器,控制显示亮度*/ #define reg_shutdown 0x0c /*掉电模式*/ #define reg_display_test 0x0f /*显示检测寄存器*/ /*******************定义7219端口信号************/ sbit dataa=P1^0; /*串行数据输入端口*/ sbit load=P1^1; /*载入数据*/ sbit clk=P1^2; /*片选端*/ /*************定义显示常数表格************/ uchar code dispcode[]={ 0x7e,0x30,0x6d,0x79, // 共阴极显示代码。0~3 0x33,0x5b,0x5f,0x70, //4~7 0x7f,0x7b,0x4e,0x63,0x00//8,9, c,o, bank }; //不带小数点编码 uchar code table[]= { 0xfe,//0.

数码管驱动方式选择

数码管的几种驱动方式汇总 这段时间做数码管的电路,所以就专门整理了一下数码管的驱动IC和相关问题,集中发在这里便于学习。 数码管的显示方式可以分为动态和静态的。 动态的也叫扫描方式,是利用发光二极管的余辉效应和人眼的视觉暂留效应来实现的,只要在在一定时间内数码管的笔段亮的频率够快,人眼就看不出闪烁,一般外围硬件较少,但是对单片机资源耗用巨大。 静态的也较锁存方式,单片机送出数据后控制外围锁存器件锁存数据,这样数码管笔段里的电流不变,数码管稳定显示,这样单片机可以干别的活不用管数码管了。这种方案的优点是对单片机的P口资源和时间耗用很少,但是数码管的外围辅助电路复杂。 前些日子又发现了一种新的驱动方式,使用专门的驱动IC,单片机发送完数据就控制锁存,由芯片完成数码管动态扫描显示,一般使用串行接口,占用单片机资源最少,而且数码管还能实现左右循环移动等效果,显示稳定,消隐效果比较好。 下面分别结合这些芯片归纳一下数码管的驱动方案。 1、不需要芯片的驱动方式,扫描显示 这种方式a~g和DP一共8根线分别占用单片机8个端口线,一般是一整个P口,然后有几位数码管就另外需要几个控制线作为片选。对于MCU的时间占用几乎是全时的,如果没有其他的任务或者其他的任务耗用时间很少可以考虑这种显示方式,比如时钟、温度计等等。 2、宝刀未老74LS164 这是一片带锁存的串入并出芯片,需要占用单片机的2或3根线,MR为输出状态清除,本

身驱动电流不大,驱动LED需要另外加三极管或者驱动芯片。 如果需要多位驱动,一般使用74HC138这样的译码器进行快速线选,一样实现扫描显示,对单片机端口的耗用比较少,但是因为是扫描方式所以对单片机时间耗用还是全时的。 3、串行驱动MAX7219 按说这是驱动LED数码管最理想的一个芯片了,从典型应用电路上看外围元件极少,直接驱动,最吸引人的是使用了串行接口,只要三根线就可以驱动多大8位的数码管,而且可以送数据后就不用管了,自己消零消隐,可惜的就是太贵了,市场价都在20多RMB以上,比起LS164的一块多钱显得不合算。 另外有用过整个IC朋友说,如果有的地方考虑的不周全,很容易出现显示崩溃问题,必须重新上电才可以解决,我没有用过没有发言权,只是提个醒儿,呵呵。 PDF下载地址:https://www.360docs.net/doc/0510579929.html,/getds.cfm/qv_pk/1339/ln/cn 4、串行驱动HD7279、BC7281、ZLG7289、ZLG7290、WH8280

单片机时钟设计MAX7219驱动数码管

#include #define uchar unsigned char #define uint unsigned int sbit DIN=P0^1; //"显示串行数据输入端" sbit LOAD=P0^2; //"显示数据锁存端" sbit CLK=P0^3; //"显示时钟输入端" #define DecodeMode 0x09 //"译码模式" #define Intensity 0x0a //"亮度" #define ScanLimit 0x0b //"扫描界限" #define ShutDown 0x0c //"掉电模式" #define DisplayTest 0x0f //"显示测试" uchar code seg_data[]={0x7E,0x30,0x6D,0x79,0x33, 0x5B,0x5F,0x70,0x7F,0x7B}; //"0,1,2,3,4,5,6,7,8,9" uchar disp_buf[5]; uchar code bit_tab[]={0x01,0x02,0x03,0x04}; uchar hour=12,min=0,sec=0,count=0; bit flag; void delay (uint a) //" 毫秒延时函数" { uint i; while( --a != 0) { for(i = 0; i < 110; i++); } } void write_max7219_byte(uchar temp) { uchar i; for(i=0;i<8;i++) { CLK=0; DIN=(bit)(temp&0x80); temp<<=1; CLK=1; } } void write_max7219(uchar address,uint dat) { LOAD=0; write_max7219_byte(address); write_max7219_byte(dat); LOAD=1; } void Init_max7219 (void)

MAX7219共阴极LED驱动器程序

MAX7219共阴极LED数码管显示驱动 (一)、MAX7219 MAX7219是一种串入、并出的共阴极LED数码管显示驱动器,每片可驱动8位LED数码管显示,与单片机的接口只需3根线,内带BCD译码器,及显示测试、移位、锁存器等,输出电流达40mA,外围只需一只亮度调整电阻。 MAX7219引脚图 1、引脚功能说明 DIN:串行数据输入端,CLK的上升沿时数据被载入内部16位移位寄存器中 CLK:串行时钟输入端,最高工作频率可达10MHz LOAD:片选端,低电平接收DIN端的数据,高电平时数据被所存 DIG0~7:LED的位控制端 A~DP:LED的端控制端 DOUT:串行数据输出端,用于芯片的级联 ISET:硬件亮度调整端,在该引脚与VCC之间跨接一个电阻,LED的亮度即可通过该电阻来调节,流过LED的段驱动平均电流为流过此电阻电流的100倍,此电阻值范围为:10~80K之间。 2、内部寄存器说明 A、译码方式选择寄存器地址:09H 赋值:FFH 表示使用MAX7219内部的BCD译码器 00H 表示不使用MAX7219内部的BCD译码器 B、亮度调节寄存器地址:0AH 赋值:00H~0FH 可改变MAX7219所驱动的LED的亮度,其变化范围在1/32~31/32之间 C、扫描位数设定寄存器地址:0BH 赋值:00H 所有位不显示 01H~07H 依次对应于1~8位及前面位全部显示(即需显示的位应为“1”) D、待机模式开关寄存器地址:0CH 赋值:00H LED全灭 01H LED正常显示 E、显示器测试寄存器地址:0FH

F、8位LED显示数据寄存器地址:01H~08H 对这些寄存器赋值(即需显示的内容),就会在对应的1~8位LED数码管上显示出来 3、使用注意事项 由于电源中杂波或附近的电磁等干扰信号,使MAX7219在上电后不显示或乱显示;为了消除这种现象 应在MAX7219的VCC端与地之间接一只104pf的瓷片电容,在LOAD端于地之间接一只10K的电阻。最号还在电源与MAX7219的VCC端之间串一只去高频的电感。 而在电源方面,最好使用变压器供电,而不要用开关电源供电。 加在DIN引脚上的串行数据必须在LOAD脚为低电平时,以每2字节一次,在SCK脚信号的每个上升沿移入1位数据,且高位在前低位在后,然后在LOAD信号的上升沿MAX7219所存数据。 LED数码管引脚图如下:

max7219使用详解

Max7219驱动程序 一般的MCU因IO脚驱动能力不够,再加之MCU IO口资源有限,产品开发中通常是通过专门的驱动IC来驱动数码管。 7.1 学会看Datasheet MAX7219就是一款可以同时驱动8个数码管的IC。下图是其引脚图及典型应用电路:

我们的CPU只须三根线就可以控制MAX7219,这三根线是: DIN(第一脚),CS(第12脚),CLK(第13脚)。 DIN是数据输入脚,我们要显示的数据就是通过这根线发送到MAX7219的; CS是片选脚,MCU通过把该脚电平拉低来选中MAX7219,或者说MAX7219通过判断该引脚是否为低电平来使能该芯片。 CLK是时钟引脚,该时钟频率是MCU给到MAX7219的,MCU与7219之间的通信频率就根据该信号做基准。

7.2 MAX7219数据格式 我们要让8个数码管显示"12345678",这个过程是怎么实现的呢? 首先,要搞清楚MAX7219的数据格式,看图: MAX7219是以16位数据接收和发送的,也就是MCU传给MAX7219的数据必须是16位。下面分析这16位数据格式: D15~D12为X:表示可以为任意值,因为这四位MAX7219目前还用不到。 D11~D8为ADDRESS:表示MAX7219的地址。 D7~D0为DATA,并且位7为高位(最先发送),位0位低位(最后发送)。 也就是当MCU向MAX7219发送一个16位数据时,其中的D11~D8表示选择MAX7219哪个地址,即数据D7~D0是送到该地址的。 7.3 地址译码 MAX7219可以挂8个数码管,MCU是怎么把数据显示到指定的数码管的呢?这就要理解MAX7219的地址译码原理。下图为MAX7219的地址映射图:

MAX7219中文资料_驱动_点阵原理图

MAX7219芯片驱动8个数码管;STM32和DS1302结合,获得实时时钟,并显示在数码管上;两个LED指示系统的当前的工作模式注意:闹钟的具体功能未实现,可自行设计添加。全灭为默认模式0,实时获取时间并显示; 左亮右灭为模式1,为设置时间模式,按前三个按键可以修改对应的时分秒;左灭右亮为模式2,为设置闹钟模式; MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。。它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。MAX7219的外部引脚分配如图1所示及内部结构如图2所示。 图1 MAX7219的外部引脚分配

图2 MAX7219的内部引脚分配 各引脚的功能为: DIN:串行数据输入端 DOUT:串行数据输出端,用于级连扩展 LOAD:装载数据输入 CLK:串行时钟输入 DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流 SEG A~SEG G DP 7段驱动和小数点驱动 ISET:通过一个10k电阻和Vcc相连,设置段电流 MAX7219有下列几组寄存器:(如图3) MAX7219内部的寄存器如图3,主要有:译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。编程时只有正确操作这些寄存器,MAX7219才可工作。

数码管的几种驱动方式汇总

数码管的几种驱动方式汇总 数码管的显示方式可以分为动态和静态的。 动态的也叫扫描方式,是利用发光二极管的余辉效应和人眼的视觉暂留效应来实现的,只要在在一定时间内数码管的笔段亮的频率够快,人眼就看不出闪烁,一般外围硬件较少,但是对单片机资源耗用巨大。 静态的也较锁存方式,单片机送出数据后控制外围锁存器件锁存数据,这样数码管笔段里的电流不变,数码管稳定显示,这样单片机可以干别的活不用管数码管了。这种方案的优点是对单片机的P口资源和时间耗用很少,但是数码管的外围辅助电路复杂。 前些日子又发现了一种新的驱动方式,使用专门的驱动IC,单片机发送完数据就控制锁存,由芯片完成数码管动态扫描显示,一般使用串行接口,占用单片机资源最少,而且数码管还能实现左右循环移动等效果,显示稳定,消隐效果比较好。 下面分别结合这些芯片归纳一下数码管的驱动方案。 1、不需要芯片的驱动方式,扫描显示 这种方式a~g和DP一共8根线分别占用单片机8个端口线,一般是一整个P口,然后有几位数码管就另外需要几个控制线作为片选。对于MCU的时间占用几乎是全时的,如果没有其他的任务或者其他的任务耗用时间很少可以考虑这种显示方式,比如时钟、温度计等等。 2、宝刀未老74LS164 这是一片带锁存的串入并出芯片,需要占用单片机的2或3根线,MR为输出状态清除,本身驱动电流不大,驱动LED需要另外加三极管或者驱动芯片。 如果需要多位驱动,一般使用74HC138这样的译码器进行快速线选,一样实现扫描显示,对单片机端口的耗用比较少,但是因为是扫描方式所以对单片机时间耗用还是全时的。

3、串行驱动MAX7219 按说这是驱动LED数码管最理想的一个芯片了,从典型应用电路上看外围元件极少,直接驱动,最吸引人的是使用了串行接口,只要三根线就可以驱动多大8位的数码管,而且可以送数据后就不用管了,自己消零消隐,可惜的就是太贵了,市场价都在20多RMB以上,比起LS164的一块多钱显得不合算。 另外有用过整个IC朋友说,如果有的地方考虑的不周全,很容易出现显示崩溃问题,必须重新上电才可以解决,我没有用过没有发言权,只是提个醒儿,呵呵。 PDF下载地址:https://www.360docs.net/doc/0510579929.html,/getds.cfm/qv_pk/1339/ln/cn 4、串行驱动HD7279、BC7281、ZLG7289、ZLG7290、WH8280

MAX7219驱动数码管显示

MAX7219驱动数码管显示 一:实验目的 1,熟悉程序的编译、下载方法和过程; 2,熟悉利用max7219驱动数码管显示; 二:实验内容 使用MAX7219驱动数码管显示(可参考单片机程序文件夹中数码管显示键盘值文件中的内容); 三:实验步骤 1,设计硬件电路,焊制电路板,连接相关电路; 2,观察给定程序所实现的功能; 3,按照设定的功能修改程序编译程序,下载并调试程序; 四:程序与其相关说明 #include #define uchar unsigned char #define uint unsigned int #include #include #include sbit BUZZ=P1^3; /******************************************************************** * 名称: Main() * 功能: 主函数 ***********************************************************************/ void Main() { init_7219(); //对max7219初始化 init_ds12887(); //对ds12887初始化 //set_time(); set_alarm(); while(1) { P2=0xf0; if((P2&0xf0)!=0xf0) { keyscan(); if(key==0) { if ((DS_C & 0x10) != 0) //显示时间 { crt_timenyr();

基于mega16 max7219数码管显示

基于Mega16、Max7219数码管显示 此设计通过codevision A VR 编程软件向导生成SPI基本程序,选用mega16 SPI第三种工作模式进行数据传输,首先通过向Max7219控制器写入工作模式(下文介绍),之后再向Max 7219写需要显示的数据(下文介绍),在写入需要显示的内容中采用数组形式简单易用。 Max7219工作模式 MAX7219采用串行接收数据,在传送的串行数据中包含有RAM的地址。按照时序要求,单片机将16位二进制数逐位发送到DIN端,在CLK上升沿到来之前DIN必须有效,在CLK的每个上升沿,DIN被串行逐位移入MAX7219内部的16位串行寄存器中。设最先移入的数据是D15,最后移入的数据是D0, ⑴显示RAM(地址:*1—*8) 接到DIG0引脚的显示器显示地址为*1H的RAM中的数据,接到DIG1引脚的显示器显示地址为*2H的RAM中的数据,如此类推。 ⑵译码方式寄存器(地址:*9H) 该寄存器的8位二进制数的各位值分别控制着8个LED显示的译码方式。当该位为1时选择相应的显示位位BCD码模式,为0时选择不译码。小数点不译码,它由显示数据的D7位控制,D7=1时小数点亮,D7=0时小数点不亮。 ⑶扫描界限寄存器(地址:*BH) 该寄存器的D0—D3位数据设定值为0—7H。设定值表示显示器动态扫描个数为1—8。 ⑷停机寄存器(地址:*CH) 该寄存器的D0=0时,MAX7219处于停机状态;当D0=1时,处于正常工作状态。 ⑸显示测试寄存器(地址:*FH) 当该寄存器的D0=0时,MAX7219按设定模式正常工作;当D0=1时,处于测试状态,在测试状态下,不管MAX7219处于什么模式,全部LED将按最大亮度接通显示。 ⑹亮度寄存器(地址:*AH)及亮度的调节与控制 LED的亮度可通过硬件和软件两种方式调节或控制。 硬件调节 在V+和ISET之间外接电阻RSET,可控制LED段电流,达到硬件调节LED亮度的目的。 LED亮度的程控 亮度寄存器中的D0—D3位可以控制LED显示器的亮度。该寄存器可按其地址

avr单片机驱动max7219的程序

avr单片机驱动max7219的程序 #include; #include; #define uchar unsigned char #define uint unsigned int //定义输出io口 #define Y1_OUT DDRC|=BIT(5); #define Y1_H PORTC|=BIT(5); #define Y1_L PORTC&=~BIT(5); #define Y2_OUT DDRD|=BIT(6); #define Y2_H PORTD|=BIT(6); #define Y2_L PORTD&=~BIT(6); #define Y3_OUT DDRD|=BIT(7); #define Y3_H PORTD|=BIT(7); #define Y3_L PORTD&=~BIT(7); #define Y4_OUT DDRB|=BIT(0); #define Y4_H PORTB|=BIT(0);

#define Y4_L PORTB&=~BIT(0); #define Y5_OUT DDRC|=BIT(4); #define Y5_H PORTC|=BIT(4); #define Y5_L PORTC&=~BIT(4); #define Y6_OUT DDRB|=BIT(1); #define Y6_H PORTB|=BIT(1); #define Y6_L PORTB&=~BIT(1); //ad求平均的个数 #define N 3 //数码管亮度调节0x00-0xff #define P 0x01 uint t1,t2,t3,t4,tt1,tt2,tt3,tt4; uint addata,adc; uchar g1,g2,g3,g4; ///////////////////////////////////////////////// /////////////////////////////// void port_init() { DDRC&=BIT(0)&BIT(1)&BIT(2)&BIT(3);//AD转换口设置为输入、无上拉

相关主题
相关文档
最新文档