OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 21956|回复: 29

关于正点原子LCD驱动的个人看法及意见

[复制链接]

12

主题

39

帖子

4

精华

高级会员

Rank: 4

积分
724
金钱
724
注册时间
2013-5-10
在线时间
2 小时
发表于 2015-4-24 01:47:13 | 显示全部楼层 |阅读模式
    首先很感谢正点原子的教程,对于本人这两年来学习STM32提供了大量帮助。
   本人手里有块STM32F429 Discovery板子,因为某种原因需要使用8080接口的LCD,而该块开发板自带的LCD接口采用LTDC驱动,所以就在原子哥这里买了一块4.3寸电容触摸屏,淘宝连接:http://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-959568043.14.CzhJLZ&id=39486536522
很快就收到了LCD模块,并搭建好了硬件环境,开始着手软件驱动。
   要写驱动自然少不了下载原子哥的官方教程及源码,但是当我打开正点原子官方的LCD示例代码时还是吃了一惊。虽然一年前就看过正点原子的MiniSTM32的驱动代码,但是此次下载的F407 LCD代码还是让我有不少需要吐槽的地方,主要有以下几点:
   1. 代码实在太长;
   2. 太多的判断lcd id导致代码可读性差;
   3. 注释布局杂乱,且有些注释多余。
对于以上3点总结成一句,我认为就是可阅读性太差。一般来说,能去买开发板学习的人,肯定是对STM32不太了解的人,或者说是初学者。而面对初学者就应该提供最简单的案例及可读性强的代码,但是我想对于一个不太熟悉LCD驱动的初学者来说,直接看正点原子的LCD驱动着实有些吃力。首先巨大的篇幅就让某些人失去了信心,其次过多的if条件判断有给初学者思维上造成了许多干扰。其实我也明白正点原子之所以这样做是为了能用一份代码兼容所有版本的LCD,增强软件的可移植性,也便于出货管理。但是随着LCD型号的不断增多,lcd.c文件的代码也越来越多,单单一个LCD_Init()函数就占据了大量的篇幅。
   针对于以上问题,本人提供了一个方案,即能增强代码的可读性,也能增强代码的可移植性。如下:

lcd.c文件
[mw_shl_code=c,true]typedef struct _LCD_DRV{ uint32_t (*checkid)(void); void (*init)(void); void (*setpixel)(uint16_t color, uint16_t x, uint16_t y); void (*fillrect)(uint16_t color, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); void (*bitmap)(uint16_t color[], uint16_t x0, uint16_t y0, uint16_t width, uint16_t height); void (*clear)(uint16_t color); int (*ioctrl)(uint32_t cmd, uint32_t param); uint16_t (*getpixel)(uint16_t x, uint16_t y); }lcd_drv_t; const lcd_drv_t* lcd_module[] = { &nt35510_module, &st7789v_module, /*any other lcd module*/ }; const lcd_drv_t *lcd_drv = 0; void LCD_GPIO_Cfg(void) { /*由于FMC的GPIO已由CubeMx自动配置,所以这里只设置RESET引脚*/ GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void LCD_FMC_Cfg(void) { /* 由于STM32 CubeMx已自动生成相关FMC配置的代码, 所以这里就无需额外设置 */ } void LCD_Reset(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); delay_ms(100); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); delay_ms(100); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); delay_ms(100); } uint8_t LCD_CheckID(void) { uint32_t id; int i; for(i = 0; i < (sizeof(lcd_module) / sizeof(lcd_module[0])); i++) { id = lcd_module->checkid(); if(0 != id) { printf("Found ID: %x\r\n", id); lcd_drv = lcd_module; return 1; } } return 0; } void LCD_Init(void) { LCD_GPIO_Cfg(); LCD_FMC_Cfg(); LCD_Reset(); if(LCD_CheckID()) { lcd_drv->init(); } } void LCD_DrawPixel(uint16_t color, uint16_t x, uint16_t y) { if(lcd_drv) lcd_drv->setpixel(color, x, y); } void LCD_FillRect(uint16_t color, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { if(lcd_drv) lcd_drv->fillrect(color, x0, y0, x1, y1); } void LCD_DrawBitmap(uint16_t color[], uint16_t x0, uint16_t y0, uint16_t width, uint16_t height) { if(lcd_drv) lcd_drv->bitmap(color, x0, y0, width, height); } void LCD_Clear(uint16_t color) { if(lcd_drv) lcd_drv->clear(color); } [/mw_shl_code]

具体LCD驱动模块文件nt35510.c
[mw_shl_code=c,true]void NT35510_WriteReg(uint16_t LCD_Reg, uint16_t LCD_RegValue) { LCD_WR_REG(LCD_Reg); LCD_WR_DATA(LCD_RegValue); } uint16_t NT35510_ReadReg(uint16_t LCD_Reg) { LCD_WR_REG(LCD_Reg); //写入要读的寄存器序号 delay_us(5); return LCD_RD_DATA(); //返回读到的值 } //开始写GRAM void NT35510_WriteRAM_Prepare(void) { LCD_WR_REG(0X2C00); } void NT35510_DisplayOn(void) { LCD_WR_REG(0X2900); //开启显示 } void NT35510_DisplayOff(void) { LCD_WR_REG(0X2800); //关闭显示 } void NT35510_SetWindow(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1) { NT35510_WriteReg(0x2A00, x0 >> 8); NT35510_WriteReg(0x2A01, x0 & 0XFF); NT35510_WriteReg(0x2A02, x1 >> 8); NT35510_WriteReg(0x2A03, x1 & 0XFF); NT35510_WriteReg(0x2B00, y0 >> 8); NT35510_WriteReg(0x2B01, y0 & 0XFF); NT35510_WriteReg(0x2B02, y1 >> 8); NT35510_WriteReg(0x2B03, y1 & 0XFF); } void NT35510_DrawPixel(uint16_t color, uint16_t x, uint16_t y) { NT35510_SetWindow(x, y, x, y); //设置光标位置 NT35510_WriteRAM_Prepare(); //开始写入GRAM LCD_WR_DATA(color); } //清屏函数 void NT35510_Clear(uint16_t color) { uint32_t i; NT35510_SetWindow(0, 0, Width - 1, Height - 1); NT35510_WriteRAM_Prepare(); for(i = 0; i < Width * Height; i++) { LCD_WR_DATA(color); } } uint32_t NT35510_CheckID(void) { uint8_t id1, id2, id3; id1 = NT35510_ReadReg(0XDA00); //should be 0x00 id2 = NT35510_ReadReg(0XDB00); //should be 0x80 id3 = NT35510_ReadReg(0XDC00); //should be 0x00 printf(" Read ID:%x, %x, %x\r\n", id1, id2, id3); if((id1 == 0x00) && (id2 == 0x80) && (id3 == 0x00)) return 0x35510; else return 0; } void NT35510_Init(void) { delay_ms(50); NT35510_WriteReg(0x0000,0x0001); delay_ms(50); NT35510_WriteReg(0xF000,0x55); NT35510_WriteReg(0xF001,0xAA); NT35510_WriteReg(0xF002,0x52); NT35510_WriteReg(0xF003,0x08); NT35510_WriteReg(0xF004,0x01); ...... } void NT35510_FillRect(uint16_t color, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { uint32_t i; uint16_t width, height; width = x1-x0+1; height = y1-y0+1; NT35510_SetWindow(x0, y0, x1, y1); NT35510_WriteRAM_Prepare(); for(i = 0; i < width * height; i++) { LCD_WR_DATA(color); } } //位图显示函数,位图中每个像素大小为16bit,高字节在前低字节在后 void NT35510_DrawBitmap(uint16_t color[], uint16_t x0, uint16_t y0, uint16_t width, uint16_t height) { uint32_t i; uint16_t x1, y1; x1 = x0 + width - 1; y1 = y0 + height - 1; NT35510_SetWindow(x0, y0, x1, y1); NT35510_WriteRAM_Prepare(); for(i = 0; i < width * height; i++) { LCD_WR_DATA(color); } } int NT35510_IOCtrl(uint32_t cmd, uint32_t param) { switch(cmd) { case LCD_CMD_SLEEP_IN: break; case LCD_CMD_SLEEP_OUT: break; case LCD_CMD_SET_DIR: break; default: break; } return 0; } const lcd_drv_t nt35510_module = { NT35510_CheckID, NT35510_Init, NT35510_DrawPixel, NT35510_FillRect, NT35510_DrawBitmap, NT35510_Clear, NT35510_IOCtrl }; [/mw_shl_code]

    这种将LCD驱动接口与具体LCM模块隔离的方法,既能便于日后的维护,也方便用户阅读代码。如果日后需要扩展LCD的功能,可以直接添加到LCD_IOCtrl()中,整个代码架构清晰,结构简单,更易于移植。至于如何自动判断LCD ID的功能,请参阅LCD_CheckID()函数。上层统一调用lcd.c中的函数而不用关心具体是那个模块。当然你还可以对该代码进行进一步的优化。
   为了快速搭建软件工程,本人使用STM32CubeMX工具生成代码模板,并编写了上述两个文件。要注意的是,如果你是使用的正点原子的模板或是自己搭建的模板,则需要实现LCD_GPIO_Cfg()及LCD_FMC_Cfg()两个函数,由于STM32CubeMX在配置GPIO及FMC时,已经自动生成了相应的代码,所以这里为空。另外,我的硬件上时将LCD_RS接在了FMC_A0上的,所以LCD_DATA的地址为0x6C000002,请针对于自己的硬件自行修改。工程源码请见附件。
   当然以上也只是我个人的意见,可能作为开发板厂商,你们需要考虑的更多。但是我还是认为,你们的客户群主要还是初学者,对于初学者来说,最简单的就是最好的(当然我的方案也不是最简单的)。如果正点原子日后生意蒸蒸日上,支持的LCD越来越多,岂不是lcd.c文件就要变成几万行的代码了。
   下面上传两张STM32F429 Discovery板子与正点原子4.3寸电容屏的照片:


CubeTest.zip

4.24 MB, 下载次数: 3531

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2015-4-24
在线时间
72 小时
发表于 2015-12-1 20:26:28 | 显示全部楼层
你是傻逼吧,原子那是为了兼容其他屏,你个213
回复 支持 0 反对 5

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13079
金钱
13079
注册时间
2012-11-26
在线时间
3809 小时
发表于 2015-4-24 08:09:07 | 显示全部楼层

呵呵  太多判断ID  那是因为要适配很多屏幕   


注释比较多??大公司里,每一句代码都必须有注释!!!
 
另外其余你吐槽的地方  也不想多说了 呵呵


每一句都是初学者,呵呵,初学者最喜欢看跑马灯吧,   呵呵呵

学无止境
回复 支持 0 反对 1

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-4-28 22:45:44 | 显示全部楼层
回复【5楼】asd:
---------------------------------
谢谢指正,我们努力改善。
LCD到时候我会亲自录视频讲解,希望大家能看懂。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2017-2-28
在线时间
11 小时
发表于 2017-5-24 15:40:28 | 显示全部楼层
他的这块我搞了一个多月了,代码太多,而且是到处调用,很乱。说是用HAL库的东东,多数为标准库的东东。代码没有那种象HAL库一样直上而下的风格,一条条代码看,很多不兼容HAL库的标准,因我是从HAL库及STM32CubeMX学的,一个初始化,到处都是,个人感觉很乱。象LTDC的硬件文件做好后,在LCD直接调用好了,却又发现LTDC调用LCD的东东,LCD又调用LTDC的东东,中间又夹杂着DMA2D的东东,所以头大,还未完全搞清,很难道理解,特别是代码比较多的时候。没有树的概念,想移植搞自己的代码很难,必须每行代码看懂后再能移植。(比如在LCD里面,却有着SRAM初始化的东东,理应另建一个SRAM或将些移到FMC里去初始化,因为这个东东是FMC模块内的一部分。因为个人理解,LCD理应是最抽象层的东东,不应牵涉硬件,而应由LTDC里面做好函数,直接在LCD中调用。因为我的LCD 是7016的,搞了好久才明白,LCD的SRAM用不着。
回复 支持 1 反对 0

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-4-28
在线时间
0 小时
发表于 2015-4-28 17:53:35 | 显示全部楼层
人家好心好意的来分享,二楼喷什么喷啊

本人也觉得原子的为了兼容性导致代码量太大,得不偿失

我也一直想说这个问题,一直没有机会,没有想到有和我一样感想的人

虽然我不是菜鸟,但也不是老手,当年学习32的时候也是用原子的程序,尤其看lcd的时候,那庞大的代码量确实把我吓了一跳,我看不懂。
无奈,我只有一点点的注释,一点点删除,一次次的下载验证,,,直到lcd不能驱动了,Ctrl+Z在回头删除别的,,直到删除的代码再也不能删除,,再一句句读;
当读懂了,,复杂的我也就看懂了,也会用了,
我也尝试看过教程,但是教程我发现还不如看数据手册来的快,教程几乎每一章都有这一句:“下面的代码比较简单,我就多不说了”,,,其实下面的代码对于初学者:根本不简单。


其实原子不必要给lcd只提供一个代码,,有最简的,,有考虑兼容性的,,还有各种方法的,,,,还可以额外的一个文件夹提供其他的lcd的初始化代码的;
不仅仅是说lcd,,每一个程序都应该如此



原子的分类信息做的不好,不仅仅是代码,,得不偿失,,,,网站也是,有用的东西搜索不到,好不容易找到了,可能是做完项目很久了

说这些只是为了好的东西更好
回复 支持 1 反对 0

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2015-4-24 15:25:33 | 显示全部楼层
见仁见智吧,我比较喜欢原子的lcd初始化代码,兼容性很强。
当然,如果买了某块确定的屏幕之后,lcd控制器的id就固定了,你要是嫌弃if else多,代码量大,就把其它所有的用不着的id的代码注释掉。
我就是这样,省了10k的代码量,初始化速度也变快了一些。
注释不嫌多(只要是正确的),不管你是给别人看还是给自己看(一段时间后自己也有可能忘记自己以前写代码的思路了),我觉得蛮好的。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-4-24 23:31:15 | 显示全部楼层
谢谢楼主的建议,确实对于初学者,可能比较难理解,我们考虑后续出一个单个LCD版本的,方便初学者理解。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

39

帖子

4

精华

高级会员

Rank: 4

积分
724
金钱
724
注册时间
2013-5-10
在线时间
2 小时
 楼主| 发表于 2015-4-28 22:29:53 | 显示全部楼层
回复【5楼】asd:
---------------------------------
说的很有道理,谢谢分享。
回复 支持 反对

使用道具 举报

1

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2013-5-29
在线时间
20 小时
发表于 2015-11-12 11:37:35 | 显示全部楼层
每一种屏都附一个初始代码是最好的
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-12-1 20:59:34 | 显示全部楼层
楼上的有点过激了,个人观点:原子哥驱动屏幕的的代码量确实很大,但是看得明白的人一般删了后就剩没多少了,我将近3000行的代码把该删的都删了后也就剩个不到500行,对于楼主的代码我觉得结构上写的确实挺好的,但对于初学者那样写不一定能看懂,相对原子哥代码来说如果删减后还是比较好懂的,综合考虑楼主的代码适合项目,原子哥的代码适合教学,先把教学的代码写出来了,后期自己强化再写有自己风格的代码更合适。楼主自己也说了跟原子哥学的,不也是这样学过来.....师傅领进门修行看个人!
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

13

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2012-11-17
在线时间
18 小时
发表于 2015-12-1 22:58:47 | 显示全部楼层
楼主的代码不错,初学者以后也是要学会这样的代码组织的,多利用结构体
回复 支持 反对

使用道具 举报

79

主题

397

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1806
金钱
1806
注册时间
2015-9-21
在线时间
556 小时
发表于 2015-12-2 10:08:30 | 显示全部楼层
感觉和ARDUINO中的程序差不多啊
回复 支持 反对

使用道具 举报

12

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-3-4
在线时间
23 小时
发表于 2016-3-7 21:46:26 | 显示全部楼层
大神,你用407ZET6 IO口模拟驱动过液晶屏吗,求代码
回复 支持 反对

使用道具 举报

3

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
776
金钱
776
注册时间
2015-2-28
在线时间
251 小时
发表于 2016-3-18 15:24:45 | 显示全部楼层
觅风 发表于 2016-3-7 21:46
大神,你用407ZET6 IO口模拟驱动过液晶屏吗,求代码

模拟IO口驱动,或者SPI驱动都不难 看看时序图就行了
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-9-4
在线时间
18 小时
发表于 2016-4-26 18:12:14 | 显示全部楼层
老子看啦好多天了  还是没看懂!!!
回复 支持 反对

使用道具 举报

21

主题

129

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2015-6-17
在线时间
136 小时
发表于 2016-4-26 18:27:59 | 显示全部楼层
其实感觉原子哥的代码写的不错,接触一段时间之后你可以把多余的其他LCD代码去掉,我就是这么做的,精简代码。
回复 支持 反对

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2015-12-20
在线时间
24 小时
发表于 2017-5-24 15:05:31 | 显示全部楼层
读代码前把无关的都删掉
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-7-13
在线时间
8 小时
发表于 2017-7-13 09:29:34 | 显示全部楼层
jermy_z 发表于 2015-4-24 08:09
呵呵&nbsp;&nbsp;太多判断ID&nbsp;&nbsp;那是因为要适配很多屏幕&nbsp;&nbsp;&nbsp;

确实对于新手来说 不是很容易 去学习,  增加学习难度。 教程确切的来说  越通俗越好。  
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-7-13
在线时间
8 小时
发表于 2017-7-13 10:03:15 | 显示全部楼层
hsy571639119 发表于 2015-12-1 20:26
你是傻逼吧,原子那是为了兼容其他屏,你个213

这是教程 不是项目  兼容再好 学习者看着累有什么用呢 ,
回复 支持 反对

使用道具 举报

23

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2014-3-9
在线时间
103 小时
发表于 2017-7-13 10:23:08 | 显示全部楼层
填充方式大多是绘点来实现的,如果用填充+dma速度会快不止一倍
魔法王子
回复 支持 反对

使用道具 举报

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
发表于 2017-7-13 10:29:51 | 显示全部楼层
我用的是ILI9341 2.8''屏,将其它屏的驱动判断删掉,只剩ILI9341就清晰多了。

lcd_ILI9341.zip

8.22 KB, 下载次数: 627

回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2017-8-30 17:15:37 | 显示全部楼层
cslau168 发表于 2017-5-24 15:40
他的这块我搞了一个多月了,代码太多,而且是到处调用,很乱。说是用HAL库的东东,多数为标准库的东东。代 ...

说的不错,代码就应该有树的概念层的概念这样移植才不吃神,不费时间。混沌在一起实在不好
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2017-12-5 09:53:19 | 显示全部楼层
hsy571639119 发表于 2015-12-1 20:26
你是傻逼吧,原子那是为了兼容其他屏,你个213

注意素质,技术讨论别人身攻击
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2017-12-5 09:56:39 | 显示全部楼层
cslau168 发表于 2017-5-24 15:40
他的这块我搞了一个多月了,代码太多,而且是到处调用,很乱。说是用HAL库的东东,多数为标准库的东东。代 ...

非常赞同,这句话“没有HAL库那种至上而下风格,树的概念没有”,这点官方代码和微雪代码写的比较好
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

5

主题

115

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2014-9-29
在线时间
276 小时
发表于 2017-12-5 10:07:10 | 显示全部楼层
不止楼主一个人这样,不同的是楼主忍不住动手了,感谢分享
回复 支持 反对

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-1-17 15:59:53 | 显示全部楼层
目前已经把这个驱动移植到linux上面去
回复 支持 反对

使用道具 举报

23

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2015-5-30
在线时间
9 小时
发表于 2018-11-12 09:34:46 | 显示全部楼层
大神还在线吗?我目前就买了一块你这种驱动的屏,我发现我图片显示颜色失真了,请问是哪里的原因?
电容屏_看图王.jpg
要学的东西很多,不要慌,一步一个脚印,扎扎实实的学
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-5-10
在线时间
2 小时
发表于 2020-10-15 16:38:02 | 显示全部楼层
同意楼主确实是有点乱,功能没问题,兼容没问题,但是代码风格确实不好,把各个型号的驱动进行函数封装比较好,除了学芯片,最好能学到前辈的优秀的书写代码的风格规范
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-7-27
在线时间
3 小时
发表于 2020-10-23 17:25:22 | 显示全部楼层
其实原子的代码也好,说明文档也好,都是投入了很大的心血去干这件事,很认真,很好读,很全面,所谓众口难调,原子继续努力吧,既然有心声就尽量去满足,毕竟你在做企业,而大家都是上帝嘛
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-29 17:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表