Hub12接口,P10两扫单元板的开发,显示函数是根据单元板的扫描逻辑进行编写

第一步:引脚的初始化

我用的是AT32F403a的芯片,如图配置引脚即可,因为是两扫的单元板(红色),所以有的引脚是没有用的真正有用的是OE、A、B、ST、CLK、R引脚。配置成推挽输出

void bsp_LED_Unit_board_init ( void )
{
    gpio_init_type gpio_init_struct;

    /* enable the led clock */

    crm_periph_clock_enable ( CRM_IOMUX_PERIPH_CLOCK, TRUE ); //复用时钟使能

    crm_periph_clock_enable ( CRM_GPIOB_PERIPH_CLOCK, TRUE );
    crm_periph_clock_enable ( CRM_GPIOD_PERIPH_CLOCK, TRUE );
    crm_periph_clock_enable ( CRM_GPIOC_PERIPH_CLOCK, TRUE );
    /* set default parameter */
    gpio_default_para_init ( &gpio_init_struct );

    /* configure the led gpio */
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
    gpio_init_struct.gpio_pins =  GPIO_PINS_7 | GPIO_PINS_6 | GPIO_PINS_5 ;
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
    gpio_init ( GPIOB, &gpio_init_struct );

    gpio_pin_remap_config ( SWJTAG_MUX_010, TRUE ); //禁用JTAG功能使能 SWD 功能, PB3 PB4用作普通IO
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
    gpio_init_struct.gpio_pins = GPIO_PINS_4 | GPIO_PINS_3 ;
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
    gpio_init ( GPIOB, &gpio_init_struct );

    /* configure the led gpio */
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
    gpio_init_struct.gpio_pins = GPIO_PINS_7 | GPIO_PINS_6 | GPIO_PINS_5;
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
    gpio_init ( GPIOD, &gpio_init_struct );

    /* configure the led gpio */
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
    gpio_init_struct.gpio_pins = GPIO_PINS_4 | GPIO_PINS_3 | GPIO_PINS_2 | GPIO_PINS_1 | GPIO_PINS_0;
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
    gpio_init ( GPIOD, &gpio_init_struct );

    /* configure the led gpio */
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
    gpio_init_struct.gpio_pins = GPIO_PINS_12 | GPIO_PINS_11 | GPIO_PINS_10;
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
    gpio_init ( GPIOC, &gpio_init_struct );

    OE2_1;
    OE1_1;
}

第二步:清屏函数

只是把数据引脚R拉低,然后往里面写入低电平即可,把所有点写完,锁存,然后在显示

void clear_scree_board1 ( void )
{
    int i;

    R1_0;
    OE1_1;

    for ( i = 0; i < 32 * 8 * led_board_num1; i++ ) //清屏
    {
        CLK1_0;
        delay_us ( 5 );
        CLK1_1;
    }

    ST1_1;
    delay_us ( 2 );
    ST1_0;
    delay_us ( 2 );
    OE1_0;//显示

}

第三步:写数据函数(一个字节一个字节的写)

static void writedata_led_board1 ( uint8_t data )
{
    int i;

    for ( i = 0; i < 8; i++ )
    {
        if ( data & 0x01 ) //高位在前,如果想低位在前使用(data&0x80)
        {
            R1_1;
        }
        else
        {
            R1_0;
        }

        CLK1_0;
        delay_us ( 1 );//必须要加一个延时
        CLK1_1;
        data = data >> 1;
    }
}

 第四步:显示字符汉字函数

这个函数是根据单元板的扫描逻辑进行编写的,我的板子的扫描逻辑如图所示,我嘴笨说不清楚

 我是把要显示的汉字字符放在一个大的数组里面,只要字模取得对,就可以显示,字模取模方式为:如果要显示12X12的汉字字符 :行列式,阴码,顺向,点阵大小12X16        

按理来说,显示16X16的汉字也可也显示,我没有测试,工作用不到

void display_12X12_board1 ( void )
{
    uint8_t row, lin;

   for ( row = 0; row < 2; row++ ) //2行
    {

        OE1_1;
        for ( int i = 0; i < led_board_num1; i++ ) //用于判断几块单元板连级,有几块写几遍,把所有单元板的行都写完,在进行换行,不然会显示错误
        {

            for ( int p = 0; p < 4; p++ ) //共有4个四列
            {
                for ( lin = 0; lin < 4; lin++ ) //4列
                {
                    for ( int zi = 0; zi < 2; zi++ ) //每列有两个字
                    {

                        uint8_t data;

                        if ( led_board_num1 == 1 )
                        {
                            data = display_board1.write_data_buff[48 - 16 * lin + 2 * zi + 4 * p +  row];
                            writedata_led_board1 ( data );

                        }

                        if ( led_board_num1 == 2 )
                        {
                            if ( i == 0 ) //写第二块屏上的字
                            {
                                data = display_board1.write_data_buff[112 - 16 * lin + 2 * zi + 4 * p +  row];
                                writedata_led_board1 ( data );
                            }


                            if ( i == 1 ) //写第一块屏上的字
                            {
                                data = display_board1.write_data_buff[48 - 16 * lin + 2 * zi + 4 * p +  row];
                                writedata_led_board1 ( data );
                            }
                        }

                        if ( led_board_num1 == 3 )
                        {

                            if ( i == 0 ) //写第三块屏上的字
                            {
                                data = display_board1.write_data_buff[176 - 16 * lin + 2 * zi + 4 * p +  row];
                                writedata_led_board1 ( data );

                            }


                            if ( i == 1 ) //写第二块屏上的字
                            {
                                data = display_board1.write_data_buff[112 - 16 * lin + 2 * zi + 4 * p +  row];
                                writedata_led_board1 ( data );
                            }

                            if ( i == 2 ) //写第一块屏上的字
                            {
                                data = display_board1.write_data_buff[48 - 16 * lin + 2 * zi + 4 * p +  row];
                                writedata_led_board1 ( data );
                            }
                        }
                    }
                }

            }
        }

        ST1_1;
        delay_us ( 1 );
        ST1_0;

        switch ( row )
        {
            case ( 1 ) : A1_0; B1_1 ; break;

            case ( 0 ) : A1_1; B1_0; break;
        }

        OE1_0;  //显示
        delay_us ( 10 ); //亮度调节,数值越大,led越亮  
    }
}
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/qq_52903152/article/details/130595040

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值