|
|
从闲鱼上买了2个福特的车机屏,就因为便宜(5元一个),所以买来2个玩玩。 屏一买来就开始画原理图,画了好几天才画完,正确性不敢说100%,至少95%以上。 一边画原理图一边查资料,才发现是福特的车机屏,就是传说中的1小时模式的那个车机配套的屏。 这款屏在很多福特车上都有,包括嘉年华、福克斯等等,背面标的型号也是五花八门,常见的是cd1038,但实际上是一样的,内部电路板设计完全一样。 刚开始只有屏,接上12V电源,但是没有LIN和CAN的数据,根本没办法点亮,所以无法分析。 偶然找到数码之家坛友 @hblg-wpf 发表的帖子: http://bbs.mydigit.cn/read.php?tid=1110992和他聊了几次之后,没想到居然主动送我一套车机和按键,在此再次表示感谢。 车机和按键到了之后,接好线,发现这个屏单独靠按键也是可以点亮的,按下开机键通过LIN总线发送开机命令即可。 将屏幕电路板上各测试点焊好线,在逻辑分析仪的帮助下,终于得到屏的初始化和刷屏数据。 屏的FPC上标的型号为TFT2K2008FPC或TFT2K2048FPC,分辨率为176x120,尺寸3.5"。 与很多SPI接口的屏一样,先发MSB(最高位),SCL无效时为低电平,数据上升沿有效,CS低电平有效,RS低电平为命令。 它的原点位于右上角,从右向左、从上往下扫描。应该也可以通过命令改变扫描的方向,但看不懂初始化的命令分别代表什么意思。 刚开始以为是单色屏,没想到支持4级灰度(00, 01, 10, 11)。但实际上10和11看不出区别,可能和初始化命令有关。 即1字节表示横向4点,2位表示一点,每点4级灰度。<-- 76 54 32 10(从右向左),故实际为176/4=44列,120行。 为验证,特意写了个程序,采用STC12LE5A60S2单片机。 由于车机屏每次都是刷新整个屏幕,如果要单独显示某个点是比较浪费时间的。 尝试了n次之后才找到窗口设置命令,这样就可以实现对屏幕上任意点的控制了。 当然了,有了原理图,这块板子也是可以单独利用的,不限于只利用屏幕来显示东西。单片机是16位的MC9S12XEP100(不同批次可能略有差异),包括CAN芯片TJA1042T/3和LIN芯片TJA1020T。相当于5块钱买来一个开发板啊。可惜没有编程器。 开机显示一小时模式 接上车机按RADIO键才有效 飞线接到单片机上,屏幕供电是从单片机板子上取的 没有背光在背面照耀时有点像墨水屏 初始化数据 PWB20354背面测试点(点击图片放大) 原理图、源代码下载: https://pan.baidu.com/s/1gf2FMqJ 以下是2个关键的函数: - void LCD_Init()
- {
- LCD_PB4_LO();
- LCD_PB5_LO();
- LCD_CS_HI();
- LCD_SCK_LO();
- LCD_SDA_HI();
- LCD_RST_HI();
- LCD_RS_LO();
- Delay50us();
-
- LCD_RST_LO(); //低电平复位
- Delay50us();
- LCD_RST_HI(); //复位完毕
- Delay50us();
-
- LCD_CS_LO();
-
- SendCmd1(0x5E, 0xA5);
- delay_ms(5);
-
- SendCmd4(0x91, 0x00, 0xAF, 0x00, 0x77);
- SendCmd4(0x92, 0x92, 0x01, 0x80, 0x00);
- SendCmd4(0x93, 0x09, 0x85, 0x0B, 0x81);
- SendCmd4(0x21, 0x07, 0xA5, 0xA5, 0xA5);
- SendCmd4(0x24, 0x00, 0xA5, 0xA5, 0xA5);
- SendCmd4(0x25, 0x01, 0xA5, 0xA5, 0xA5);
- SendCmd4(0x26, 0x00, 0x00, 0x00, 0xA5);
- SendCmd4(0xA2, 0x00, 0xA5, 0xA5, 0xA5);
- SendCmd4(0xA1, 0x00, 0xA5, 0xA5, 0xA5);
- SendCmd4(0x85, 0x00, 0x15, 0x2A, 0x3F);
- SendCmd4(0x8D, 0x00, 0x15, 0x2A, 0x3F);
- SendCmd4(0x71, 0x0E, 0x81, 0x18, 0x17);
- SendCmd4(0x72, 0x06, 0x24, 0xA5, 0xA5);
- SendCmd4(0x61, 0x5F, 0x09, 0x00, 0x00);
- SendCmd4(0x49, 0x00, 0x00, 0x00, 0xA5);
- delay_ms(10);
-
- SendCmd1(0x13, 0xA5);
- delay_ms(10);
-
- SendCmd4(0x23, 0x00, 0x00, 0x00, 0x77);
- SendCmd4(0x22, 0x00, 0x2B, 0x00, 0xA5);
- SendCmd1(0x13, 0xA5);
- SendCmd1(0x15, 0xA5);
- SendCmd4(0x21, 0x07, 0xA5, 0xA5, 0xA5);
- SendCmd4(0x24, 0x00, 0xA5, 0xA5, 0xA5);
- SendCmd4(0x26, 0x00, 0x00, 0x00, 0xA5);
- SendCmd4(0x29, 0x00, 0x00, 0x00, 0x00);
- SendCmd4(0x2A, 0x00, 0x00, 0x00, 0x00);
- SendCmd1(0x1A, 0xA5);
- SendCmd1(0x1C, 0xA5);
- SendCmd4(0x2B, 0x00, 0x00, 0x00, 0x00);
- SendCmd4(0x25, 0x01, 0xA5, 0xA5, 0xA5);
- SendCmd4(0x49, 0x00, 0x00, 0x00, 0xA5);
- // 设置窗口 (0x22, x1, x2, 0, 0xA5) (0x23, 0, y1, 0, y2)
- // x1表示起始列,x2表示终止列,y1表示起始行,y2表示终止行
- SendCmd4(0x22, 0x00, 0x2B, 0x00, 0xA5);
- SendCmd4(0x23, 0x00, 0x00, 0x00, 0x77);
-
- LCD_CS_HI();
-
- Delay50us();
-
- LCD_ClrScr();
- }
- //清屏
- void LCD_ClrScr(void)
- {
- u8 i, j;
-
- LCD_CS_LO();
- SendCmd4(0x22, 0x00, 0x2B, 0x00, 0xA5);
- SendCmd4(0x23, 0x00, 0x00, 0x00, 0x77);
-
- SendCmd1(0x3A, 0xA5);
-
- for (i = 0; i < LCD_HEIGHT; i++)
- {
- for (j = 0; j < LCD_COLUMN; j++)
- {
- Dat2Lcd(0x00);
- }
- }
-
- SendCmd1(0x12, 0xA5);
- LCD_CS_HI();
- }
|