#include "display.h"
//===================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(add==1||add==5) dat=dat|0x80; //小数点问题解决
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
}
//=====================================
//==============SEG亮度================
void SEG_LIGHT(unsigned light)
{
SEND(0x0a,light&0x0f);
}
//===================================
//==============SEG开================
void SEG_OPEN(void)
{
SEND(0x0c,0x01);
}
//===================================
//==============SEG关================
void SEG_CLOSE(void)
{
SEND(0x0c,0x00);
}
//===================================
//==============SEG清屏==============
void SEG_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;
}
}
//==============SEG初始化=============
void SEG_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);
SEG_CLEAR(3);
}
//=============SEG左四显示数字==============
void SEG_L(unsigned int number)
{
unsigned char 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//小于四位可以显示
{
/* for(i=4;i>0;i--)
{
SEND(i,number%10);
number=(number-number%10)/10;
} */
do
{
SEND(i,number%10);
number=(number-number%10)/10;
i--;
}while(number>=1);
}
}
//=====================================
//=============SEG右四显示数字==============
void SEG_R(unsigned int number)
{
unsigned char 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//小于四位可以显示
{
/* for(i=8;i>4;i--)
{
SEND(i,number%10);
number=(number-number%10)/10;
} */
do
{
SEND(i,number%10);
number=(number-number%10)/10;
i--;
}while(number>=1);
}
}
//===================================