[AT32F423]【AT-START-F423测评】+ spi接口lcd显示

本文详细描述了一个基于Arduino的项目,通过SPI接口连接LCD模块,并提供了LCD初始化设置、SPI读写函数以及控制命令的实现,展示了如何在硬件平台上操作LCD进行图像显示和颜色控制。
摘要由CSDN通过智能技术生成

本次研究SPI接口的lcd显示测试。
自己做的一个lcd模块,使用arduino接口插在板子上。引脚使用
LCD SCK==PA5
LCD MISO = PA6
LCD MOSI = PA7
LCD CS = PA15
LCD DC = PC7
LCD BLK = PA9
 


开发板接口。

 



lcd模块接口
 


实物如上图。

下面初始化SPI.

复制

void drv_spi_gpio_init(void)

{

    gpio_init_type gpio_initstructure;

    spi_init_type spi_init_struct;

    

    crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);

    crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

    crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);

    crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);

    

    gpio_default_para_init(&gpio_initstructure);

    /* spi1 sck pin */

    gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;

    gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;

    gpio_initstructure.gpio_pull           = GPIO_PULL_UP;

    gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;

    gpio_initstructure.gpio_pins = GPIO_PINS_5;

    gpio_init(GPIOA, &gpio_initstructure);

    gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_5);



    /* spi1 miso pin */

    gpio_initstructure.gpio_pull           = GPIO_PULL_UP;

    gpio_initstructure.gpio_pins           = GPIO_PINS_6;

    gpio_init(GPIOA, &gpio_initstructure);

    gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE6, GPIO_MUX_5);



    /* spi1 mosi pin */

    gpio_initstructure.gpio_pull           = GPIO_PULL_UP;

    gpio_initstructure.gpio_pins           = GPIO_PINS_7;

    gpio_init(GPIOA, &gpio_initstructure);

    gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_5);

  

    spi_default_para_init(&spi_init_struct);

    spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;

    spi_init_struct.master_slave_mode = SPI_MODE_MASTER;

    spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_4;

    spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;

    spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;

    spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;

    spi_init_struct.clock_phase = SPI_CLOCK_PHASE_1EDGE;

    spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;

    spi_init(SPI1, &spi_init_struct);

    spi_enable(SPI1, TRUE);

}

SPI读写

复制

uint8_t spi_writebyte(uint8_t index,uint8_t TxData)

{

    uint8_t re;

    while(spi_i2s_flag_get(SPI1, SPI_I2S_TDBE_FLAG) == RESET);

    spi_i2s_data_transmit(SPI1, TxData);

    while(spi_i2s_flag_get(SPI1, SPI_I2S_RDBF_FLAG) == RESET);

    re = spi_i2s_data_receive(SPI1);

    return re;

}

lcd使用的IO初始化

复制

void spilcd_gpio_init(void)

{

    gpio_init_type gpio_initstructure;

    

    crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

    crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);

    

    gpio_default_para_init(&gpio_initstructure);

    /* lcd CS=PA15,BLK=PA9 */

    gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;

    gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;

    gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;

    gpio_initstructure.gpio_pins = GPIO_PINS_15 | GPIO_PINS_9;

    gpio_initstructure.gpio_pull = GPIO_PULL_UP;

    gpio_init(GPIOA, &gpio_initstructure);

    

    //DC = PC7

    gpio_initstructure.gpio_pins = GPIO_PINS_7;

    gpio_init(GPIOC, &gpio_initstructure);

    

    drv_spi_gpio_init();

}

spi接口驱动

复制

static void SPILCD_WriteCmd(uint8_t Data)

{

    LCD_DC_CLR();

    LCD_CS_CLR();

    spi_writebyte(0,Data);

    LCD_CS_SET();

}



static void SPILCD_WriteData(uint8_t Data)

{

    LCD_DC_SET();

    LCD_CS_CLR();

    spi_writebyte(0,Data);

    LCD_CS_SET();

}



static void SPILCD_WriteMultiData(const uint8_t *pData, uint32_t NumItems)

{

    uint32_t i=NumItems;

    uint32_t Data;

        

    LCD_DC_SET();

    LCD_CS_CLR();

    spi_writebuff(0,(uint8_t *)pData,NumItems);

    LCD_CS_SET();

}



static void SPILCD_SetRegin(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)

{

    uint8_t data[4];

    /*Column addresses*/

    SPILCD_WriteCmd(0x2A);

    data[0] = (x1 >> 8) & 0xFF;

    data[1] = x1 & 0xFF;

    data[2] = (x2 >> 8) & 0xFF;

    data[3] = x2 & 0xFF;

    SPILCD_WriteData(data[0]);

    SPILCD_WriteData(data[1]);

    SPILCD_WriteData(data[2]);

    SPILCD_WriteData(data[3]);



    /*Page addresses*/

    SPILCD_WriteCmd(0x2B);

    data[0] = (y1 >> 8) & 0xFF;

    data[1] = y1 & 0xFF;

    data[2] = (y2 >> 8) & 0xFF;

    data[3] = y2 & 0xFF;

    SPILCD_WriteData(data[0]);

    SPILCD_WriteData(data[1]);

    SPILCD_WriteData(data[2]);

    SPILCD_WriteData(data[3]);



    /*Memory write*/

    SPILCD_WriteCmd(0x2C);

}



void spilcd_draw_bitmap(uint16_t x,uint16_t y,uint16_t w,uint16_t h,const uint8_t *pbuff)

{



    uint16_t x1,y1,x2,y2;

    uint32_t send_size   = w * h * 2;

    x1 = x;

    y1 = y;

    x2 = x+w-1;

    y2 = y+h-1;

    SPILCD_SetRegin(x1,y1,x2,y2);

    SPILCD_WriteMultiData(pbuff, send_size);

    LCD_CS_SET();

}



主函数调用lcd初始化,并显示。

复制

    spilcd_init();

    Lcd_Clear(LCD_RED);

    Delay_ms(1000);

    Lcd_Clear(LCD_GREEN);

    Delay_ms(1000);

    Lcd_Clear(LCD_BLUE);

    Delay_ms(1000);

    Lcd_Clear(LCD_WHITE);

    Delay_ms(1000);



通过shell控制显示效果。

复制

#if UART_SHELL == NR_MICRO_SHELL

#include "nr_micro_shell.h"



extern const unsigned char gImage_1[];



/* GLCD RGB color definitions                            */

#define GLCD_COLOR_BLACK        0x0000  /*   0,   0,   0 */

#define GLCD_COLOR_NAVY         0x000F  /*   0,   0, 128 */

#define GLCD_COLOR_DARK_GREEN   0x03E0  /*   0, 128,   0 */

#define GLCD_COLOR_DARK_CYAN    0x03EF  /*   0, 128, 128 */

#define GLCD_COLOR_MAROON       0x7800  /* 128,   0,   0 */

#define GLCD_COLOR_PURPLE       0x780F  /* 128,   0, 128 */

#define GLCD_COLOR_OLIVE        0x7BE0  /* 128, 128,   0 */

#define GLCD_COLOR_LIGHT_GREY   0xC618  /* 192, 192, 192 */

#define GLCD_COLOR_DARK_GREY    0x7BEF  /* 128, 128, 128 */

#define GLCD_COLOR_BLUE         0x001F  /*   0,   0, 255 */

#define GLCD_COLOR_GREEN        0x07E0  /*   0, 255,   0 */

#define GLCD_COLOR_CYAN         0x07FF  /*   0, 255, 255 */

#define GLCD_COLOR_RED          0xF800  /* 255,   0,   0 */

#define GLCD_COLOR_MAGENTA      0xF81F  /* 255,   0, 255 */

#define GLCD_COLOR_YELLOW       0xFFE0  /* 255, 255, 0   */

#define GLCD_COLOR_WHITE        0xFFFF  /* 255, 255, 255 */



static uint16_t g_color_f = GLCD_COLOR_WHITE,g_color_b = GLCD_COLOR_BLACK;

static int16_t g_x=0,g_y=0;



static uint16_t lcd_color_find(char *pstr)

{

    if (!strcmp("black", pstr)) return GLCD_COLOR_BLACK;

    else if (!strcmp("white", pstr)) return GLCD_COLOR_WHITE;

    else if (!strcmp("red", pstr)) return GLCD_COLOR_RED;

    else if (!strcmp("yellow", pstr)) return GLCD_COLOR_YELLOW;

    else if (!strcmp("green", pstr)) return GLCD_COLOR_GREEN;

    else if (!strcmp("blue", pstr)) return GLCD_COLOR_BLUE;

    else if (!strcmp("purple", pstr)) return GLCD_COLOR_PURPLE;

    else if (!strcmp("light", pstr)) return GLCD_COLOR_LIGHT_GREY;

    else if (!strcmp("dark", pstr)) return GLCD_COLOR_DARK_GREY;

    else return atoi(pstr);

}

/**

 * [url=home.php?mod=space&uid=247401]@brief[/url] test command

 */



void shell_lcd(char argc, char *argv)

{

    int color;

    int x1,y1,x2,y2;

    if (argc > 1)

    {

        if (!strcmp("clear", &argv[argv[1]]))

        {

            if(argc == 3)

            {

                color = lcd_color_find(&argv[argv[2]]);

            }else if(argc == 2)

            {

                color = g_color_b;

            }else goto lcd_end;

            Lcd_Clear(color);

        }else if (!strcmp("fillrect", &argv[argv[1]]))

        {

            if(argc == 6)

            {

                color = g_color_f;

            }else if(argc == 7)

            {

                color = lcd_color_find(&argv[argv[6]]);

            }else goto lcd_end;

            x1 = atoi(&argv[argv[2]]);

            y1 = atoi(&argv[argv[3]]);

            x2 = atoi(&argv[argv[4]]);

            y2 = atoi(&argv[argv[5]]);

            if(x2 && y2)    Lcd_Fill(x1,y1,x1+x2-1,y1+y2-1,color);

            else printf("w h must > 0");

        }else if (!strcmp("fillcircle", &argv[argv[1]]))

        {

            if(argc == 5)

            {

                color = g_color_f;

            }else if(argc == 6)

            {

                color = lcd_color_find(&argv[argv[5]]);

            }else goto lcd_end;

            x1 = atoi(&argv[argv[2]]);

            y1 = atoi(&argv[argv[3]]);

            x2 = atoi(&argv[argv[4]]);  //r

            if(x2)  Lcd_FillCircle(x1,y1,x2,color);

            else printf("r must > 0");

        }else if (!strcmp("vline", &argv[argv[1]]))

        {

            if(argc == 5)

            {

                color = g_color_f;

            }else if(argc == 6)

            {

                color = lcd_color_find(&argv[argv[5]]);

            }else goto lcd_end;

            x1 = atoi(&argv[argv[2]]);

            y1 = atoi(&argv[argv[3]]);

            y2 = atoi(&argv[argv[4]]);

            if(y2)  Lcd_DrawVLine(x1,y1,y1+y2-1,color);

            else printf("h must > 0");

        }else if (!strcmp("hline", &argv[argv[1]]))

        {

            if(argc == 5)

            {

                color = g_color_f;

            }else if(argc == 6)

            {

                color = lcd_color_find(&argv[argv[5]]);

            }else goto lcd_end;

            x1 = atoi(&argv[argv[2]]);

            y1 = atoi(&argv[argv[3]]);

            x2 = atoi(&argv[argv[4]]);

            if(x2)  Lcd_DrawHLine(x1,y1,x1+x2-1,color);

            else printf("w  must > 0");

        }else if (!strcmp("circle", &argv[argv[1]]))

        {

            if(argc == 5)

            {

                color = g_color_f;

            }else if(argc == 6)

            {

                color = lcd_color_find(&argv[argv[5]]);

            }else goto lcd_end;

            x1 = atoi(&argv[argv[2]]);

            y1 = atoi(&argv[argv[3]]);

            x2 = atoi(&argv[argv[4]]);  //r

            if(x2)   Lcd_DrawCircle(x1,y1,x2,color);

            else printf("r must > 0");

        }else if (!strcmp("rect", &argv[argv[1]]))

        {

            if(argc == 6)

            {

                color = g_color_f;

            }else if(argc == 7)

            {

                color = lcd_color_find(&argv[argv[6]]);

            }else goto lcd_end;

            x1 = atoi(&argv[argv[2]]);

            y1 = atoi(&argv[argv[3]]);

            x2 = atoi(&argv[argv[4]]);

            y2 = atoi(&argv[argv[5]]);

            if(x2 && y2)    Lcd_DrawRect(x1,y1,x1+x2-1,y1+y2-1,color);

            else printf("w h must > 0");

        }else if (!strcmp("point", &argv[argv[1]]))

        {

            if(argc == 4)

            {

                color = g_color_f;

            }else if(argc == 5)

            {

                color = lcd_color_find(&argv[argv[4]]);

            }else goto lcd_end;

            x1 = atoi(&argv[argv[2]]);

            y1 = atoi(&argv[argv[3]]);

            Lcd_DrawPoint(x1,y1,color);

        }else if (!strcmp("color", &argv[argv[1]]))

        {

            if(argc == 2)

            {

                printf("f_color=%04X,b_color=%04X\r\n",g_color_f,g_color_b);

            }else if(argc == 4)

            {

                g_color_f = lcd_color_find(&argv[argv[2]]);

                g_color_b = lcd_color_find(&argv[argv[3]]);

            }else goto lcd_end;

        }else if (!strcmp("move", &argv[argv[1]]))

        {

            if(argc == 2)

            {

                printf("x=%d,y=%d\r\n",g_x,g_y);

            }else if(argc == 4)

            {

                g_x = atoi(&argv[argv[2]]);

                g_y = atoi(&argv[argv[3]]);

            }else goto lcd_end;

        }else if (!strcmp("display", &argv[argv[1]]))

        {

            if(argc == 5)

            {

                x1 = atoi(&argv[argv[2]]);

                y1 = atoi(&argv[argv[3]]);

                lcd_set_font_color(g_color_f,g_color_b);

                lcd_disp_str_at(x1,y1,&argv[argv[4]]);

            }else goto lcd_end;

        }else if (!strcmp("image", &argv[argv[1]]))

        {

            if(argc == 2)

            {

//                //Lcd_DrawImage(g_x,g_y,g_x+39,g_y+39,(uint8_t *)gImage_1);

            }else if(argc == 4)

            {

                x1 = atoi(&argv[argv[2]]);

                y1 = atoi(&argv[argv[3]]);

//                //Lcd_DrawImage(x1,y1,x1+39,y1+39,(uint8_t *)gImage_1);

            }else goto lcd_end;

        }else goto lcd_end;

    }else goto lcd_end;

    return;

lcd_end:

    printf("usage: lcd  \r\n");

    printf("lcd clear                    [color]\r\n");

    printf("lcd fillrect     x1 y1 w  h  [color]\r\n");

    printf("lcd fillcircle   x1 y1 r     [color]\r\n");

    printf("lcd hline        x1 y1 w     [color]\r\n");

    printf("lcd vline        x1 y1    h  [color]\r\n");

    printf("lcd circle       x1 y1 r     [color]\r\n");

    printf("lcd rect         x1 y1 w  h  [color]\r\n");

    printf("lcd point        x1 y1       [color]\r\n");

    printf("lcd display      x  y    string   \r\n");

    printf("lcd move         x  y             \r\n");

    printf("lcd image        x  y             \r\n");

    printf("lcd color        f_color  b_color \r\n");

}

NR_SHELL_CMD_EXPORT(lcd, shell_lcd, "lcd display test");



 

---------------------
作者:WoodData
链接:https://bbs.21ic.com/icview-3339122-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值