开源了!奉上双MAX7219串联驱动16位数码管的GCC驱动程序!
/**********************************************************************************************************
* MAX7219驱动程序头文件
*
* All Rights Reserved
*
* V1.00
*
* File Name : max7219.h
* Developed By: Lv Gao Pan
* Email : lvgaopan@gmail.com
* Target MCU : ATMEGA16L
* Complier : gccavr 3.4.3 + gccavrlibc 1.2.3
* Develope Date : 2005.11.18
* Latest Change : 2005.12.05
* Note : 用于综合显示仪的双芯片串连驱动
*********************************************************************************************************
*/
#ifndef __MAX7219_H__
#define __MAX7219_H__
#include <avr/io.h>
// 寄存器地址定义
#define NO_OP 0x00
#define DECODE_MODE 0x09
#define INTENSITY 0x0a
#define SCAN_LIMIT 0x0b
#define SHUTDOWN 0x0c
#define DISP_TEST 0x0f
// 管脚定义
#define MAX7219_DIN PA7
#define MAX7219_CLK PD1
#define MAX7219_LOAD PD0
#define MAX7219_DIN_PORT PORTA
#define MAX7219_CLK_PORT PORTD
#define MAX7219_LOAD_PORT PORTD
// 端口操作宏定义
#define MAX7219_DIN_SET (MAX7219_DIN_PORT |= (1<<MAX7219_DIN))
#define MAX7219_DIN_CLR (MAX7219_DIN_PORT &= ~(1<<MAX7219_DIN))
#define MAX7219_CLK_SET (MAX7219_CLK_PORT |= (1<<MAX7219_CLK))
#define MAX7219_CLK_CLR (MAX7219_CLK_PORT &= ~(1<<MAX7219_CLK))
#define MAX7219_LOAD_SET (MAX7219_LOAD_PORT |= (1<<MAX7219_LOAD))
#define MAX7219_LOAD_CLR (MAX7219_LOAD_PORT &= ~(1<<MAX7219_LOAD))
// 函数原型
void max_init( void );
void display(unsigned char addr1,unsigned char data1,unsigned char addr2,unsigned char data2);
#endif
/*
*********************************************************************************************************
* MAX7219驱动程序
*
* All Rights Reserved
*
* V1.00
*
* File Name : max7219.c
* Developed By: Lv Gao Pan
* Email : lvgaopan@gmail.com
* Target MCU : ATMEGA16L
* Complier : gccavr 3.4.3 + gccavrlibc 1.2.3
* Develope Date : 2005.11.18
* Latest Change : 2005.12.05
* Note : 用于综合显示仪的双芯片串连驱动
*********************************************************************************************************
*/
#include "max7219.h"
void max_init(void)
{
unsigned char MAX7219_Loop;
display( INTENSITY, 0x03, INTENSITY, 0x03);
display( SCAN_LIMIT, 0x07, SCAN_LIMIT, 0x07 );
display( DECODE_MODE, 0xff, DECODE_MODE, 0xff );
display( SHUTDOWN, 0x01, SHUTDOWN, 0x01 );
for( MAX7219_Loop = 0; MAX7219_Loop < 8; MAX7219_Loop++ )
{
display(( MAX7219_Loop + 1 ), 0x0a, ( MAX7219_Loop + 1 ), 0x0a );
}
}
//IDDIS.PCB数码管分布示意
/*
addr2=4,addr2=3,addr2=2,addr2=1
addr2=8,addr2=7,addr2=6,addr2=5
addr1=8,addr1=7,addr1=6,addr1=5
addr1=4,addr1=3,addr1=2,addr1=1
*/
void display(unsigned char addr1,unsigned char data1,unsigned char addr2,unsigned char data2)
{
unsigned long Send_Data;
unsigned char Dis_Loop;
Send_Data= addr1;
Send_Data <<= 8;
Send_Data += data1;
Send_Data <<= 8;
Send_Data += addr2;
Send_Data <<= 8;
Send_Data += data2;
MAX7219_CLK_CLR;
MAX7219_LOAD_CLR;
for( Dis_Loop = 0; Dis_Loop < 32; Dis_Loop++ )
{
MAX7219_CLK_CLR;
if( Send_Data & 0x80000000 )
MAX7219_DIN_SET;
else
MAX7219_DIN_CLR;
Send_Data <<= 1;
MAX7219_CLK_SET;
}
MAX7219_LOAD_SET;
}
-----此内容被lvgaopan于2006-04-28,23:56:32编辑过
原理图在此
点击此处打开armok01116030.pdf
-----此内容被lvgaopan于2006-04-29,00:29:55编辑过 顶一下 感动中~~~~!
谢谢楼主~! MAX7219以前用51的时候做过,很久了,那时价格贵,普通的产品是不敢用的。 现在价格也贵,不过性能很稳定,一直在用它。 新手到!!!请问该程序的主函数怎么写!!!谢谢!!急啊 学习了 谢谢分享 {:handshake:}
页:
[1]