|
/*------------------------------------------------------
用ATMAGE16L驱动MAX7219
2006年2月18日,原创
2006年6月10日小作修改
2006年7月11日,重新整理
从左至右分别为1到8位,分为左右各4位分别使用
没有小数点功能,如果要使用小数点可将操作数和0X80求或,可另外写函数封装
译码方式初始化为"使用BCD译码方式"
特殊字符 -:0A; E:0B; H:0C; L:0D; P:0E; 黑屏:0F
--------------------------------------------------------*/
/*----------MAX7219操作指令--------------
----------功能--------|---指令---|--------操作数--------|
1、BCD译码方式选择 | 0x09 |0x00:不使用,0xff:使用|
2、亮度调节 | 0x0a |0x00------0x0f,16级 |
3、扫描位数设定 | 0x0b |0x00------0x07,1--8位 |
4、待机开关 | 0x0c |0x00:灭,0x01:开 |
5、显示器检测 | 0x0f |0x01:检测,0x00:不检测|
6、位操作指令 |0x01--0x08|要显示的数字 |
-----------------------------------------*/
#include <avr/io.h>
//------max7219与M16的连接,可根据实际更改--------
#define MAX7219_OUT_DDR DDRB
#define MAX7219_OUT_PORT PORTB
#define MAX7219_LOAD_PORT PA2
#define MAX7219_DIN_PORT PA3
#define MAX7219_CLK_PORT PA4
//----------------------------------------------------------------
//------------------------------------------------------------
#define MAX7219_CLK_1 MAX7219_OUT_PORT|=1<<MAX7219_CLK_PORT
#define MAX7219_CLK_0 MAX7219_OUT_PORT&=~(1<<MAX7219_CLK_PORT)
#define MAX7219_DIN_1 MAX7219_OUT_PORT|=1<<MAX7219_DIN_PORT
#define MAX7219_DIN_0 MAX7219_OUT_PORT&=~(1<<MAX7219_DIN_PORT)
#define MAX7219_LOAD_1 MAX7219_OUT_PORT|=1<<MAX7219_LOAD_PORT
#define MAX7219_LOAD_0 MAX7219_OUT_PORT&=~(1<<MAX7219_LOAD_PORT)
//-----------------------------------------------------------------
//===================MAX7219的核心函数,接收单片机的数据=====================
void SEND(unsigned char add,unsigned char dat)//发送2个字节的子函数,第一个字节为地址,第二个字节为操作数
{
unsigned char ads,j,x;
unsigned int i;
i=0;
MAX7219_LOAD_0;//load=0
while(i<16)
{
if (i<8){ads=add;}
else {ads=dat;}
for(j=8;j>=1;j--)
{
x=ads&0x80;
if (x==0){MAX7219_DIN_0;}
else {MAX7219_DIN_1;}
ads=ads<<1;
MAX7219_CLK_1;//clk=1
MAX7219_CLK_0;//clk=0
}
i=i+8;
}
MAX7219_LOAD_1;//load=1
}
//========================================================================
//==============LCD初始化=============
void LCD_INIT(void)
{
MAX7219_OUT_DDR|=(1<<MAX7219_CLK_PORT)|(1<<MAX7219_DIN_PORT)|(1<<MAX7219_LOAD_PORT);
MAX7219_OUT_PORT|=(1<<MAX7219_CLK_PORT)|(1<<MAX7219_DIN_PORT)|(1<<MAX7219_LOAD_PORT);
SEND(0x0c,0x01);
SEND(0x0b,0x07);
SEND(0x0a,0x05);
SEND(0x09,0xff);
//LCD_CLEAR(3);
}
//=====================================
//=============LCD左四显示数字==============
void LCD_L(int number)
{
int i=4;
SEND(0x01,0x0f); //先清除左四位,左四位黑屏
SEND(0x02,0x0f);
SEND(0x03,0x0f);
SEND(0x04,0x0f);
if(number>9999)//要显示的数值超过4位,则显示4个H
{
SEND(0x01,0x0c);
SEND(0x02,0x0c);
SEND(0x03,0x0c);
SEND(0x04,0x0c);
}
else//小于四位可以显示
{
do
{
SEND(i,number%10);
number=(number-number%10)/10;
i--;
}while(number>=1);
}
}
//=====================================
//=============LCD右四显示数字==============
void LCD_R(int number)
{
int i=8;
SEND(0x05,0x0f); //先清除右四位,右四位黑屏
SEND(0x06,0x0f);
SEND(0x07,0x0f);
SEND(0x08,0x0f);
if(number>9999)//要显示的数值超过4位,则显示4个H
{
SEND(0x05,0x0c);
SEND(0x06,0x0c);
SEND(0x07,0x0c);
SEND(0x08,0x0c);
}
else//小于四位可以显示
{
do
{
SEND(i,number%10);
number=(number-number%10)/10;
i--;
}while(number>=1);
}
}
//===================================
//==============LCD亮度================
void LCD_LIGHT(unsigned light)
{
SEND(0x0a,light&0x0f);
}
//===================================
//==============LCD开================
void LCD_OPEN(void)
{
SEND(0x0c,0x01);
}
//===================================
//==============LCD关================
void LCD_CLOSE(void)
{
SEND(0x0c,0x00);
}
//===================================
//==============LCD清屏================
void LCD_CLEAR(unsigned char part)
{
switch(part)
{
case 0://左
{
SEND(0x01,0x0f);
SEND(0x02,0x0f);
SEND(0x03,0x0f);
SEND(0x04,0x0f);
}break;
case 1://右
{
SEND(0x05,0x0f);
SEND(0x06,0x0f);
SEND(0x07,0x0f);
SEND(0x08,0x0f);
}break;
default://全部
{
SEND(0x01,0x0f);
SEND(0x02,0x0f);
SEND(0x03,0x0f);
SEND(0x04,0x0f);
SEND(0x05,0x0f);
SEND(0x06,0x0f);
SEND(0x07,0x0f);
SEND(0x08,0x0f);
}break;
}
}
//=====================================
找到了我的热转印图后也发上来 |
|