打印
[活动专区]

【AT-START-L021测评】1、驱动8位并口屏

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

能够入围本次AT-START-L021开发板的测评,感荣幸与激动。感谢21IC和雅特力科技的信任与期待。


一、谈一下对AT-START-L021开发板的理解
1、板载AT-LINK可以通过CMSIS-DAP Debugger方式方便地下载和调整程序。AT-LINK主控是AT32F403ACCT7,比本次的评测对象AT32L021C8T7性能还要强悍。
2、AT-LINK提供了5v和3.3v电平转换IC,可以满足5v和3.3vMCU的烧录。
3、LDO支持3.3v和1.8v供电,满足AT32L021C8T7通用和低电压驱动的需要。
4、3个user LED通过三极管驱动,用料非要这么足吗?
5、提供arduino uno连接接口。

二、驱动8位并口屏
1、硬件连接
利用arduino uno接口中如下几个引脚:


#define LCD_CS  GPIOB,GPIO_PINS_10      //PB10
#define LCD_RS  GPIOA,GPIO_PINS_8       //PA8
#define LCD_WR  GPIOB,GPIO_PINS_4       //PB4
#define LCD_RD  GPIOB,GPIO_PINS_3       //PB3
#define LCD_RST GPIOB,GPIO_PINS_5       //PB5
#define LCD_LED GPIOA,GPIO_PINS_10      //PA10

//#define USE_HIGHEIGHT   1       //使用高八位
#define LCD_DB0 GPIOA,GPIO_PINS_9                    //PA9
#define LCD_DB1 GPIOB,GPIO_PINS_7                     //PB7
#define LCD_DB2 GPIOA,GPIO_PINS_15                   //PA15
#define LCD_DB3 GPIOA,GPIO_PINS_7             //PA7
#define LCD_DB4 GPIOA,GPIO_PINS_6                    //PA6
#define LCD_DB5 GPIOA,GPIO_PINS_5             //PA5
#define LCD_DB6 GPIOB,GPIO_PINS_9             //PB9
#define LCD_DB7 GPIOB,GPIO_PINS_8             //PB8
2、gpio操作定义
对每一个利用到的引脚做如下GPIO设置、重置定义
#define LCD_DB0_SET gpio_bits_set(LCD_DB0)
#define LCD_DB0_CLR gpio_bits_reset(LCD_DB0)
3、并口输入数据函数
typedef struct {
                gpio_type *GPIOx;
    uint16_t GPIO_Pin;    // GPIO引脚
} GPIO_PinConfig;

// 初始化GPIO配置数组
GPIO_PinConfig dbPins[NUM_BITS] = {
    {LCD_DB0},
    {LCD_DB1},
    {LCD_DB2},
    {LCD_DB3},
    {LCD_DB4},
    {LCD_DB5},
    {LCD_DB6},
    {LCD_DB7}
};
void gpio_lcd_write_data_word(uint8_t* data, size_t length) {
    for (int i = 0; i < length; i++) {
        for (int bit = 0; bit < NUM_BITS; bit++) {
            // 检查当前位是否为1
            if (data[i] & (1 << bit)) {
                gpio_bits_set(dbPins[bit].GPIOx, dbPins[bit].GPIO_Pin);
            } else {
                gpio_bits_reset(dbPins[bit].GPIOx, dbPins[bit].GPIO_Pin);
            }
        }
                                LCD_WR_CLR;
                                LCD_WR_SET;
        // 如果需要,可以在这里添加延时或其他处理
    }
}
4、写命令函数
void lcd_write_comm_word(uint16_t cmd)
{
    unsigned char c[2];
//    c[0] = (cmd >> 8) & 0xFF;
//    c[1] = cmd & 0xFF;

                c[0]=0x00;
                c[1]=cmd;
    LCD_CS_CLR;
    LCD_RS_CLR;

    gpio_lcd_write_data_word(c, 2);

    LCD_CS_SET;
}
5、写数据函数
void lcd_write_data_word(uint16_t data)
{
    unsigned char c[2];
    c[0] = (data >> 8) & 0xFF;
    c[1] = data & 0xFF;

    LCD_CS_CLR;
    LCD_RS_SET;

    gpio_lcd_write_data_word(c, 2);

    LCD_CS_SET;
}
6、写寄存器函数
void lcd_write_register_word(uint16_t addr, uint16_t data)
{
    lcd_write_comm_word(addr);
    lcd_write_data_word(data);
}
7、LCD 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);
}
8、LCD初始化函数
void InitLCD()
{
    //printf("reset\r\n");
                lcd_gpio_init();
        
    LCD_Reset();
                LCD_RD_SET;
    Delay_Ms(150);

    //printf("ili9225 Initial\r\n");
    Delay_Ms(50);

    LCD_CS_CLR;

    lcd_write_register_word(0x10, 0x0000);
    lcd_write_register_word(0x11, 0x0000);
    lcd_write_register_word(0x12, 0x0000);
    lcd_write_register_word(0x13, 0x0000);
    lcd_write_register_word(0x14, 0x0000);
    Delay_Ms(40);

    lcd_write_register_word(0x11, 0x0018);
    lcd_write_register_word(0x12, 0x6121);
    lcd_write_register_word(0x13, 0x006F);
    lcd_write_register_word(0x14, 0x495F);
    lcd_write_register_word(0x10, 0x0800);
    Delay_Ms(10);
    lcd_write_register_word(0x11, 0x103B);
    Delay_Ms(50);
    lcd_write_register_word(0x01, 0x031C);  //0x021C 控制反转
    lcd_write_register_word(0x02, 0x0100);
    lcd_write_register_word(0x03, 0x1038);
               
    lcd_write_register_word(0x07, 0x0000);
    lcd_write_register_word(0x08, 0x0808);
    lcd_write_register_word(0x0b, 0x1100);
    lcd_write_register_word(0x0c, 0x0000);
    lcd_write_register_word(0x0f, 0x0D01);
    lcd_write_register_word(0x15, 0x0020);
    lcd_write_register_word(0x20, 0x0000);
    lcd_write_register_word(0x21, 0x0000);

    lcd_write_register_word(0x30, 0x0000);
    lcd_write_register_word(0x31, 0x00DB);
    lcd_write_register_word(0x32, 0x0000);
    lcd_write_register_word(0x33, 0x0000);

    lcd_write_register_word(0x34, 0x00DB);
    lcd_write_register_word(0x35, 0x0000);
    lcd_write_register_word(0x36, 0x00AF);
    lcd_write_register_word(0x37, 0x0000);
    lcd_write_register_word(0x38, 0x00DB);
    lcd_write_register_word(0x39, 0x0000);

    lcd_write_register_word(0x50, 0x0000);
    lcd_write_register_word(0x51, 0x0808);
    lcd_write_register_word(0x52, 0x080A);
    lcd_write_register_word(0x53, 0x000A);
    lcd_write_register_word(0x54, 0x0A08);
    lcd_write_register_word(0x55, 0x0808);
    lcd_write_register_word(0x56, 0x0000);
    lcd_write_register_word(0x57, 0x0A00);
    lcd_write_register_word(0x58, 0x0710);
    lcd_write_register_word(0x59, 0x0710);

    lcd_write_register_word(0x07, 0x0012);
    Delay_Ms(50);
    lcd_write_register_word(0x07, 0x1017);
    lcd_write_comm_word(0x22);
    LCD_CS_SET;
    LCD_LED_SET;

}
9、设置窗口函数
void setXY(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2)
{
        #if 1
    lcd_write_register_word(0x36,y2);
    lcd_write_register_word(0x37,y1);
    lcd_write_register_word(0x38,x2);
    lcd_write_register_word(0x39,x1);
    lcd_write_register_word(0x20,y1);
    lcd_write_register_word(0x21,x1);
        #endif
}
10、画点函数
void setPixel(uint16_t color)
{
    lcd_write_data_word(color);
}
11、ASCII和汉字显示函数
void GUI_Write16CnChar(unsigned char x, unsigned char y, unsigned char *cn, unsigned short wordColor, unsigned short backColor)
{
    uint8_t i, j, wordNum,mx,my,wordByte;
    uint8_t color;
        
                mx=x;
                my=y;
    while (*cn != '\0')
    {
                        if(*cn<128){
                                wordNum = *cn - 32;
        setXY(mx,my,mx+7, my+15);

            for (wordByte=0; wordByte<16; wordByte++)
            {
                color = Font_Data[wordNum].dat[wordByte];
                for (j=0; j<8; j++)
                {
                    if ((color&0x80) == 0x80)
                    {
                        setPixel(wordColor);
                    }
                    else
                    {
                        setPixel(backColor);
                    }
                    color <<= 1;
                }
            }
            cn++;
            mx +=8;
         }
        else
        {
        setXY(mx, my, mx+15, my+15);
        for (wordNum=0; wordNum<(sizeof(CnChar16x16) / sizeof(CnChar16x16[0])); wordNum++)
        {   //wordNum扫描字库的字数
            if ((CnChar16x16[wordNum].Index[0]==*cn)
                 &&(CnChar16x16[wordNum].Index[1]==*(cn+1)))
            {
                for(i=0; i<32; i++)
                {   //MSK的位数
                    color=CnChar16x16[wordNum].Msk[i];
                    for(j=0;j<8;j++)
                    {
                        if((color&0x80)==0x80)
                        {
                            lcd_write_data_word(wordColor);
                        }
                        else
                        {
                            lcd_write_data_word(backColor);
                        }
                        color<<=1;
                    }//for(j=0;j<8;j++)结束
                }
            }
        } //for (wordNum=0; wordNum<20; wordNum++)结束
        cn += 2;
        mx += 16;
                        }
    }
}
12、画图片函数
void GUI_Showbmp(unsigned char x, unsigned char  y, unsigned char  wide, unsigned char  high,unsigned short wordColor,unsigned short backColor)
{
        uint16_t j,color = 0, tmp = 0, num = 0;
        setXY(x, y, x+wide-1, y+high-1);
        num = wide * high/8;
        do
  {
                color = bmp[tmp];
                        for (j=0; j<8; j++)
                        {
                                        if ((color&0x80) == 0x80)
                                        {
                                                        setPixel(wordColor);
                                        }
                                        else
                                        {
                                                        setPixel(backColor);
                                        }
                                        color <<= 1;
                        }
                tmp += 1;
        }while(tmp < num);
}



三、运行效果





使用特权

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

本版积分规则

22

主题

49

帖子

0

粉丝