打印

【GD32评测】二、MAX7219

[复制链接]
1088|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 Cjy_JDxy 于 2020-4-27 18:52 编辑

今天搞了一下MAX7219
DIN:PB8
LOAD:PB7
CLK:PB6
原理图:

代码:
#include "gd32e23x.h"
#include "gd32e231c_start.h"
#include "systick.h"

#define uchar unsigned char
#define uint unsigned int
        
void led_config(void);
void led_flash(int times);

#define CLK_PIN                         GPIO_PIN_6
#define CLK_GPIO_PORT                   GPIOB
#define CLK_GPIO_CLK                    RCU_GPIOB

#define LOAD_PIN                         GPIO_PIN_7
#define LOAD_GPIO_PORT                   GPIOB
#define LOAD_GPIO_CLK                    RCU_GPIOB

#define DIN_PIN                         GPIO_PIN_8
#define DIN_GPIO_PORT                   GPIOB
#define DIN_GPIO_CLK                    RCU_GPIOB

#define CLK_0           GPIO_BC(CLK_GPIO_PORT) = CLK_PIN
#define CLK_1           GPIO_BOP(CLK_GPIO_PORT) = CLK_PIN
#define LOAD_0          GPIO_BC(LOAD_GPIO_PORT) = LOAD_PIN
#define LOAD_1          GPIO_BOP(LOAD_GPIO_PORT) = LOAD_PIN
#define DIN_0           GPIO_BC(DIN_GPIO_PORT) = DIN_PIN
#define DIN_1           GPIO_BOP(DIN_GPIO_PORT) = DIN_PIN

#define NoOp   0x00           //空操作寄存器
#define Digit0 0x01           // 数码管1寄存器
#define Digit1 0x02           // 数码管2寄存器
#define Digit2 0x03           // 数码管3寄存器
#define Digit3 0x04           // 数码管4寄存器
#define Digit4 0x05           // 数码管5寄存器
#define Digit5 0x06           // 数码管6寄存器
#define Digit6 0x07           // 数码管7寄存器
#define Digit7 0x08           // 数码管8寄存器

#define DecodeMode 0x09       // 译码模式寄存器
#define Intensity 0x0a        // 亮度寄存器
#define ScanLimit 0x0b        // 扫描位数寄存器
#define ShutDown 0x0c         // 低功耗模式寄存器

#define DisplayTest 0x0f      // 显示测试寄存器
#define ShutdownMode 0x00     // 低功耗方式
#define NormalOperation 0x01  // 正常操作方式
#define ScanDigit 0x07        // 扫描位数设置,显示8位数码管
#define DecodeDigit 0xff      // 译码设置,8位均为BCD码
#define IntensityGrade 0x0a   // 亮度级别设置
#define TestMode 0x01         // 显示测试模式
#define TextEnd 0x00          // 显示测试结束,恢复正常工作模式

/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
uchar DisBuffer[8]={0,0,0,0,0,0,0,0};    // 显示缓存区
//******************延时t毫秒**************************************
void delay(uint t)
{
       uint i;
       while(t--)
       {
              /* 对于12M时钟,约延时1ms */
              for (i=0;i<125;i++)
              {}
       }
}
//*************向MAX7219写入字节(8位)********************
void SendChar (uchar ch)
{
    uchar i,temp;
    delay(1);
    for (i=0;i<8;i++)
    {
         temp=ch&0x80;
         ch=ch<<1;
         if(temp)
         {
            DIN_1;
            CLK_0;
            CLK_1;
         }
         else
         {
            DIN_0;
            CLK_0;
            CLK_1;
         }
    }
}
//**************向MAX7219写入字(16位)*****************************
void WriteWord (uchar addr,uchar num)
{
    LOAD_0;
    delay(1);
    SendChar(addr);
    delay(1);
    SendChar(num);
    delay(1);
    LOAD_1;                            // 锁存进相应寄存器
}
//*********************** MAX7219初始化 ******************
void InitDisplay (void)
{
    WriteWord (ScanLimit,ScanDigit);         // 设置扫描界限
    WriteWord (DecodeMode,DecodeDigit);      // 设置译码模式
    WriteWord (Intensity,IntensityGrade);    // 设置亮度
    WriteWord (ShutDown,NormalOperation);    // 设置为正常工作模式

}

void MAX7219_GPIO_init(void)
{
    /* enable the led clock */
    rcu_periph_clock_enable(RCU_GPIOB);
    /* configure led GPIO port */
    gpio_mode_set(CLK_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, CLK_PIN);
    gpio_output_options_set(CLK_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, CLK_PIN);
                gpio_mode_set(LOAD_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LOAD_PIN);
    gpio_output_options_set(LOAD_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LOAD_PIN);
                gpio_mode_set(DIN_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, DIN_PIN);
    gpio_output_options_set(DIN_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, DIN_PIN);
    //GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum];
}
/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    /* initialize KEY and LED, configure SysTick */

    led_config();
    systick_config();

    /* flash the LED for test */
    led_flash(1);
                MAX7219_GPIO_init();
                InitDisplay (); // MAX7219初始化
    WriteWord(DisplayTest,TestMode);  // 开始显示测试,点亮所有LED
    delay(1500);                      // 延时约1.5s
    WriteWord (DisplayTest,TextEnd);  // 退出显示测试模式
    WriteWord (Digit0,0);
    WriteWord (Digit1,1);
    WriteWord (Digit2,2);
    WriteWord (Digit3,3);


    while(1){
    }
}

/*!
    \brief      configure the LEDs
    \param[in]  none
    \param[out] none
    \retval     none
  */
void led_config(void)
{
    gd_eval_led_init(LED1);
}




/*!
    \brief      flash the LED for test
    \param[in]  times: times to flash the LED
    \param[out] none
    \retval     none
*/
void led_flash(int times)
{
    int i;
    for (i = 0;i < times;i++){
        /* delay 500 ms */
        delay_1ms(500);
        /* toggle the LED */
        gd_eval_led_toggle(LED1);

        /* delay 500 ms */
        delay_1ms(500);
        /* toggle the LED */
        gd_eval_led_toggle(LED1);
    }
}

效果图:

MAX7219模块是我自己做的,原理图:

工程:
MAX7219.rar (600.49 KB)

使用特权

评论回复
沙发
21ic小喇叭| | 2020-4-28 11:02 | 只看该作者
感谢您写了2篇评测,给您寄份小礼品,以后也多多支持二姨家哦!

使用特权

评论回复
板凳
Cjy_JDxy|  楼主 | 2020-4-28 11:55 | 只看该作者
21ic小喇叭 发表于 2020-4-28 11:02
感谢您写了2篇评测,给您寄份小礼品,以后也多多支持二姨家哦!

一定

使用特权

评论回复
地板
Sunriver_Yao| | 2020-4-29 14:14 | 只看该作者
本帖最后由 Sunriver_Yao 于 2020-4-29 14:22 编辑

[A]天朝那么多LED Driver,为何还选MAX7219?  不如:
    http://www.titanmec.com/index.php/product/lists/typeid/58.html
    来得爽!


[B]#define CLK_0 GPIO_BC(CLK_GPIO_PORT) = CLK_PIN 不如:
    #define SetClock(B)  B?(CLK_0 GPIO_BOP(CLK_GPIO_PORT) = CLK_PIN):(CLK_0 GPIO_BC(CLK_GPIO_PORT) = CLK_PIN) 然后:
    SetClock(0) or SetClock(1);...... 来得好!

使用特权

评论回复
5
Cjy_JDxy|  楼主 | 2020-4-29 14:35 | 只看该作者
Sunriver_Yao 发表于 2020-4-29 14:14
[A]天朝那么多LED Driver,为何还选MAX7219?  不如:
    http://www.titanmec.com/index.php/product/lists ...

1.我没有别的LED模块啊
2.感觉差不多,无所谓的事

使用特权

评论回复
6
HuangHongLun| | 2020-4-29 16:06 | 只看该作者
Sunriver_Yao 发表于 2020-4-29 14:14
[A]天朝那么多LED Driver,为何还选MAX7219?  不如:
    http://www.titanmec.com/index.php/product/lists ...

这个评论给力,不过我也确实是习惯第一种方式了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:绿水本无忧因风皱面,青山原不老为雪白头。

553

主题

3530

帖子

19

粉丝