第一周工作纪要 玻璃与客户端硬件连接方式、芯片点阵显示逻辑、测试搭建、程序调试流程及产品版本命名规则。玻璃与客户端硬件连接方案电气连接玻璃面板上的引出电极需通过FPC/FFC等柔性连接器与客户端主板建立电气连接必须通过导线进行信号引出。主要连接方式拐角压接方式玻璃上的电极通过压接拐角实现导通再连接客户端。FPC柔性电路板连接FPC两面均有电极通过ACF膜在生产时压接到玻璃上实现导通。客户端通常设有FPC座带卡扣FPC直接插入卡槽扣紧固定属于较常用的方式。FFC连接与FPC类似后续根据实际情况再做应用。芯片、点阵显示与内部逻辑驱动芯片与点阵列驱动芯片负责驱动屏内部的像素点阵点的阵列通过控制点的亮灭来显示图案。COM与SEG行称为COM列称为SEG。IC内部逻辑框图会驱动IC内部逻辑将COM行与SEG列分别映射到点阵的交叉点上从而组合驱动不同点以显示图像。端子与接口分配芯片端子基本都有用但需根据客户端应用需求决定引出数量。职责分工LCD部门负责玻璃基板的物理设计与光学特性电性能参数如驱动电压、时序由IC规格书和硬件设计决定软件部门需明确告知LCD部门每个COM/SEG端子的对应关系及哪些端子需要引出。液晶灌注、偏光片贴附、ITO走线LCD部门不负责芯片内部的逻辑映射。驱动IC的COM/SEG引脚功能是固定的软件工程师需根据IC数据手册和玻璃图纸确认哪些引脚需要引出、哪些悬空并编写初始化代码配置扫描方向如MX/MY和占空比Duty。内外部说明内部和外部的端子连线均需说明例如131个SEG中实际使用128个或60个不等具体是用哪几个必须明确。测试工装与通用测试版硬件搭建拿到图纸和型号后利用已有的通用驱动板51最小系统电路进行测试。板上集成多规格FPC座如0.5、0.8、1.0、1.2等可根据不同产品直接焊接或连线对应尺寸。外接器件和连线通过排口如P口进行连接引脚分配可按照规则顺次指定如从P1.0开始依次对应。程序调试流程与规范软件测试员最核心的工作是验证MCU与屏幕的通信时序是否匹配开发与修改原则新项目需自行编写或参考已有同款IC程序主要工作是基于现有工程进行参数修改和接口子程序适配。调试不只是点亮还需遵循标准测试流程如全显、走横、走竖、三角区检测等并根据生产或客户反馈调整画面显示时间或视觉效果变深、变浅。初始化与指令设置根据图纸要求及IC资料计算并设置Duty占空比、偏压Bias如1/9偏压以及VOP或VLCD电压值。通过IC资料中的指令集合指令表配置显示开关、扫描方向、起始页、反显、全显及复位等参数。软件测试时必须用示波器抓取SPI通信波形验证SCLK频率、数据建立/保持时间是否满足IC时序要求。若通信不稳定如花屏优先降低SPI速率。如4线SPI模式必须确认SCLK频率、CSB片选时序是否满足ST7567的要求VOP电压调节细节芯片内部可自主生成部分电压VLCD值通过公式及参数如RR、EV计算确定。初始图纸中电压值如10V可能存在偏差调程序时需按照设定调整同时需与玻璃制作方LCD部门联动观察实际显示效果必要时微调参数并反馈偏差。显示规范与画面迭代常规流程全显检测屏幕是否存在亮点/暗点确保所有像素可控、走横向下滚动检测行COM驱动是否正常、走竖向右滚动检测列SEG驱动是否正常苛刻图形如带有尖角的三角区用于检测产品效果。新增点阵产品需在流程中增加“整机显示效果测试页”显示客户提供的Logo画面或标准文字图案作为产线目检的参照标准。可上下滑动或直接展示图片用以直观评估整机显示效果。单款产品若生产工时受影响或有特殊需求可按要求单独修改和增删页面。产品命名规则与项目管理型号命名由计划部根据销售订单及产品参数如点阵大小128*64进行命名。版本演进型号后通常带有版号如初始的AAA及代表显示模式、视角的后缀。未出样品前仅修改图纸版本号并记录变更履历。一旦出过样品若后续改动玻璃则变更为ABA若改动背光变更为AAB涉及软件则继续往后排。代码部分对于延时/********************************************************** MCU AT89C2951 ¾§Õñ 12MHz ¶ÔÓÚ΢Ãî¼¶ÑÓʱ ±ØÐëʹÓà _nop_(); **********************************************************/ /******************************************************************************* 精确延时函数 delay_1() 1个时钟周期 delay_10() 10个时钟周期 delay_100() 100个时钟周期 delay_1000() 1000个时钟周期 delay_1000000() 1000000个时钟周期 非精确延时函数 delay_8us(unsigned char n) n倍8个时钟周期的整数倍 delay_8ms(unsigned char n) n倍1000个时钟周期的整数倍 误差千分之八 delay_8s(unsigned char n) n倍1000000个时钟周期的整数倍 误差百万分之八 delay_us(unsigedn char n) n倍8个时钟周期的整数倍 delay_ms(unsigend char n) 约等于毫秒 delay_ss(unsigned char n) 约等于秒 delay_0(unsigned char n) 1个单位延时 delay_00(unsigned char n) 10个单位延时 delay_000(unsigned char n) 100个单位延时 delay_0000(unsigned char n) 1000个单位延时 *******************************************************************************/ //#ifdef DELAY_1 /* //delay_1us() 1个时钟周期 #define delay_1us() nop() //delay_10us() 10个时钟周期 void delay_10us(void) { nop(); nop(); nop(); nop(); nop(); nop(); } //delay_100us() 100个时钟周期 void delay_100us(void) { unsigned char i; for(i47;i0;i--) { ; } nop(); } */ //delay_1ms() 1000个时钟周期 void delay_1ms(void) { unsigned char i,j; for(j38;j0;j--) { ; } for(i9;i0;i--) { nop(); for(j49;j0;j--) { ; } } } //delay_1s() 1000000个时钟周期 void delay_1s(void) { unsigned char i,j,k; nop(); for(j46;j0;j--) { ; } for(j99;jgt;0;j--) { _nop_(); for(k48;kgt;0;k--) { ; } } for(i99;i0;i--) { for(j48;j0;j--) { ; } for(j99;jgt;0;j--) { _nop_(); for(k48;kgt;0;k--) { ; } } } } //delay_us(unsigned char n) n倍8个时钟周期的整数倍 void delay_us(unsigned char n) { unsigned char i; for(i0;in;i) { ; } } //delay_ms(unsigned char n) n倍1000个时钟周期的整数倍 误差千分之八 void delay_ms(unsigned char n) { unsigned char i; for(i0;in;i) { delay_1ms(); } } //delay_ss(unsigned char n) n倍1000000个时钟周期的整数倍 误差百万分之八 void delay_ss(unsigned char n) { unsigned char i; for(i0;in;i) { delay_1s(); } } //#endif4线SPI/****************************************************** write_com(uchar) write_dat(uchar) *******************************************************/ //写指令 void write_com(unsigned char byte) { unsigned char i; cd0; for(i0;ilt;8;i) { sck0; _nop_(); _nop_(); sda(bit)(byteamp;0x80); bytebytelt;lt;1; sck1; _nop_(); _nop_(); } } //写数据 void write_dat(unsigned char byte) { unsigned char i; cd1; for(i0;i8;i) { sck0; nop(); nop(); sda(bit)(byte0x80); sck1; bytebyte1; nop(); nop(); } }/*-------------------------------------------------------------------------- REG52.H Header file for generic 80C52 and 80C32 microcontroller. Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved. --------------------------------------------------------------------------*/ #ifndef __REG52_H__ #define __REG52_H__ /* BYTE Registers */ sfr P0 0x80; sfr P1 0x90; sfr P2 0xA0; sfr P3 0xB0; sfr PSW 0xD0; sfr ACC 0xE0; sfr B 0xF0; sfr SP 0x81; sfr DPL 0x82; sfr DPH 0x83; sfr PCON 0x87; sfr TCON 0x88; sfr TMOD 0x89; sfr TL0 0x8A; sfr TL1 0x8B; sfr TH0 0x8C; sfr TH1 0x8D; sfr IE 0xA8; sfr IP 0xB8; sfr SCON 0x98; sfr SBUF 0x99; /* 8052 Extensions */ sfr T2CON 0xC8; sfr RCAP2L 0xCA; sfr RCAP2H 0xCB; sfr TL2 0xCC; sfr TH2 0xCD; /* BIT Registers */ /* PSW */ sbit CY PSW^7; sbit AC PSW^6; sbit F0 PSW^5; sbit RS1 PSW^4; sbit RS0 PSW^3; sbit OV PSW^2; sbit P PSW^0; //8052 only /* TCON */ sbit TF1 TCON^7; sbit TR1 TCON^6; sbit TF0 TCON^5; sbit TR0 TCON^4; sbit IE1 TCON^3; sbit IT1 TCON^2; sbit IE0 TCON^1; sbit IT0 TCON^0; /* IE */ sbit EA IE^7; sbit ET2 IE^5; //8052 only sbit ES IE^4; sbit ET1 IE^3; sbit EX1 IE^2; sbit ET0 IE^1; sbit EX0 IE^0; /* IP */ sbit PT2 IP^5; sbit PS IP^4; sbit PT1 IP^3; sbit PX1 IP^2; sbit PT0 IP^1; sbit PX0 IP^0; /* P3 */ sbit RD P3^7; sbit WR P3^6; sbit T1 P3^5; sbit T0 P3^4; sbit INT1 P3^3; sbit INT0 P3^2; sbit TXD P3^1; sbit RXD P3^0; /* SCON */ sbit SM0 SCON^7; sbit SM1 SCON^6; sbit SM2 SCON^5; sbit REN SCON^4; sbit TB8 SCON^3; sbit RB8 SCON^2; sbit TI SCON^1; sbit RI SCON^0; /* P1 */ sbit T2EX P1^1; // 8052 only sbit T2 P1^0; // 8052 only /* T2CON */ sbit TF2 T2CON^7; sbit EXF2 T2CON^6; sbit RCLK T2CON^5; sbit TCLK T2CON^4; sbit EXEN2 T2CON^3; sbit TR2 T2CON^2; sbit C_T2 T2CON^1; sbit CP_RL2 T2CON^0; #endif//图片显示 void lcd_image(unsigned char code *p) { unsigned char i,j; for (i0xb0;i0xb8;i) { write_com(i); // RAM page address write_com(0x10); // RAM column address most address write_com(0x00); // RAM column address least address for(j0;j128;j) { write_dat(*p); } }/*********************** IC:ST7567 4SPI VLCD3.0V,VLCD9.5V,1/65DUTY,1/9BIAS ***********************/ #include reg52.h #include intrins.h #include delay.h sbit cs P1^4; sbit res P1^3; sbit cd P1^2; //A0 sbit sck P1^1; sbit sda P1^0; #include 4spi.h #include image.h #define uchar unsigned char #define uint unsigned int uchar pattern[4]; void line(uchar da) { uchar i,j; for(i0xb0;i0xb8;i) { write_com(i); write_com(0x10); write_com(0x00); for(j0;j128;j) { write_dat(da); } } } void ver() { uchar i,j; for(j0;j8;j) { write_com(0xb0j); write_com(0x10); write_com(0x00); for(i0;i32;i) { write_dat(0xff); write_dat(0x00); write_dat(0x00); write_dat(0x00); } } delay_ms(250); for(j0;j8;j) { write_com(0xb0j); write_com(0x10); write_com(0x00); for(i0;i32;i) { write_dat(0x00); write_dat(0xf0); write_dat(0x00); write_dat(0x00); } } delay_ms(250); for(j0;j8;j) { write_com(0xb0j); write_com(0x10); write_com(0x00); for(i0;i32;i) { write_dat(0x00); write_dat(0x00); write_dat(0x10); write_dat(0x00); } } delay_ms(250); for(j0;j8;j) { write_com(0xb0j); write_com(0x10); write_com(0x00); for(i0;i32;i) { write_dat(0x00); write_dat(0x00); write_dat(0x00); write_dat(0x01); } } delay_ms(250); } void LCD_ClearPoint(uchar x, uchar y) { uchar page y 3; write_com(0xB0 page); write_com(0x10 (x 4)); write_com(0x00 (x 0x0F)); write_dat(0x00); } void ver_slide(uchar pos) { uchar i, j; pattern[0] 0x00; pattern[1] 0x00; pattern[2] 0x00; pattern[3] 0x00; pattern[pos] 0xff; for(j 0; j 8; j) { write_com(0xb0 j); write_com(0x10); write_com(0x00); for(i 0; i 32; i) { write_dat(pattern[0]); write_dat(pattern[1]); write_dat(pattern[2]); write_dat(pattern[3]); } } } void main() { delay_us(0); delay_ms(0); delay_ss(0); res0; delay_ms(100); res1; cs0; write_com(0xe2); //软件复位 write_com(0xa0); //1/9bias write_com(0xa0); //seg正常 write_com(0xc8); //com reverse direction write_com(0x25); //resistor ratio(RR) write_com(0x81); write_com(36); //set V0 output voltage,理论值9.625(实测9.5V) write_com(0x2f); //power control set write_com(0x40); //display start line write_com(0xb0); //page address write_com(0x10); //column address(msb) write_com(0x00); //column address(lsb) write_com(0xa4); //normal display write_com(0xaf); //display on while(1) { ver_slide(0); delay_ms(250); delay_ms(250); ver_slide(1); delay_ms(250); delay_ms(250); ver_slide(2); delay_ms(250); delay_ms(250); ver_slide(3); delay_ms(250); delay_ms(250); line(0xff); //全显 delay_ms(250); delay_ms(250); line(0x00); line(0x11); //走横 delay_ms(250); delay_ms(250); line(0x22); delay_ms(250); delay_ms(250); line(0x44); delay_ms(250); delay_ms(250); line(0x88); delay_ms(250); delay_ms(250); ver(); //走竖 delay_ms(250); delay_ms(250); cs1; lcd_image(image_cs); delay_ms(250); delay_ms(250); cs0; } } /* while(1) { lcd_image(image_1); delay_ms(250); lcd_image(image_2); delay_ms(250); lcd_image(image_3); delay_ms(250); lcd_image(image_4); delay_ms(250); lcd_image(image_5); delay_ms(250); lcd_image(image_6); delay_ms(250); lcd_image(image_7); delay_ms(250); lcd_image(image_8); delay_ms(250); lcd_image(image_9); delay_ms(250); cs1; lcd_image(image_cs); delay_ms(250); delay_ms(250); cs0; } }*/