📄 max7219.c
字号:
/************************************************************************/
/* */
/* 7 Segment Driver MAX7219 */
/* */
/* */
/* */
/* right seg is named first seg */
/************************************************************************/
#include "reg52.h"
#include "typedef.h"
#include "function.h"
#include "define.h"
#include "varible.h"
sbit DISP_CS = P3^5;
sbit DISP_OUT = P3^3;
sbit DISP_CLK = P1^6;
/***************************************/
/* functoion declare */
/***************************************/
void Disp_init(void);
void Disp_write( unsigned int disp_data);
void Get_dispdata(float disp_fdata);
void Convert_data(unsigned char j,unsigned char seg_data);
void Disp_out( void );
void Clear_disp_memory(void);
void Convert_hdata(unsigned long int temp_data);
void Convert_ldata(unsigned int temp_data);
const unsigned char code dp_blink_potion[]=
{ 0x00,0x02,0x04,0x08 } ;
/***************************************/
const unsigned char code disp_data[]=
{ 0x7e, //led disp 0
0x30, //led disp 1
0x6d, //led disp 2
0x79, //led disp 3
0x33, //led disp 4
0x5b, //led disp 5
0x5f, //led disp 6
0x70, //led disp 7
0x7f, //led disp 8
0x7b //led disp 9
}; //0--9
/**************************************/
/* varible declare */
/**************************************/
void Disp_init(void)
{
unsigned char i ;
disp_mode = PARA_DISP ;
disp_mode_old = disp_mode ;
disp_no_u = 0 ;
disp_time = 0 ;
DISP_CLK = 0;
DISP_CS = 0;
Disp_write( 0x0900 ); // no decode for digits7-0
Disp_write( 0x0B06 ); // 7 Digits /last digit si alarm led
Disp_write( 0x0C01 ); // normal operation
Disp_write( 0x0F00 ); // Testmode off
Disp_write( 0x0A04 ); // 9/32 Bright
for(i=0;i<7;i++)
disp_memory[i] = disp_BLANK ;
Disp_out();
}
/**************************************/
/**************************************/
void Disp_write( unsigned int disp_data )
{
unsigned char i = 16;
DISP_CS = 0; //MAX chip valid
do
{
DISP_OUT = disp_data & 0x8000;
disp_data <<= 1;
DISP_CLK = 1;
DISP_CLK = 0;
} while( --i );
// DISP_OUT = 0;
DISP_CS = 1; //invalid
}
/**************************************/
/**************************************/
/**********************************************/
/* disp_memory */
/**********************************************/
void Get_dispdata(float disp_fdata)
{
unsigned char disp_byte ;
unsigned char i;
if( disp_fdata == 0)
{
for(i=0;i<4;i++)
{
disp_memory[i] = disp_0 ;
if((dp_point == i)&&(i!=0))
disp_memory[i]|=disp_DP;
}
return;
}
if(dp_point == ONE_BIT )
disp_fdata *= 10.0 ;
else if(dp_point == TWO_BIT )
disp_fdata *= 100.0 ;
else if(dp_point == THREE_BIT)
disp_fdata *= 1000.0 ;
i=0;
while(i<6)
{
disp_byte = (unsigned long int)disp_fdata%10; //get disp (seg) data
Convert_data(i,disp_byte);
i++;
disp_fdata /= 10.0 ;
}
return;
}
/*********************************************/
/*********************************************/
void Convert_data(unsigned char j, unsigned char seg_data)
{
if(seg_data <= 9)
disp_memory[j] = disp_data[seg_data];
if((j != 0)&&(dp_point ==j ))
disp_memory[j] |= disp_DP ; //disp DP
return;
}
/*************************************************/
/*************************************************/
void Disp_out(void)
{
unsigned char data i;
unsigned int byte ;
unsigned int disp_seg ;
/* repeat reset 7219 interface /2004-07-24 */
Disp_write( 0x0900 ); // no decode for digits7-0
Disp_write( 0x0B06 ); // 7 Digits /last digit si alarm led
Disp_write( 0x0C01 ); // normal operation
Disp_write( 0x0F00 ); // Testmode off
Disp_write( 0x0A04 ); // 9/32 Bright
/* 2004-07-24 over */
disp_seg = 0x100 ; //seg0-seg6
for(i=0;i<7;i++)
{
byte = disp_memory[i] + disp_seg ;
Disp_write(byte) ;
disp_seg = disp_seg + 0x100 ; //next seg
}
}
/************************************************/
/************************************************/
/************************************************/
/************************************************/
void Clear_disp_memory(void)
{
unsigned char i ;
for(i=0;i<7;i++)
disp_memory[i] = disp_BLANK;
return;
}
/**************************************/
/*************************************/
void Convert_hdata(unsigned long int temp_data)
{
unsigned char i,disp_code;
if(temp_data <= 99999)
{
for(i=0;i<5;i++)
{
disp_code = temp_data%10 ;
if(disp_code <= 9)
disp_memory[i]=disp_data[disp_code];
temp_data=(unsigned int)(temp_data/10);
}
}
return;
}
/*********************************/
/*********************************/
void Convert_ldata(unsigned int temp_data)
{
unsigned char i,byte;
if(temp_data <= 9999)
{
for(i=0;i<6;i++)
{
byte=temp_data%10;
Convert_data(i,byte);
temp_data=temp_data/10;
}
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -