[活动专区] 【AT-START-L021测评】9、16位并口屏及ADC曲线绘制

[复制链接]
1489|0
 楼主| sujingliang 发表于 2024-12-2 20:00 | 显示全部楼层 |阅读模式
本帖最后由 sujingliang 于 2024-12-2 20:12 编辑



AT-START-L021有39个GPIO,GPIOA和GPIOB都有完整的16pin引脚。引脚充沛到足够驱动16位并口屏。

1、接线
驱动16位并口屏程序上其实比8位并口屏更简单,但是接线真是复杂:
31.jpg

2、引脚定义
  1. #define LCD_CS  GPIOA,GPIO_PINS_6       //PA6
  2. #define LCD_RS  GPIOA,GPIO_PINS_10      //PA10
  3. #define LCD_WR  GPIOA,GPIO_PINS_4       //PA4
  4. #define LCD_RD  GPIOA,GPIO_PINS_1       //PA1
  5. #define LCD_RST GPIOA,GPIO_PINS_8       //PA8
  6. #define LCD_LED GPIOA,GPIO_PINS_11      //PA11

3、GPIO初始化

  1. static void lcd_gpio_init(void)
  2. {
  3.         gpio_init_type gpio_init_struct;

  4.   /* enable the led clock */
  5.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  6.         crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);

  7.   /* set default parameter */
  8.   gpio_default_para_init(&gpio_init_struct);

  9.   /* configure the lcd GPIOA gpio */
  10.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  11.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  12.   gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  13.   gpio_init_struct.gpio_pins = GPIO_PINS_8|GPIO_PINS_10|GPIO_PINS_9|GPIO_PINS_15|GPIO_PINS_7|GPIO_PINS_6|GPIO_PINS_5;
  14.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  15.   gpio_init(GPIOA, &gpio_init_struct);
  16.         
  17.         /* configure the lcd GPIOB gpio */
  18.   gpio_init_struct.gpio_pins = GPIO_PINS_10|GPIO_PINS_4|GPIO_PINS_3|GPIO_PINS_5|GPIO_PINS_7|GPIO_PINS_9|GPIO_PINS_8;
  19.   gpio_init(GPIOB, &gpio_init_struct);
  20. }
GPIOA的引脚用于控制,GPIOB0-15做为并口总线。
4、GPIOB写16位数据
  1. void gpio_lcd_write_data_word(uint16_t* data, size_t length) {
  2.   for (size_t i = 0; i < length; i++) {
  3.     GPIOB->odt = data[i];
  4.     LCD_WR_CLR;
  5.     LCD_WR_SET;
  6.   }
  7. }
5、LCD写命令
  1. void lcd_write_comm_word(uint16_t cmd)
  2. {
  3.                 uint16_t c;
  4.                 c=0x00FF&cmd;
  5.           LCD_CS_CLR;
  6.     LCD_RS_CLR;
  7.     gpio_lcd_write_data_word(&c, 1);
  8.     LCD_CS_SET;
  9. }
6、LCD写数据
  1. void lcd_write_data_word(uint16_t dat)
  2. {
  3.                 uint16_t *d=&dat;
  4.           LCD_CS_CLR;
  5.     LCD_RS_SET;
  6.     gpio_lcd_write_data_word(d, 1);
  7.     LCD_CS_SET;
  8. }
7、写寄存器
  1. void lcd_write_register_word(uint16_t addr, uint16_t data)
  2. {
  3.     lcd_write_comm_word(addr);
  4.     lcd_write_data_word(data);
  5. }
8、16位并口屏显示效果
tutieshi_480x272_6s.gif
可以看出16位(PIN顺序排列)驱动比8位(PIN混乱排列)显示效果有质得飞跃,显示汉字基本没有闪烁。

9、ADC曲线绘制
  1. void test_run(void)
  2. {
  3.         int i;
  4.         uint8_t buff[10];
  5.         
  6.         double v;
  7.         if(vmor_flag_index == 1)
  8.   {
  9.       vmor_flag_index = 0;

  10.                         v=adc1_ordinary_valuetab[0]*3.3/4096;
  11.                         sprintf((char*)buff,"%0.2f",v);
  12.                         inputData=176-adc1_ordinary_valuetab[0]*176/4096;

  13.   }
  14.   adc_ordinary_software_trigger_enable(ADC1, TRUE);

  15.         for(i=0;i<43;i++)
  16.         {
  17.                 setColor(0X0000);
  18.                 drawLine(5*i,canvas[i],5*i+5,canvas[i+1]);
  19.           if(i<42){
  20.                  setColor(0XFB80);
  21.                  drawLine(5*i,canvas[i+1],5*i+5,canvas[i+2]);
  22.                 }
  23.                 canvas[i]=canvas[i+1];         
  24.         }

  25.         canvas[43]=inputData;
  26.         

  27.         gridding();
  28.         GUI_WriteASCII(154,2,(unsigned char*)buff,0XA7F9,0X13A6);
  29.         delay_ms(50);
  30. }


画方格图
  1. void gridding(void)
  2. {
  3.         uint8_t i,j;
  4.         
  5.         setColor(0X5345);
  6.         setBgColor(0x0000);
  7.         
  8.         for(i=0;i<8;i++)
  9.         {
  10.                 if(i!=1)
  11.                         drawHLine_step(0,i*22,220,2);
  12.                 else drawHLine_step(0,i*22,150,2);
  13.         }
  14.         drawHLine_step(0,175,220,2);
  15.                 for(j=0;j<13;j++)
  16.         {
  17.                 if(j!=8&&j!=9&&j!=10)
  18.                         drawVLine_step(j*20,0,176,2);
  19.                 else
  20.                         drawVLine_step(j*20,25,176,2);
  21.         }
  22.         drawVLine_step(219,0,176,2);
  23. }

  1. void drawHLine_step(unsigned char x, unsigned char y, unsigned char l,uint8_t step)
  2. {
  3.     setXY(x, y, x+l, y);

  4.     for(int i=0; i<l+1; i++)
  5.     {
  6.                         if(i%step==0)
  7.         lcd_write_data_word(fcolor);
  8.                         else
  9.                                 lcd_write_data_word(bcolor);
  10.     }

  11.     clrXY();
  12. }


203949fa-0c19-4b8b-bfb0-3452f23e0e0d.gif

8位屏用得比较方便,上面是8位屏显示效果。

test1.rar (122.36 KB, 下载次数: 15)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

147

帖子

3

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