|
本帖最后由 落叶风 于 2020-10-15 12:06 编辑
2019年过年前制作的时钟到现在已稳定运行了差不多2年了https://www.mydigit.cn/forum.php?mod=viewthread&tid=7504&extra=,开始期间修改多次,主体时钟修改不多,主要是天气部份修改比较多,所以这个时钟的程序已稳定,不会再更新了。
今年9月份开始,天气又收不到,但电脑能收,估计是网站变了,或限制了,所以我已没用天气了,当普通授时钟,天气部份没打算想重写了。在这说明一下这时钟天气接收部份ESP8266传给本时钟的协议,方便大家自已动手修改天气程序。天气接收ESP8266串口主要输出2个值,其中一个是每5S送一次的授时时间值,它的协议是:[Timetianqi2] 2020-10-15 4 10:13:46**,引导码是[Timetianqi2],结束码是**,中间是年-月-日 星期 时:分:秒。另一个是30分钟送一次的天气数据,它的协议是:[Timetianqi1] 今天天气实况:好天气。 **,引导码是:[Timetianqi1],结束码是: **(12个空格+两个*),中间内容这天气情况文字。由于单片机串口输入只能输入300个字符,且单片机没做超字符处理,如接收超过300个后会出现出错重启,所以ESP8266天气输出字符数不能超300个,编码为UTF8,UTF8中文字占3个字符。
以下为本贴的主要内容,上个月买了片P2屏,也是32扫128*64的,打算搞个制作,先用时钟板测试一下个屏,发现驱动不了。以下是本屏的图片。
驱动芯片是用TC7558及FM6126A的,
这个屏比较娇气:sweat:。给硬物碰一碰就变这了。
查官方资料发现行驱动TC7558是采用串行移位控制的,不是原买P3那版采用5线控制的,这个是采用2线控制,采用实验板测试出来C脚输入为数据,A脚输入是时钟,按一般的移位驱动程序就能正常驱动了,对于列驱动FM6126A的驱动,从官方资料看驱动方式是锁存方式不同,且有设置项,锁存方式是输入端3 个clk 宽度的LE 高电平时,数据被传入到锁存器中。按照这说明编写程序,从逻辑分析仪的波型基本正确,但接入LED屏显示不正常。由于前些时间工作多,所以前几天继续上网找资料究研这屏,终于在英文网站github.com找到驱动这芯片的程序,发现它是需要初始化的,但官方资料没有详细说明设置方法,参照这程序写了初始化程序,终于显示出来的,但还是不正常,用5V的单片机编写简单的测试程序就正常,怀疑是电平转换引起,所以又DIY片电平转换板,终于正常了。以下为对应图片。
由于是测试,时钟板只焊接部份,没光感检测,没温度湿度检测,没ESP8266。
电源是5V5A的,
电平转换板
是用74lvc4245
以下为工作电流检测,电流不大。
以下为不接电平转换板的显示情况。
简单说一下对于不同的屏如何修改本程序进行匹配,程序主要修改main.c中的void disp()子程序,它是负责输出数据到LED屏的。由于单片机运行本子程序时扫一行需时0.14ms(这个时间应是单片机驱动速度,本次P2屏测试速度也一样),所以扫一行需分2次写。
对于原买的P3屏驱动不复杂,流程是:先OE高电平(关显示),然后设置扫那行(即设置ABCDE输入脚的电平,行数为对应的ABCDE的组合值),然后输出128个显示数据,由于需分2行,所以输出128个数据分2次,一次输出64个,然后锁数据(STB低电平后再高电平),然后再开显示(OE为低电平),这样连接扫32行,就组成一个完整的显示内容了。
以下为旧P3的驱动程序,显示周期是5个0.1ms中断,duanvol为控制值 ,对于值为0,1时输出数据到LED屏,对于234就控制亮度。disphan为行值。单片机B口为输出,012接R1等,456接R2等。
void disp()
{//0.14ms 改为分两段显示,每段69us
u8 kk,temp1;
if(duanvol==0)
{//扫开始64列
OE_SET(1);//如不进行这步,有暗光
CLK_SET(1);
STB_SET(1);
temp1=disphan&0x01;
AIN_SET(temp1);
temp1=disphan&0x02;
BIN_SET(temp1);
temp1=disphan&0x04;
CIN_SET(temp1);
temp1=disphan&0x08;
DIN_SET(temp1);
temp1=disphan&0x10;
EIN_SET(temp1);
for(kk=0;kk<64;kk++)
{
GPIO_Write(GPIOB, dispram[kk+disphan*128]);
CLK_SET(0);
CLK_SET(1);
}
}
if(duanvol==1)
{//扫后64列
temp1=disphan&0x01;
AIN_SET(temp1);
temp1=disphan&0x02;
BIN_SET(temp1);
temp1=disphan&0x04;
CIN_SET(temp1);
temp1=disphan&0x08;
DIN_SET(temp1);
temp1=disphan&0x10;
EIN_SET(temp1);
for(kk=0;kk<64;kk++)
{
GPIO_Write(GPIOB, dispram[kk+64+disphan*128]);
CLK_SET(0);
CLK_SET(1);
}
STB_SET(0);
STB_SET(1);
if(offdispkong==0)
{
OE_SET(0);//显示
}
else
{
OE_SET(1);//不显示,加这句主要是没有亮度1关闭,在这关。
}
disphan++;
if(disphan==32)disphan=0;
}
//以下亮度控制,只有4档,1最亮,4最暗,由于需自动控制,所以为中转值
if(duanvol==2 && displightkong==5)OE_SET(1);//关显示
if(duanvol==2 && displightkong==4)
{
delay(50);
OE_SET(1);//关显示
}
if(duanvol==3 && displightkong==3)OE_SET(1);//关显示
if(duanvol==4 && displightkong==2)OE_SET(1);//关显示
duanvol++;
if(duanvol>4)duanvol=0;
}*/
对于本次的P2屏驱动就麻烦些,对于行驱动,就是移位驱动,如下。
if(disphan==0)
{
CIN_SET(1);
}
else
{
CIN_SET(0);
}
AIN_SET(1);
AIN_SET(0);
disphan++;
if(disphan==32)disphan=0; //行控结束
对于锁数据是在最后发送3个数据时进行操作STB为高电平,数据发送结束就为低电平,这样就锁存成功,其它与P3的一样,以下为完整驱动。
void disp()
{
uint8_t kk;
if(duanvol==0)
{//扫开始64列
OE_SET(1);//关显示
//以下为行控
if(disphan==0)
{
CIN_SET(1);
}
else
{
CIN_SET(0);
}
AIN_SET(1);
AIN_SET(0);
//在扫描结束后还有操作
for(kk=0;kk<64;kk++)
{
GPIO_Write(GPIOB, dispram[kk+(disphan)*128]);
CLK_SET(0);
CLK_SET(1);
}
}
if(duanvol==1)
{
for(kk=0;kk<64;kk++)
{
GPIO_Write(GPIOB, dispram[kk+64+(disphan)*128]);
if(kk>60)
{
STB_SET(1);
}
else
{
STB_SET(0);
}
CLK_SET(0);
CLK_SET(1);
}
STB_SET(0);
CLK_SET(0);
OE_SET(0);//显示
//以下为接上行控
disphan++;
if(disphan==32)disphan=0;//行控结束
}
//以下亮度控制,只有4档,1最亮,4最暗,由于需自动控制,所以为中转值
if(duanvol==2 && displightkong==5)OE_SET(1);//关显示
if(duanvol==2 && displightkong==4)
{
delay(50);
OE_SET(1);//关显示
}
if(duanvol==3 && displightkong==3)OE_SET(1);//关显示
if(duanvol==4 && displightkong==2)OE_SET(1);//关显示
duanvol++;
if(duanvol>4)duanvol=0;
}
由于FM6126A启动时需初始化,初始化程序是上网抄的,不清楚它的原理,详细看void reset()子程序啦。
以下为本P2屏的改动后的时钟程序(内有FM6126A及TC7558),由于本人只用于测试这个P2屏的,测试成功就没用,可能有BUG,仅供参考。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|