⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 max7219_function.c

📁 心电图测量程序,用单片机实现对心电信号的采集和显示及重现
💻 C
字号:
  
 
/******************************************************************************
MAX7219:

1.数据定义:
    | D15 D14 D13 D12 | D11 D10 D09 D08 | D07 D06 D05 D04 D03 D02 D01 D00 |
       *   *   *   *        [地址]                   [数据]

2. 时序图:
           CP0        CP1       ...      ...      CP14       CP15
           ____     ____      ____      ____      ____      ____     
CLK:  ____|    |____|    |____|    |____|    |____|    |____|    |_________

          D15        D14      .....     .....     D01        D00
DIN:  __=======____=======___=======___=======___=======___======__________
    
   ____                                                          __________ 
LOAD: |__________________________________________________________|

3. 寄存器地址定义:
    寄存器:                地址:        16进制    
   REGISTER       D15-D12   D11  D10  D09  D08      HEX
   NO-OP 非操作         * * * *   0    0    0    0       0x0
   DIGIT0 数码管0       * * * *   0    0    0    1       0x1
   DIGIT1 数码管1       * * * *   0    0    1    0       0x2
   DIGIT2 数码管2       * * * *   0    0    1    1       0x3
   DIGIT3 数码管3       * * * *   0    1    0    0       0x4
   DIGIT4 数码管4       * * * *   0    1    0    1       0x5
   DIGIT5 数码管5       * * * *   0    1    1    0       0x6
   DIGIT6 数码管6       * * * *   0    1    1    1       0x7
   DIGIT7 数码管7       * * * *   1    0    0    0       0x8
   译码方式        * * * *   1    0    0    1       0x9
   亮度控制             * * * *   1    0    1    0       0xA
   扫描范围             * * * *   1    0    1    1       0xB
   停机方式             * * * *   1    1    0    0       0xC
   显示测试             * * * *   1    1    0    1       0xD

****************************************************************************/
#include   "SPCE061V004.h"
//#define   IO_DATA     *P_IOA_Data  //设置输出口为IOA口
#define   IO_DATA     *P_IOB_Data  //设置输出口为IOB口
#define   LOAD        0x0004	   //io2
#define   CLK         0x0001       //io0
#define   DIN         0x0002       //io1
//#define LOAD        0x0002	   //io1,检测用
//#define CLK         0x0004       //io2,检测用
//#define DIN         0x0001       //io0,检测用
#define   Set_LOAD_Low    (IO_DATA &= ~LOAD )
#define   Set_LOAD_High   (IO_DATA |=LOAD)
#define   Set_CLK_Low     (IO_DATA &= ~CLK) 
#define   Set_CLK_High    (IO_DATA |= CLK) 
#define   Set_DIN_Low     (IO_DATA &= ~DIN) 
#define   Set_DIN_High    (IO_DATA |= DIN) 
/* 向 MAX7219 发送命令(16 bit) */
/*这是其他函数的公共函数,真正的应用函数在后面。*/
void    sent_LED( unsigned int n )
{
unsigned int     i;
    
    i = (unsigned char)( n );

    Set_CLK_Low;
    Set_LOAD_Low;
    Set_DIN_Low;

    for ( i=0x8000; i>=0x0001; i=i>>1 )
    {
     if ( ( n & i ) == 0 ) Set_DIN_Low;else Set_DIN_High;    
      Set_CLK_High;
      Set_CLK_Low;
    }
    Set_LOAD_High;
    
}
extern void sent_LED( unsigned int  );

/******************************************************************************
初始化 MAX7219 
******************************************************************************/
void    Init_MAX7219()
{
    sent_LED( 0x0C01 ); /* 置LED为正常状态 */
    sent_LED( 0x0A04 ); /* 置LED亮度为9/32 */
    sent_LED( 0x0B07 ); /* 置LED扫描范围DIGIT0-7 */
    sent_LED( 0x0900 ); /* 置LED显示为不译码方式 */
}

/******************************************************************************
清除显示: 
void    cls()
******************************************************************************/
void    cls()
{
unsigned int    i;
    for (i=0x0100; i<=0x0800; i+=0x0100 ) sent_LED( i ); /* DIGIT0-7 = 0 
*/
}

/* 定义显示数字0-9,E,H,L,P数组 */
unsigned int  LED_code_09[14]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B,0x4f,0x37,0x0e,0x67};
/* 定义显示位置L0-L7数组 */
unsigned int  LED_code_L07[8]=
{0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700,0x0800};
/******************************************************************************
显示数字0-9: 
void     LEDdisplay( uchar H, uchar n )
输入:    H 显示位置0-7 [7][6][5][4][3][2][1][0]
    n 显示数值0-9
    DP 显示小数点 1xxxxxxx :ON/0xxxxxxx:OFF
******************************************************************************/
void    LEDdisplay( unsigned char H, unsigned char n )
{
    if ( ( n & 0x80 ) == 0 )
    {
    sent_LED( LED_code_L07[ H ] | LED_code_09[ n ] );
    }
    else
    {
    sent_LED( LED_code_L07[ H ] | LED_code_09[ n & 0x7F ] | 0x80 );
    }
}
/******************************************************************************
函数:unsigned char  PointCTL(unsigned char );
功能:将段码经过加小数点处理,返回处理后段码
输入:段码Seg_Code,作为 LEDdisplay的参数,并且要用在紧靠 LEDdisplay之前
返回:经过加小数点控制的段码
******************************************************************************/
unsigned char  PointCTL(unsigned char segcode)
{
segcode|=0x80;
return(segcode);
}
/*******************************************************************************
函数:Intensity_CTL(unsigned char )
功能:亮度控制,控制量只能处于0-15之间
输入:亮度控制量
********************************************************************************/
void Intensity_CTL(unsigned char ctlword)
{
 if(ctlword<0xf)
    {
      ctlword|=0x0a00;
      sent_LED(ctlword );
    }
}
/******************************************************************************
函数:ScanLimit(unsigned char )
功能:显示位数控制,1-8可设制
输入:要显示的位数
*******************************************************************************/
void ScanLimit(unsigned char ctlchar)
{
if(ctlchar<=0x8)
    {
    ctlchar-=1;
    ctlchar|=0x0b00;
    sent_LED( ctlchar);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -