刷拼多多时看到个便宜的TY-290ES计算器,到手价只需要人民币11块多,还是个点阵屏,真是难以想象国产计算器能做这么便宜,买一个来研究下。
廉价小商品大本营(浙江)发的货,,,先点亮看看,功能很少,比82ES还差点意思。屏幕点阵粗略估了下,应该是96x31像素的,顶部有一行图标占了显存位置,所以有效点阵区域高度只有31像素。屏幕对比度看着一般,STN正显灰膜白底蓝字,响应速度比较慢,和LCD1602那种模组一个水平。
后壳6个十字螺丝拧下来就可以拆开了,无卡扣。主板相当简洁,分立器件只有2个电容 + 1个电阻,主控是个COB封装的牛屎芯片,估计是某些4位单片机做的。
屏幕排线总计20PIN,最左边是1脚,FPC上1脚和2脚都是空脚,剩余18个有物理连接的IO,这个规模来看,大概率是低速单片机最喜欢用的i8080并口了。
目视观测PCB走线,万用表可以直接测出VCC和GND。C8,C9,C10这三个boost升压电容板子没上件,应该是屏幕尺寸较小,靠屏幕驱动IC内部的硅电容也可以提供足够的电流和可接受的电源纹波。
C2P接一个无极性电容到GND,C3P和C3N两端接一个无极性电容,参考值1uF/25V来自ST7567手册,这些低分辨率点阵屏驱动IC硬件接口都差不多,可以互相参考。
剩下的13根数据线可以先分成两组:左边8根和右边5根,假设左边8根是数据线,右边5根是控制线。当然也可以反过来,一次不对再试一次就行。
PCB上测点都留好了,直接飞线上逻辑分析仪看看。由于手边的Saleae Logic逻辑分析仪只有8个通道,先抓取右侧的5个信号看看。
很明显的i80接口时序,这5跟线是右边的一组,那么左边一组就是8位数据接口了。
放大查看这个WR#时钟波形,速率只有33KHz,这种龟速可以直接用rp2040逻辑分析仪来抓取。
稍微调整下就可以看到上电初始化的数据了。
屏幕的引脚顺序也水落石出。
移动到写显存的位置,可以看到写显存前,先发了B0 12 04
这三个命令(A0=0),那么就可以猜到主控芯片应该是ST7565,ST7567这些常见的132X65点阵屏驱动IC了。
找一个ST7567A的手册来对照分析下初始化序列,除了有个03 0F
和AC 00
的命令没对上,其他的都能匹配。实际上,要驱动这个屏幕只需要把抓到的初始化序列原样发一遍就行了。
IO初始状态都为0RD=0, D0~D7=0
CS=1, RST=1, A0=1, WR=1
delay=1665usRST=0
delay=5usRST=1
delay=555usCS=0
delay=560usA0=0
delay=10usRD=1
D0~D7 -> 0x2A // Read IC Status
delay=25us0xE2 -> D0~D7 // Software reset
Gen WR Clock
CS=1
delay=5.2msA0=0
CS=0Gen RD Clock
D0~D7 -> 0x2A // Read IC Status0xFF, 0x72, 0xFE, 0xD6, 0x95, 0x98, 0xFF, 0x03,
0x0F, 0xFE, 0xA2
-> D0~D7
Gen WR Clock Repeat
delay=365us// 0xFF Enter extension command table
// 0x72 Enter display setting
// 0xFE Exit extension command table
// 0xD6 Set duty(DT[3:0]=0x6)
// 0x95 Set bias(BA[2:0]=0x5)
// 0x98 Set frame rate(FR[2:0]=0x0)
// 0xFF Enter extension command table
// 0x03
// 0x0F
// 0xFE Exit extension command table
// 0xA2 Select bias setting bit0=0: 1/9; bit0=1:1/7 (at 1/65 duty)0xA1, 0xC0
-> D0~D7
Gen WR Clock Repeat
delay=430us// 0xA1 Set scan direction of SEG, bit0(MX)=1: reverse direction, bit0(MX)=0: normal direction
// 0xC0 Set output direction of COM,bit3(MY)=1, reverse direction, bit3(MY)=0, normal direction0xF8 -> D0~D7
Gen WR Clock
delay=550us0x00 -> D0~D7
Gen WR Clock
delay=565us// F8 00
// 0xF8 0x00(bit0=BL), Double command!! Set booster level:BL=0: 4X, BL=1: 5X0x21, 0x81, 0x15,
-> D0~D7
Gen WR Clock Repeat
delay=570us// 0x21 bit0~bit2: Select regulation resistor ratio
// 0x81 0x15(bit0~bit5) Double command!! Set electronic volume (EV) level0x2C, 0x2E, 0x2F, 0x40, 0xA6
-> D0~D7
Gen WR Clock Repeat
delay=375us// 0x2C(bit2=VB bit1=VR bit0=VF) Control built-in power circuit ON/OFF
// 0x2E(bit2=VB bit1=VR bit0=VF) Control built-in power circuit ON/OFF
// 0x2F(bit2=VB bit1=VR bit0=VF) Control built-in power circuit ON/OFF
// 0x40(bit2=RR2 bit1=RR1 bit0=RR0) Select regulation resistor ratio
// 0xA6 Inverse Display bit0(INV)=1: inverse display, bit0(INV)=0: normal display0xAC, 0x00
-> D0~D7
Gen WR Clock Repeat
delay=5us// AC ??
// 00 ??CS=1
delay=905us// init sequence done.// fill GRAM startCS=0
A0=0
Write: B0 12 04
A0=1
Write: 04 (00 x 95)// B0(low 4bit) Set page address
// 12(low 4bit) Set column address (MSB)
// 04(low 4bit) Set column address (LSB)A0=0
Write: B1 12 04
A0=1
Write: (00 x 96)A0=0
Write: B2 12 04
A0=1
Write: 04 (00 x 95)A0=0
Write: B3 12 04
A0=1
Write: (00 x 96)A0=0
Write: B8 10 00
A0=1
Write: (00 x 96)CS=1
delay=40usCS=0
delay=10us
A0=00xA4, 0xAF
-> D0~D7
Gen WR Clock Repeat
delay=5us// 0xA4 Set All Pixel ON, bit0(AP)=1: set all pixel ON, bit0(AP)=0: normal displa
// 0xAF Set Display ON/OFF, bit0(D)=1: display ON, bit0(D)=0, display OFFCS=1
delay=2045us