[活动专区] 【AT-START-L021测评】1、驱动8位并口屏

[复制链接]
 楼主| sujingliang 发表于 2024-11-24 15:06 | 显示全部楼层 |阅读模式
本帖最后由 sujingliang 于 2024-11-25 15:38 编辑

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

110537ozxlxzzlxcm774pc.png.thumb.jpg
一、谈一下对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通过三极管驱动,用料非要这么足吗?这应该是为1.8v供电准备的,对于3.3v供电应该可以不用。
5、提供arduino uno连接接口。

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

  1. #define LCD_CS  GPIOB,GPIO_PINS_10      //PB10
  2. #define LCD_RS  GPIOA,GPIO_PINS_8       //PA8
  3. #define LCD_WR  GPIOB,GPIO_PINS_4       //PB4
  4. #define LCD_RD  GPIOB,GPIO_PINS_3       //PB3
  5. #define LCD_RST GPIOB,GPIO_PINS_5       //PB5
  6. #define LCD_LED GPIOA,GPIO_PINS_10      //PA10

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

  5. // 初始化GPIO配置数组
  6. GPIO_PinConfig dbPins[NUM_BITS] = {
  7.     {LCD_DB0},
  8.     {LCD_DB1},
  9.     {LCD_DB2},
  10.     {LCD_DB3},
  11.     {LCD_DB4},
  12.     {LCD_DB5},
  13.     {LCD_DB6},
  14.     {LCD_DB7}
  15. };
  16. void gpio_lcd_write_data_word(uint8_t* data, size_t length) {
  17.     for (int i = 0; i < length; i++) {
  18.         for (int bit = 0; bit < NUM_BITS; bit++) {
  19.             // 检查当前位是否为1
  20.             if (data[i] & (1 << bit)) {
  21.                 gpio_bits_set(dbPins[bit].GPIOx, dbPins[bit].GPIO_Pin);
  22.             } else {
  23.                 gpio_bits_reset(dbPins[bit].GPIOx, dbPins[bit].GPIO_Pin);
  24.             }
  25.         }
  26.                                 LCD_WR_CLR;
  27.                                 LCD_WR_SET;
  28.         // 如果需要,可以在这里添加延时或其他处理
  29.     }
  30. }
4、写命令函数
  1. void lcd_write_comm_word(uint16_t cmd)
  2. {
  3.     unsigned char c[2];
  4. //    c[0] = (cmd >> 8) & 0xFF;
  5. //    c[1] = cmd & 0xFF;

  6.                 c[0]=0x00;
  7.                 c[1]=cmd;
  8.     LCD_CS_CLR;
  9.     LCD_RS_CLR;

  10.     gpio_lcd_write_data_word(c, 2);

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

  6.     LCD_CS_CLR;
  7.     LCD_RS_SET;

  8.     gpio_lcd_write_data_word(c, 2);

  9.     LCD_CS_SET;
  10. }
6、写寄存器函数
  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. }
7、LCD 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. }
8、LCD初始化函数
  1. void InitLCD()
  2. {
  3.     //printf("reset\r\n");
  4.                 lcd_gpio_init();
  5.         
  6.     LCD_Reset();
  7.                 LCD_RD_SET;
  8.     Delay_Ms(150);

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

  11.     LCD_CS_CLR;

  12.     lcd_write_register_word(0x10, 0x0000);
  13.     lcd_write_register_word(0x11, 0x0000);
  14.     lcd_write_register_word(0x12, 0x0000);
  15.     lcd_write_register_word(0x13, 0x0000);
  16.     lcd_write_register_word(0x14, 0x0000);
  17.     Delay_Ms(40);

  18.     lcd_write_register_word(0x11, 0x0018);
  19.     lcd_write_register_word(0x12, 0x6121);
  20.     lcd_write_register_word(0x13, 0x006F);
  21.     lcd_write_register_word(0x14, 0x495F);
  22.     lcd_write_register_word(0x10, 0x0800);
  23.     Delay_Ms(10);
  24.     lcd_write_register_word(0x11, 0x103B);
  25.     Delay_Ms(50);
  26.     lcd_write_register_word(0x01, 0x031C);  //0x021C 控制反转
  27.     lcd_write_register_word(0x02, 0x0100);
  28.     lcd_write_register_word(0x03, 0x1038);
  29.                
  30.     lcd_write_register_word(0x07, 0x0000);
  31.     lcd_write_register_word(0x08, 0x0808);
  32.     lcd_write_register_word(0x0b, 0x1100);
  33.     lcd_write_register_word(0x0c, 0x0000);
  34.     lcd_write_register_word(0x0f, 0x0D01);
  35.     lcd_write_register_word(0x15, 0x0020);
  36.     lcd_write_register_word(0x20, 0x0000);
  37.     lcd_write_register_word(0x21, 0x0000);

  38.     lcd_write_register_word(0x30, 0x0000);
  39.     lcd_write_register_word(0x31, 0x00DB);
  40.     lcd_write_register_word(0x32, 0x0000);
  41.     lcd_write_register_word(0x33, 0x0000);

  42.     lcd_write_register_word(0x34, 0x00DB);
  43.     lcd_write_register_word(0x35, 0x0000);
  44.     lcd_write_register_word(0x36, 0x00AF);
  45.     lcd_write_register_word(0x37, 0x0000);
  46.     lcd_write_register_word(0x38, 0x00DB);
  47.     lcd_write_register_word(0x39, 0x0000);

  48.     lcd_write_register_word(0x50, 0x0000);
  49.     lcd_write_register_word(0x51, 0x0808);
  50.     lcd_write_register_word(0x52, 0x080A);
  51.     lcd_write_register_word(0x53, 0x000A);
  52.     lcd_write_register_word(0x54, 0x0A08);
  53.     lcd_write_register_word(0x55, 0x0808);
  54.     lcd_write_register_word(0x56, 0x0000);
  55.     lcd_write_register_word(0x57, 0x0A00);
  56.     lcd_write_register_word(0x58, 0x0710);
  57.     lcd_write_register_word(0x59, 0x0710);

  58.     lcd_write_register_word(0x07, 0x0012);
  59.     Delay_Ms(50);
  60.     lcd_write_register_word(0x07, 0x1017);
  61.     lcd_write_comm_word(0x22);
  62.     LCD_CS_SET;
  63.     LCD_LED_SET;

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

  13.             for (wordByte=0; wordByte<16; wordByte++)
  14.             {
  15.                 color = Font_Data[wordNum].dat[wordByte];
  16.                 for (j=0; j<8; j++)
  17.                 {
  18.                     if ((color&0x80) == 0x80)
  19.                     {
  20.                         setPixel(wordColor);
  21.                     }
  22.                     else
  23.                     {
  24.                         setPixel(backColor);
  25.                     }
  26.                     color <<= 1;
  27.                 }
  28.             }
  29.             cn++;
  30.             mx +=8;
  31.          }
  32.         else
  33.         {
  34.         setXY(mx, my, mx+15, my+15);
  35.         for (wordNum=0; wordNum<(sizeof(CnChar16x16) / sizeof(CnChar16x16[0])); wordNum++)
  36.         {   //wordNum扫描字库的字数
  37.             if ((CnChar16x16[wordNum].Index[0]==*cn)
  38.                  &&(CnChar16x16[wordNum].Index[1]==*(cn+1)))
  39.             {
  40.                 for(i=0; i<32; i++)
  41.                 {   //MSK的位数
  42.                     color=CnChar16x16[wordNum].Msk[i];
  43.                     for(j=0;j<8;j++)
  44.                     {
  45.                         if((color&0x80)==0x80)
  46.                         {
  47.                             lcd_write_data_word(wordColor);
  48.                         }
  49.                         else
  50.                         {
  51.                             lcd_write_data_word(backColor);
  52.                         }
  53.                         color<<=1;
  54.                     }//for(j=0;j<8;j++)结束
  55.                 }
  56.             }
  57.         } //for (wordNum=0; wordNum<20; wordNum++)结束
  58.         cn += 2;
  59.         mx += 16;
  60.                         }
  61.     }
  62. }
12、画图片函数
  1. void GUI_Showbmp(unsigned char x, unsigned char  y, unsigned char  wide, unsigned char  high,unsigned short wordColor,unsigned short backColor)
  2. {
  3.         uint16_t j,color = 0, tmp = 0, num = 0;
  4.         setXY(x, y, x+wide-1, y+high-1);
  5.         num = wide * high/8;
  6.         do
  7.   {
  8.                 color = bmp[tmp];
  9.                         for (j=0; j<8; j++)
  10.                         {
  11.                                         if ((color&0x80) == 0x80)
  12.                                         {
  13.                                                         setPixel(wordColor);
  14.                                         }
  15.                                         else
  16.                                         {
  17.                                                         setPixel(backColor);
  18.                                         }
  19.                                         color <<= 1;
  20.                         }
  21.                 tmp += 1;
  22.         }while(tmp < num);
  23. }



三、运行效果
1.jpg 2.jpg 3.jpg tutieshi_480x272_4s.gif


test1.rar (73.6 KB, 下载次数: 7)

呐咯密密 发表于 2024-11-24 18:59 | 显示全部楼层
这个显示效果还行
菜鸟的第一步 发表于 2024-11-24 19:02 | 显示全部楼层
第一篇就直接点亮屏幕了啊
lulugl 发表于 2024-11-24 22:41 | 显示全部楼层
我都货都没有收到,你的大作就出来了。太强了。
xionghaoyun 发表于 2024-11-25 08:51 | 显示全部楼层
兄弟 应该上传工程
qiangtech 发表于 2024-11-25 10:13 | 显示全部楼层
这么快,
cooldog123pp 发表于 2024-11-25 14:01 | 显示全部楼层
这个显示效果还行,我看别的参与者都还没有收到板卡,你就已经发帖测评了,给力。
海市蜃楼神秘 发表于 2025-3-2 21:11 | 显示全部楼层
这个屏官方有卖的嘛,我有一个开发板,没有屏幕
深渊之海 发表于 2025-3-11 13:50 | 显示全部楼层
看起来挺流畅的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

146

帖子

3

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