sujingliang 发表于 2024-12-2 20:00

【AT-START-L021测评】9、16位并口屏及ADC曲线绘制

本帖最后由 sujingliang 于 2024-12-2 20:12 编辑



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

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


2、引脚定义
#define LCD_CSGPIOA,GPIO_PINS_6       //PA6
#define LCD_RSGPIOA,GPIO_PINS_10      //PA10
#define LCD_WRGPIOA,GPIO_PINS_4       //PA4
#define LCD_RDGPIOA,GPIO_PINS_1       //PA1
#define LCD_RST GPIOA,GPIO_PINS_8       //PA8
#define LCD_LED GPIOA,GPIO_PINS_11      //PA11
3、GPIO初始化

static void lcd_gpio_init(void)
{
      gpio_init_type gpio_init_struct;

/* enable the led clock */
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
      crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);

/* set default parameter */
gpio_default_para_init(&gpio_init_struct);

/* configure the lcd GPIOA 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_8|GPIO_PINS_10|GPIO_PINS_9|GPIO_PINS_15|GPIO_PINS_7|GPIO_PINS_6|GPIO_PINS_5;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &gpio_init_struct);
      
      /* configure the lcd GPIOB gpio */
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;
gpio_init(GPIOB, &gpio_init_struct);
}GPIOA的引脚用于控制,GPIOB0-15做为并口总线。
4、GPIOB写16位数据
void gpio_lcd_write_data_word(uint16_t* data, size_t length) {
for (size_t i = 0; i < length; i++) {
    GPIOB->odt = data;
    LCD_WR_CLR;
    LCD_WR_SET;
}
}5、LCD写命令
void lcd_write_comm_word(uint16_t cmd)
{
                uint16_t c;
                c=0x00FF&cmd;
          LCD_CS_CLR;
    LCD_RS_CLR;
    gpio_lcd_write_data_word(&c, 1);
    LCD_CS_SET;
}6、LCD写数据
void lcd_write_data_word(uint16_t dat)
{
                uint16_t *d=&dat;
          LCD_CS_CLR;
    LCD_RS_SET;
    gpio_lcd_write_data_word(d, 1);
    LCD_CS_SET;
}7、写寄存器
void lcd_write_register_word(uint16_t addr, uint16_t data)
{
    lcd_write_comm_word(addr);
    lcd_write_data_word(data);
}8、16位并口屏显示效果

可以看出16位(PIN顺序排列)驱动比8位(PIN混乱排列)显示效果有质得飞跃,显示汉字基本没有闪烁。

9、ADC曲线绘制
void test_run(void)
{
      int i;
      uint8_t buff;
      
      double v;
      if(vmor_flag_index == 1)
{
      vmor_flag_index = 0;

                        v=adc1_ordinary_valuetab*3.3/4096;
                        sprintf((char*)buff,"%0.2f",v);
                        inputData=176-adc1_ordinary_valuetab*176/4096;

}
adc_ordinary_software_trigger_enable(ADC1, TRUE);

      for(i=0;i<43;i++)
      {
                setColor(0X0000);
                drawLine(5*i,canvas,5*i+5,canvas);
          if(i<42){
               setColor(0XFB80);
               drawLine(5*i,canvas,5*i+5,canvas);
                }
                canvas=canvas;         
      }

      canvas=inputData;
      

      gridding();
      GUI_WriteASCII(154,2,(unsigned char*)buff,0XA7F9,0X13A6);
      delay_ms(50);
}

画方格图
void gridding(void)
{
      uint8_t i,j;
      
      setColor(0X5345);
      setBgColor(0x0000);
      
      for(i=0;i<8;i++)
      {
                if(i!=1)
                        drawHLine_step(0,i*22,220,2);
                else drawHLine_step(0,i*22,150,2);
      }
      drawHLine_step(0,175,220,2);
                for(j=0;j<13;j++)
      {
                if(j!=8&&j!=9&&j!=10)
                        drawVLine_step(j*20,0,176,2);
                else
                        drawVLine_step(j*20,25,176,2);
      }
      drawVLine_step(219,0,176,2);
}

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

    for(int i=0; i<l+1; i++)
    {
                        if(i%step==0)
      lcd_write_data_word(fcolor);
                        else
                              lcd_write_data_word(bcolor);
    }

    clrXY();
}



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


页: [1]
查看完整版本: 【AT-START-L021测评】9、16位并口屏及ADC曲线绘制