打印
[活动专区]

【AT-START-L021测评】+LCD屏显示驱动

[复制链接]
443|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2024-11-28 18:31 编辑

前面介绍了使用数码管作为显示器件的驱动方法,其特点是线路简单皮实耐用,其不足就是显示内容和形式过于单一。为此,就再介绍一种以LCD屏为器件的显示方式,它可以大大的改进数码管显示方式的不足。

该显示屏的尺寸为0.96寸,其显示色彩较为丰富,显示分辨率为160*80像素点。
该显示屏以SPI接口的方式工作,其引脚与开发板的连接关系为:
CLK---PB8
DIN---PB9
RES---PA5
DC ---PA6
CS ---PA7
BLK---PA15

对所用引脚的功能配置函数为:
void LCD_config(void)
{
  gpio_init_type gpio_init_struct;
  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  gpio_default_para_init(&gpio_init_struct);
  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_5|GPIO_PINS_6|GPIO_PINS_7|GPIO_PINS_15;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);
  
  crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  gpio_init_struct.gpio_pins = GPIO_PINS_8|GPIO_PINS_9;
  gpio_init(GPIOB, &gpio_init_struct);
}

实现相关引脚输出高低电平的定义语句为:
#define LCD_SCLK_Set   gpio_bits_write(GPIOB,GPIO_PINS_8,TRUE)
#define LCD _SCLK_Clr   gpio_bits_write(GPIOB,GPIO_PINS_8,FALSE)

#define LCD _SDIN_Set   gpio_bits_write(GPIOB,GPIO_PINS_9,TRUE)
#define LCD _SDIN_Clr   gpio_bits_write(GPIOB,GPIO_PINS_9,FALSE)

#define LCD _RST_Set    gpio_bits_write(GPIOA,GPIO_PINS_5,TRUE)  
#define LCD D_RST_Clr    gpio_bits_write(GPIOA,GPIO_PINS_5,FALSE)

#define LCD _DC_Set     gpio_bits_write(GPIOA,GPIO_PINS_6,TRUE)  
#define LCD_DC_Clr     gpio_bits_write(GPIOA,GPIO_PINS_6,FALSE)

#define LCD _CS_Set     gpio_bits_write(GPIOA,GPIO_PINS_7,TRUE)  
#define LCD _CS_Clr     gpio_bits_write(GPIOA,GPIO_PINS_7,FALSE)

#define LCD _BLK_Set    gpio_bits_write(GPIOA,GPIO_PINS_15,TRUE)  
#define LCD _BLK_Clr    gpio_bits_write(GPIOA,GPIO_PINS_15,FALSE)


在所用软件模拟SPI发送字节数据的情况下,其发送数据的函数为:
void  LCD_Writ_Bus(u8 dat)
{
    u8 i;
    LCD_CS_Clr;
    for(i=0;i<8;i++)
    {
        LCD_SCLK_Clr;
        if(dat&0x80)
           LCD_SDIN_Set;
        else
           LCD_SDIN_Clr;
        LCD_SCLK_Set;
        dat<<=1;
    }
    LCD_CS_Set;
}

对LCD屏进行初始化的函数为:
void LCD_Init(void)
{
  LCD_RST_Clr;
  delay_ms(200);
  LCD_RST_Set;
  delay_ms(200);
  LCD_WR_REG(0x11);
  delay_ms(100);
  LCD_WR_REG(0x21);
  LCD_WR_REG(0xB1);
  LCD_WR_DATA8(0x05);
  LCD_WR_DATA8(0x3A);
  LCD_WR_DATA8(0x3A);
  LCD_WR_REG(0xB2);
  LCD_WR_DATA8(0x05);
  LCD_WR_DATA8(0x3A);
  LCD_WR_DATA8(0x3A);
  LCD_WR_REG(0xB3);
  LCD_WR_DATA8(0x05);
  LCD_WR_DATA8(0x3A);
  LCD_WR_DATA8(0x3A);
  LCD_WR_DATA8(0x05);
  LCD_WR_DATA8(0x3A);
  LCD_WR_DATA8(0x3A);
  LCD_WR_REG(0xB4);
  LCD_WR_DATA8(0x03);
  LCD_WR_REG(0xC0);
  LCD_WR_DATA8(0x62);
  LCD_WR_DATA8(0x02);
  LCD_WR_DATA8(0x04);
  LCD_WR_REG(0xC1);
  LCD_WR_DATA8(0xC0);
  LCD_WR_REG(0xC2);
  LCD_WR_DATA8(0x0D);
  LCD_WR_DATA8(0x00);
  LCD_WR_REG(0xC3);
  LCD_WR_DATA8(0x8D);
  LCD_WR_DATA8(0x6A);
  LCD_WR_REG(0xC4);
  LCD_WR_DATA8(0x8D);
  LCD_WR_DATA8(0xEE);
  LCD_WR_REG(0xC5);
  LCD_WR_DATA8(0x0E);
  LCD_WR_REG(0xE0);
  LCD_WR_DATA8(0x10);
  LCD_WR_DATA8(0x0E);
  LCD_WR_DATA8(0x02);
  LCD_WR_DATA8(0x03);
  LCD_WR_DATA8(0x0E);
  LCD_WR_DATA8(0x07);
  LCD_WR_DATA8(0x02);
  LCD_WR_DATA8(0x07);
  LCD_WR_DATA8(0x0A);
  LCD_WR_DATA8(0x12);
  LCD_WR_DATA8(0x27);
  LCD_WR_DATA8(0x37);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x0D);
  LCD_WR_DATA8(0x0E);
  LCD_WR_DATA8(0x10);
  LCD_WR_REG(0xE1);
  LCD_WR_DATA8(0x10);
  LCD_WR_DATA8(0x0E);
  LCD_WR_DATA8(0x03);
  LCD_WR_DATA8(0x03);
  LCD_WR_DATA8(0x0F);
  LCD_WR_DATA8(0x06);
  LCD_WR_DATA8(0x02);
  LCD_WR_DATA8(0x08);
  LCD_WR_DATA8(0x0A);
  LCD_WR_DATA8(0x13);
  LCD_WR_DATA8(0x26);
  LCD_WR_DATA8(0x36);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x0D);
  LCD_WR_DATA8(0x0E);
  LCD_WR_DATA8(0x10);
  LCD_WR_REG(0x3A);
  LCD_WR_DATA8(0x05);
  LCD_WR_REG(0x36);
  LCD_WR_DATA8(0x78);
  LCD_WR_REG(0x29);
  LCD_BLK_Set;
}

以指定色彩进行清屏的函数为:
void LCD_Clear(u16 Color)
{
    u16 i,j;
    LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);
    for(i=0;i<LCD_W;i++)
    {
        for (j=0;j<LCD_H;j++)
        {
             LCD_WR_DATA(Color);
        }
    }
}

实现字符串显示的函数为:
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color)
{
    while(*p!='\0')
    {
        if(x>LCD_W-16){x=0;y+=16;}
        if(y>LCD_H-16){y=x=0;LCD_Clear(RED);}
        LCD_ShowChar(x,y,*p,1,color);
        x+=8;
        p++;
    }
}

进行LCD屏测试的主程序为:
int main(void)
{
  system_clock_config();
  at32_board_init();
  LCD_config();
  LCD_Init();
  LCD_Clear(RED);
  LCD_ShowString(10,10,"AT32L021",YELLOW);
  LCD_ShowString(10,30,"jinglixixi",YELLOW);
  while(1)
  {
    at32_led_toggle(LED2);
    delay_ms(200);
    at32_led_toggle(LED3);
    delay_ms(200);
    at32_led_toggle(LED4);
    delay_ms(200);
  }
}

经程序的编译和下载,其测试效果如图1所示。
图1 测试效果图

在添加图片显示函数的情况下,其显示效果如图2所示。
相应的图片显示函数为:
void LCD_ShowPicture(u16 x1,u16 y1,u16 x2,u16 y2)
{
     int i;
     LCD_Address_Set(x1,y1,x2,y2);
     for(i=0;i<12800;i++)      
     {
           LCD_WR_DATA8(gImage_fj[i*2]);
           LCD_WR_DATA8(gImage_fj[i*2+1]);
     }
}


图2 显示效果


图3 显示内容


使用特权

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

本版积分规则

464

主题

2783

帖子

38

粉丝