|
发表于 2023-7-26 10:22:14
来自手机浏览器
|
显示全部楼层
|
书接上回,废话继续,有道是失败是孩子他妈,自打上次以来,收获良多,虽然还是有些模棱两可,但起码好一点了,随着深入学习的推进,记个心得体会,要求不少于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次就确定了。
接下来还是继续开搞软件,这回没那么莽了,先好好研究驱动再说,按照网上的总结,12864的驱动大体分为4类,如下图。
每种驱动的时序,指令也会不同,差比很大,比如这种分高低4传的。
那么再按照新老站坛友分享的来讲,还是大概率是st7565驱动的多,那么接下来再细看下st7565的数据手册串行连接这页的介绍。
(719.27 kb, 下载次数: 0)
①当选择了串行接口(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位,跟把大象放进冰箱一样色的。
再来看控制指令表,数据手册这里有写到,复位后直接回默认的值,有些我们用不上的没必要去搞它了,比如什么电阻比还是咋之类那些,手册里似乎挺复杂,不是咋能说的通的。
其他的可参考手册或下图,不废话了。
亦或者,直接参考这贴程序里面的介绍,还是很细腻的,大婶似乎喜欢留个小八哥,嘿嘿
别人的始终还是别人的,腿再长,脸太美,牵不到手的总是在跳动,程序还是自己理解了自己码,也没多少条,远记得,干啥啥不行,抄作业第一名。(小吐槽一下stc—isp,你家软件延迟自动生成咋没有个生成个带参数的,印象中我记得有那么一个小工具的呀。)按引脚需求软硬连接上,继续开搞。
这回脚位宽点,好焊多了。
编译,下载,排错,一气呵成,前前后后改了10多次,对比度,和指令修改,对比度取值不当容易进坑里了,以为没点亮,经验之说就是最大最小中间来一遍,看变化再来修改合适值,就问亮了没有??亮了。
又问成了没有??有8分成了,剩下有2成,留着点下个屏时再来折腾显示汉字,数字,字母,取模建立ascii码字库,图片等。背光加上,顺手串个电阻太亮,换一个又不够亮,不扯腾了。
鼠鼠,是我鸭!^m^ ……^﹏^都看到这里了,赏点m吧,入不敷出了,就这样,谢谢观看。
===================我是分割线=============
===================代码====================
- /*================================*/
- /* 点屏测试 */
- /* 2023.7.25 v1.8 */
- /* 目前状态 : */
- /*操作成功 !(2023-07-25 22:41:17)*/
- /*==============================*/
- #include //头文件,直接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();
- }
- }
复制代码 |
, ,
打赏
-
|