TA的每日心情 | 郁闷 2024-10-28 10:11 |
---|
签到天数: 1703 天 连续签到: 1 天 [LV.Master]伴坛终老
|
本帖最后由 nemon 于 2013-11-28 11:20 编辑
以前弄段式LCD显示的时候,基本上是这个顺序:先看datasheet,搞明白地址和段的关系,然后按电路推导出地址和显示字符的关系,要是弄到一块没有电路图的模块,就手工把图画出来。总觉得有些费功夫,虽然想做个省事儿的工具,可每次弄弄也就出来了,就一直没动手。这次NXP推出了COG PCA8538的模块,COG驱动IC和LCD连为一体,靠抄板是无法获得地址映射的关系的,这唤起了楼主隐藏已久的做一个自动检测段式LCD映射关系的欲望。
(一)项目描述
这次的项目目标是做一个自动的映射关系识别系统,分为2部分
1)上位机响应MCU的串口消息调用摄像头对当前的LCD屏拍照,采集照片;
2)编制软件,对采集到的照片进行定义、分析,来推断出当前照片组的映射关系;
(二)项目实现
首先使用CY8CKIT042按此连接:
实物是这样的:
代码:- /* ========================================
- *
- * Copyright YOUR COMPANY, THE YEAR
- * All Rights Reserved
- * UNPUBLISHED, LICENSED SOFTWARE.
- *
- * CONFIDENTIAL AND PROPRIETARY INFORMATION
- * WHICH IS THE PROPERTY OF your company.
- *
- * ========================================
- */
- #include <device.h>
- #include <algo.h>
- uint8 cmd_init[24]={
- 0x80,0x3A,0x80,0xD8,0x80,0x18,0x80,0xD4,0x80,0xC9,0x80,0x45,0x80,0x73,0x80,0x00,
- 0x80,0xD0,0x80,0xB3,0x80,0x01,0x80,0x39};
- uint8 cmd_draw[7]={0x80,0x80,0x80,0x90,0x80,0xA0,0x20};
- void main()
- {
- //show3x93codes();
- /* Place your initialization/startup code here (e.g. MyInst_Start()) */
- /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
- uint32 i,f;
- uint8 m;
- Pin_RED_Write(0);
- CyDelay(200);
- Pin_RED_Write(1);
- I2C_M_Start();
- UART_1_Start();
-
- f=I2C_M_I2CMasterSendStart(0x38, 0x0);
- for(i=0;i<24;i++)f=I2C_M_I2CMasterWriteByte(cmd_init[i]);
- for(i=0;i<7;i++)f=I2C_M_I2CMasterWriteByte(cmd_draw[i]);
- for(i=0;i<204;i++)f=I2C_M_I2CMasterWriteByte(0x00);
- f=I2C_M_I2CMasterSendStop();
- UART_1_UartPutCRLF('-');
-
- for(;;)
- {
- /* Place your application code here. */
- for (m=0;m<12;m++){
- CyDelay(1000);
- Pin_RED_Write(1);
- CyDelay(1000);
- Pin_RED_Write(0);
- f=I2C_M_I2CMasterSendStart(0x38, 0x0);
- for(i=0;i<24;i++)f=I2C_M_I2CMasterWriteByte(cmd_init[i]);
- for(i=0;i<7;i++)f=I2C_M_I2CMasterWriteByte(cmd_draw[i]);
- for(i=0;i<204;i++)f=I2C_M_I2CMasterWriteByte(getRamMask(m,i));
- f=I2C_M_I2CMasterSendStop();
- Pin_RED_Write(0);
- UART_1_UartPutCRLF(m<10?'0'+m:'A'+m-10);
- }
-
-
- CyDelay(1000);
- Pin_RED_Write(1);
- CyDelay(1000);
- Pin_RED_Write(0);
- f=I2C_M_I2CMasterSendStart(0x38, 0x0);
- for(i=0;i<24;i++)f=I2C_M_I2CMasterWriteByte(cmd_init[i]);
- for(i=0;i<7;i++)f=I2C_M_I2CMasterWriteByte(cmd_draw[i]);
- for(i=0;i<204;i++)f=I2C_M_I2CMasterWriteByte(0x00);
- f=I2C_M_I2CMasterSendStop();
- Pin_RED_Write(0);
- UART_1_UartPutCRLF('-');
- }
- }
- /* [] END OF FILE */
复制代码 然后后就可以获得PCA8538的204*8的地址对应的13个图:
后面的工作语言是C#了,做出的东西请看图:
这是一个通用工具,左侧是图片文件选择区,用来显示用到的图像文件;
右侧是单元定义区,用于定义显示单元的信息;
中间是图像浏览和操作区,用于显示图像、调整和显示单元定义;
下面来讲解一下用法,按左上角的按钮可以选取工作文件,然后点击文件名,图片会画在中间的操作区。
用鼠标点击操作区,可以画出红色矩形,这个软件就是用矩形中心像素的灰度值来检测是否显示单元、显示单元是否为有效的。
红色矩形的坐标和大小会反映到右侧靠上的控件里,可以为单元命名,还可以把单元的格式改成矩阵。对于矩阵来说,会有行数和列数2个选项,这样就不必繁琐的一个一个定义了。
有5个按钮,含义如下:
+:表示将当前的矩形定义增加到定义列表中;
-:删除定义列表中当前选中的定义;
∧:表示用定义列表中当前选中的定义覆盖当前的矩形定义;
∨:表示用当前的矩形定义覆盖定义列表中当前选中的定义;
C:表示清空定义列表;
定义列表下面有几个选项:
左边的1:选中时表示LCD白底黑字,以“1”的颜色作为区分是否点亮的依据;
右边的1与左边类似,但示LCD黑底白字;
bits表示地址需要用几位,需要注意的是,这里的地址是到bit的所以要比Bit的地址多Log(8,2)=3位,而且这里的位数是要和左边的工作文件对应的。
save按钮用于保存当前列表中的所有定义(也就是不包括上面矩形区的定义);
load按钮用于读取保存的定义到列表中;
当定义和图像文件都准备好之后,就可以按左下角的“GO!”来生成映射表了。CVS格式的,也就是说excel也能打开的纯文本格式。
比较不同的映射表是否一致,还可以知道cog是否有故障。
这里是一个为 PCA8538生成的映射表:
result_20131122202436.rar
(4.82 KB, 下载次数: 587)
|
|