[活动专区] 【AT-START-L021测评】+LCD屏显示驱动

[复制链接]
942|0
 楼主| jinglixixi 发表于 2024-11-27 19:42 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2024-11-28 18:31 编辑

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

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

对所用引脚的功能配置函数为:
  1. void LCD_config(void)
  2. {
  3.   gpio_init_type gpio_init_struct;
  4.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  5.   gpio_default_para_init(&gpio_init_struct);
  6.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  7.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  8.   gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  9.   gpio_init_struct.gpio_pins = GPIO_PINS_5|GPIO_PINS_6|GPIO_PINS_7|GPIO_PINS_15;
  10.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  11.   gpio_init(GPIOA, &gpio_init_struct);
  12.   
  13.   crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  14.   gpio_init_struct.gpio_pins = GPIO_PINS_8|GPIO_PINS_9;
  15.   gpio_init(GPIOB, &gpio_init_struct);
  16. }

实现相关引脚输出高低电平的定义语句为:
#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发送字节数据的情况下,其发送数据的函数为:
  1. void  LCD_Writ_Bus(u8 dat)
  2. {
  3.     u8 i;
  4.     LCD_CS_Clr;
  5.     for(i=0;i<8;i++)
  6.     {
  7.         LCD_SCLK_Clr;
  8.         if(dat&0x80)
  9.            LCD_SDIN_Set;
  10.         else
  11.            LCD_SDIN_Clr;
  12.         LCD_SCLK_Set;
  13.         dat<<=1;
  14.     }
  15.     LCD_CS_Set;
  16. }

对LCD屏进行初始化的函数为:
  1. void LCD_Init(void)
  2. {
  3.   LCD_RST_Clr;
  4.   delay_ms(200);
  5.   LCD_RST_Set;
  6.   delay_ms(200);
  7.   LCD_WR_REG(0x11);
  8.   delay_ms(100);
  9.   LCD_WR_REG(0x21);
  10.   LCD_WR_REG(0xB1);
  11.   LCD_WR_DATA8(0x05);
  12.   LCD_WR_DATA8(0x3A);
  13.   LCD_WR_DATA8(0x3A);
  14.   LCD_WR_REG(0xB2);
  15.   LCD_WR_DATA8(0x05);
  16.   LCD_WR_DATA8(0x3A);
  17.   LCD_WR_DATA8(0x3A);
  18.   LCD_WR_REG(0xB3);
  19.   LCD_WR_DATA8(0x05);
  20.   LCD_WR_DATA8(0x3A);
  21.   LCD_WR_DATA8(0x3A);
  22.   LCD_WR_DATA8(0x05);
  23.   LCD_WR_DATA8(0x3A);
  24.   LCD_WR_DATA8(0x3A);
  25.   LCD_WR_REG(0xB4);
  26.   LCD_WR_DATA8(0x03);
  27.   LCD_WR_REG(0xC0);
  28.   LCD_WR_DATA8(0x62);
  29.   LCD_WR_DATA8(0x02);
  30.   LCD_WR_DATA8(0x04);
  31.   LCD_WR_REG(0xC1);
  32.   LCD_WR_DATA8(0xC0);
  33.   LCD_WR_REG(0xC2);
  34.   LCD_WR_DATA8(0x0D);
  35.   LCD_WR_DATA8(0x00);
  36.   LCD_WR_REG(0xC3);
  37.   LCD_WR_DATA8(0x8D);
  38.   LCD_WR_DATA8(0x6A);
  39.   LCD_WR_REG(0xC4);
  40.   LCD_WR_DATA8(0x8D);
  41.   LCD_WR_DATA8(0xEE);
  42.   LCD_WR_REG(0xC5);
  43.   LCD_WR_DATA8(0x0E);
  44.   LCD_WR_REG(0xE0);
  45.   LCD_WR_DATA8(0x10);
  46.   LCD_WR_DATA8(0x0E);
  47.   LCD_WR_DATA8(0x02);
  48.   LCD_WR_DATA8(0x03);
  49.   LCD_WR_DATA8(0x0E);
  50.   LCD_WR_DATA8(0x07);
  51.   LCD_WR_DATA8(0x02);
  52.   LCD_WR_DATA8(0x07);
  53.   LCD_WR_DATA8(0x0A);
  54.   LCD_WR_DATA8(0x12);
  55.   LCD_WR_DATA8(0x27);
  56.   LCD_WR_DATA8(0x37);
  57.   LCD_WR_DATA8(0x00);
  58.   LCD_WR_DATA8(0x0D);
  59.   LCD_WR_DATA8(0x0E);
  60.   LCD_WR_DATA8(0x10);
  61.   LCD_WR_REG(0xE1);
  62.   LCD_WR_DATA8(0x10);
  63.   LCD_WR_DATA8(0x0E);
  64.   LCD_WR_DATA8(0x03);
  65.   LCD_WR_DATA8(0x03);
  66.   LCD_WR_DATA8(0x0F);
  67.   LCD_WR_DATA8(0x06);
  68.   LCD_WR_DATA8(0x02);
  69.   LCD_WR_DATA8(0x08);
  70.   LCD_WR_DATA8(0x0A);
  71.   LCD_WR_DATA8(0x13);
  72.   LCD_WR_DATA8(0x26);
  73.   LCD_WR_DATA8(0x36);
  74.   LCD_WR_DATA8(0x00);
  75.   LCD_WR_DATA8(0x0D);
  76.   LCD_WR_DATA8(0x0E);
  77.   LCD_WR_DATA8(0x10);
  78.   LCD_WR_REG(0x3A);
  79.   LCD_WR_DATA8(0x05);
  80.   LCD_WR_REG(0x36);
  81.   LCD_WR_DATA8(0x78);
  82.   LCD_WR_REG(0x29);
  83.   LCD_BLK_Set;
  84. }

以指定色彩进行清屏的函数为:
  1. void LCD_Clear(u16 Color)
  2. {
  3.     u16 i,j;
  4.     LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);
  5.     for(i=0;i<LCD_W;i++)
  6.     {
  7.         for (j=0;j<LCD_H;j++)
  8.         {
  9.              LCD_WR_DATA(Color);
  10.         }
  11.     }
  12. }

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

进行LCD屏测试的主程序为:
  1. int main(void)
  2. {
  3.   system_clock_config();
  4.   at32_board_init();
  5.   LCD_config();
  6.   LCD_Init();
  7.   LCD_Clear(RED);
  8.   LCD_ShowString(10,10,"AT32L021",YELLOW);
  9.   LCD_ShowString(10,30,"jinglixixi",YELLOW);
  10.   while(1)
  11.   {
  12.     at32_led_toggle(LED2);
  13.     delay_ms(200);
  14.     at32_led_toggle(LED3);
  15.     delay_ms(200);
  16.     at32_led_toggle(LED4);
  17.     delay_ms(200);
  18.   }
  19. }

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

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

803226748461fb6234.png
图2 显示效果

136506748463e98a89.png
图3 显示内容


您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部