|
书接上回,废话继续,有道是失败是孩子他妈,自打上次以来,收获良多,虽然还是有些模棱两可,但起码好一点了,随着深入学习的推进,记个心得体会,要求不少于800字,嘿嘿,有没有很熟悉的感觉,领导教育我们要入脑入心入魂,做到始终坚持4个意识2个确立,确立目标,确立方向,而现如今我意识到了短处,技术,学术,艺术,我的目标就是把这屏点亮起来,方向就是学着打个板,做个usb电压电流表,时间表之类的,它又说了4个自信,咱要求的不多,一个就够了。
飞机直达,第一次失败现场
记一次失败的尝试,用STC15W4K56S4点亮农行金e顺通用K宝12864屏(排线丝印FM1420901CT06-00-B)
话不多说还是开搞硬件,还是那一堆u盾,这回又是哪个着殃,就你了,南极老寿星,元始广发天尊,对不?是不是那个大脑门托个桃的,平日里老人家过寿请出来的那位?
3下5/2,立马分离
屏幕排线序号H-003744,再无其他信息
按照坛友经验方法,查找和其他芯片连接情况,可以确定出SCLK和SDA,电源,背光引脚了,虽然这主控有2个时钟脚,但这里先按坛友们分享的与25Q16第5脚为SLCK再说,经验之谈一般得听。
没咋专业仪器,但还是测下,1,2,3脚的开…关…待机下的电压
看看,3脚开关机都是有一个明显3.3V再降为0的过程,时间间隔在1秒内,反正比较明显。2脚开机直接3.3v比较稳定,关机电压下降比较缓慢,怀疑连线上接有容阻延迟。1脚开机有3.3v,关机很快降为0。话说是不是指针表是不是更直观?数字表AD转换应该也是可以接受。
再根据这以下两位分享帖子中的引脚排位,结合上面第3脚的电压变化直接就排除掉RST,基本先确定出第2脚为RST,3脚为A0,1脚CS这里测得高电平,有点不合时序,可能记错了。不行就按坛友说的,排列组合123脚,软件编程也只需改6次就确定了。
驱动U盾LCD屏---代码初步解析
农行U盾液晶屏再利用DIY(附代码)
接下来还是继续开搞软件,这回没那么莽了,先好好研究驱动再说,按照网上的总结,12864的驱动大体分为4类,如下图。
每种驱动的时序,指令也会不同,差比很大,比如这种分高低4传的。
那么再按照新老站坛友分享的来讲,还是大概率是ST7565驱动的多,那么接下来再细看下ST7565的数据手册串行连接这页的介绍。
①当选择了串行接口(P/S=“L”)时,当芯片处于激活状态(/CS1=“L”和CS2=“H”)时可以接收串行数据输入(SI)和串行时钟输入(SCL)。串行数据按顺序在串行时钟D7、D6到D0的上升沿中从串行数据输入引脚读取。该数据在第八串行时钟的上升沿被转换为8位并行数据以进行处理。→→→(此屏无并行引脚,无需理会P/S选择,按坛友说的CS,低电平使能,也只需看CS1的时序便可,也就是时序图中第2条无需理会,CS头顶个杠的,数电基础中的非,取反,真真假假,假假真真,就问你是真还是假?也说明低电平片选使能。)
②A0输入用于确定串行数据输入是显示数据还是命令数据;当A0=“H”时,数据为显示数据,当A0=”L”时,则数据为命令数据。在芯片变为有效之后,A0输入被读取并用于串行时钟的每8个上升沿的检测。图1是串行接口信号图。
③在串行接口模式下无法读取。(只能mcu往lcd写,单向,无并行也无需判断驱动忙碌位)
不急不急,接下来了解下驱动相关存猪器基本概念先。以下为一款有字库的12864的介绍,简单来讲就好比如火车站的寄存箱之类的,你要显示什么,我这里有的你只管一指我就给你显示什么,这就行了,复杂来讲,就是我也不懂什么讲,但是我就是知道用。
ST7565的好像一个display data ram, 通俗来讲应该就是所谓的显存了,也是往这里面写什么,就显示什么。
也算差不多了,什么页,列地址之类,看前面帖子坛友分享的够我用了,特别注意下就是列地址是要先高4位后低4位,跟把大象放进冰箱一样色的。
再来看控制指令表,数据手册这里有写到,复位后直接回默认的值,有些我们用不上的没必要去搞它了,比如什么电阻比还是咋之类那些,手册里似乎挺复杂,不是咋能说的通的。
其他的可参考手册或下图,不废话了。
亦或者,直接参考这贴程序里面的介绍,还是很细腻的,大婶似乎喜欢留个小八哥,嘿嘿
教大家如何点亮建行网银盾的液晶屏2.0(以代码为主)
别人的始终还是别人的,腿再长,脸太美,牵不到手的总是在跳动,程序还是自己理解了自己码,也没多少条,远记得,干啥啥不行,抄作业第一名。(小吐槽一下STC—ISP,你家软件延迟自动生成咋没有个生成个带参数的,印象中我记得有那么一个小工具的呀。)按引脚需求软硬连接上,继续开搞。
这回脚位宽点,好焊多了。
编译,下载,排错,一气呵成,前前后后改了10多次,对比度,和指令修改,对比度取值不当容易进坑里了,以为没点亮,经验之说就是最大最小中间来一遍,看变化再来修改合适值,就问亮了没有??亮了。
又问成了没有??有8分成了,剩下有2成,留着点下个屏时再来折腾显示汉字,数字,字母,取模建立ASCII码字库,图片等。背光加上,顺手串个电阻太亮,换一个又不够亮,不扯腾了。
鼠鼠,是我鸭!^m^ ……^﹏^都看到这里了,赏点M吧,入不敷出了,就这样,谢谢观看。
===================我是分割线=============
===================代码====================
- /*================================*/
- /* 点屏测试 */
- /* 2023.7.25 V1.8 */
- /* 目前状态 : */
- /*操作成功 !(2023-07-25 22:41:17)*/
- /*==============================*/
- #include <STC15.H> //头文件,直接STC-ISP添加到keil
- #include "intrins.h" //库函数,以便调用空函数延时用
- typedef unsigned int uint;//宏定义
- typedef unsigned char uchar;
- sbit CS = P0^0; //片选使能脚
- sbit RST = P0^1; //复位脚
- sbit A0 = P0^2; //数据或指令选择脚,也有叫RS
- sbit SCLK = P0^3; //时钟脚
- sbit SDA = P0^4; //数据脚,也有叫SI,DO
- /*延时函数,直接从stc-isp里自动生成*/
- void Delay1000ms() //@11.0592MHz
- {
- uchar data i, j, k;
- _nop_();
- _nop_();
- i=43;
- j=6;
- k=203;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Delay5ms() //@11.0592MHz
- {
- uchar data i, j;
- i=54;
- j=199;
- do
- {
- while (--j);
- } while (--i);
- }
- void Delay200ms() //@11.0592MHz
- {
- uchar data i, j, k;
- _nop_();
- _nop_();
- i=9;
- j=104;
- k=139;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- /*写指令到LCD12864函数*/
- /*参数cmd:命令字节 */
- void LcdWriteCommand(uchar cmd)
- {
- uchar i;
- CS=0; //片选脚使能
- SCLK=0; //时钟准备
- A0=0; //低电平传的是指令
- for(i=0;i<8;i++) //串行按位传送
- {
- if(cmd&0x80) //取出最高位,高位在先
- {
- SDA=1;
- }
- else
- {
- SDA=0;
- }
-
- SCLK=1; //时钟上升沿,写入一位
- SCLK=0; //时钟再准备传下一位
- cmd=cmd<<1; //左移1位,下一位放到最高位
- }
- CS=1; //传完,使能停止
- SCLK=0; //时钟关,或者说再准备
- }
- /*写数据到LCD12864函数*/
- /*参数byte:数据字节 */
- void LcdWriteData(uchar byte)
- {
- uchar i;
- CS=0; //同上
- SCLK=0;
- A0=1; //写入的是数据
- for(i=0;i<8;i++)
- {
- if(byte&0x80)
- {
- SDA=1;
- }
- else
- {
- SDA=0;
- }
-
- SCLK=1;
- SCLK = 0;
- byte=byte<<1;
- }
- CS=1;
- SCLK=0;
- }
- /*LCD12864初始化函数*/
- void LcdInit()
- {
- RST=1;
- Delay5ms();
- RST=0;
- Delay5ms();
- RST=1;//复位脚,高电平复位
- Delay200ms();
- LcdWriteCommand(0xE2); //软复位
- LcdWriteCommand(0x23); //电阻比,对比度粗调
- LcdWriteCommand(0x81); //对比度精调,双指令,必须跟下面一条连着
- LcdWriteCommand(0x2D); //对比度精调取值,双指令,必须跟上面一条后面,此参数根据屏幕不同设置不同
- LcdWriteCommand(0x2F); //电源升压设置,(Ox2E)
- LcdWriteCommand(0xAF); //显示
- Delay5ms();
- Delay5ms();
- }
- /* 清屏函数 */
- /*每个点填入0,所有点熄灭*/
- /*
- void LcdClear()
- {
- uchar page,column;
- for(page=0;page<8;page++) //按页写入
- {
- LcdWriteCommand(0xB0+page); //设置页地址,从第0页开始
- LcdWriteCommand(0x10); //设置列地址高4位,
- LcdWriteCommand(0x00); //设置列地址低4位,列地址自动会+1,高低加起来0x10,从第0列开始
- for(column=0;column<128;column++)
- {
- LcdWriteData(0x00);//写入数据0,熄灭所有点
- }
- }
- }
- */
- /* 显示测试函数 */
- void LcdTest(uchar ph,uchar pl)
- {
- uchar page,column;
- for(page=0;page<8;page++)
- {
- LcdWriteCommand(0xB0+page);//参考上面清屏函数
- LcdWriteCommand(0x10);
- LcdWriteCommand(0x00);
- for (column=0;column<64;column++)
- {
- LcdWriteData(ph);
- LcdWriteData(pl); //连续写入2个字节数据,128/2=64,循环64次
- }
- }
-
- }
- /*主函数*/
- void main()
- {
- LcdInit();
- while(1)
- {
- LcdTest(0x00,0x00); //清屏,全屏熄灭测试,也可以用清屏函数
- Delay1000ms();
- LcdTest(0xFF,0x00); //测试竖线
- Delay1000ms();
- LcdTest(0x00,0x00);
- Delay1000ms();
- LcdTest(0x00,0xFF); //换列测试
- Delay1000ms();
- LcdTest(0x00,0x00);
- Delay1000ms();
- LcdTest(0x55,0x55); //测试横线
- Delay1000ms();
- LcdTest(0x00,0x00);
- Delay1000ms();
- LcdTest(0xAA,0xAA); //换行测试
- Delay1000ms();
- LcdTest(0x00,0x00);
- Delay1000ms();
- LcdTest(0xFF,0xFF); //全屏点亮测试
- Delay1000ms();
- }
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|