找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3245|回复: 8
收起左侧

单片机开发板LCD12864 st7565 的显示问题,只显示不会亮,不显示任何内容

[复制链接]
ID:880867 发表于 2021-2-10 10:15 | 显示全部楼层 |阅读模式
    //这是st7565.c文件

        #include"st7565.h"

        /*******************************************************************************

        * 函 数 名         : LCD12864_WriteCmd

        * 函数功能                   : 写入一个命令到12864

        * 输    入         : cmd

        * 输    出         : 无

        *******************************************************************************/

        void LcdSt7565_WriteCmd(cmd)

        {

                LCD12864_CS = 0;           //chip select,打开片选

                LCD12864_RD = 1;           //disable read,读失能        

                LCD12864_RS = 0;       //select command,选择命令

                LCD12864_RW = 0;       //select write,选择写模式

                _nop_();

                _nop_();

                DATA_PORT = cmd; //put command,放置命令

                _nop_();

                _nop_();

                LCD12864_RW = 1;           //command writing ,写入命令

        }

        /*******************************************************************************

        * 函 数 名         : LcdSt7565_WriteData

        * 函数功能                   : 写入一个数据到12864

        * 输    入         : dat

        * 输    出         : 无

        *******************************************************************************/

        void LcdSt7565_WriteData(dat)

        {        

                LCD12864_CS = 0;           //chip select,打开片选

                LCD12864_RD = 1;           //disable read,读失能        

                LCD12864_RS = 1;       //select data,选择数据

                LCD12864_RW = 0;       //select write,选择写模式

                _nop_();

                _nop_();

                DATA_PORT = dat;       //put data,放置数据

                _nop_();

                _nop_();

                LCD12864_RW = 1;           //data writing,写数据

        }

        /*******************************************************************************

        * 函 数 名         : LCD12864_Init

        * 函数功能                   : 初始化12864

        * 输    入         : 无

        * 输    出         : 无

        * 说    明         : LCD12864的命令指令可以查看例程文件夹下的《ST7565p数据手册》

        *                  * 的第51页的位置。

        *******************************************************************************/

        void Lcd12864_Init()

        {

                uchar i;

                LCD12864_RSET = 0;

                for (i=0; i<100; i++);

                LCD12864_CS = 0;

                LCD12864_RSET = 1;

                //----------------Star Initial Sequence-------//

                //------程序初始化设置,具体命令可以看文件夹下---//

                //--软件初始化--//

                LcdSt7565_WriteCmd(0xE2);  //reset

                for (i=0; i<100; i++);           //延时一下

                //--表格第8个命令,0xA0段(左右)方向选择正常方向(0xA1为反方向)--//

                LcdSt7565_WriteCmd(0xA1);  //ADC select segment direction

                //--表格第15个命令,0xC8普通(上下)方向选择选择反向,0xC0为正常方向--//

                LcdSt7565_WriteCmd(0xC8);  //Common direction

                //--表格第9个命令,0xA6为设置字体为黑色,背景为白色---//

                //--0xA7为设置字体为白色,背景为黑色---//

                LcdSt7565_WriteCmd(0xA6);  //reverse display

                //--表格第10个命令,0xA4像素正常显示,0xA5像素全开--//

                LcdSt7565_WriteCmd(0xA4);  //normal display

                //--表格第11个命令,0xA3偏压为1/7,0xA2偏压为1/9--//

                LcdSt7565_WriteCmd(0xA2);  //bias set 1/9

                //--表格第19个命令,这个是个双字节的命令,0xF800选择增压为4X;--//

                //--0xF801,选择增压为5X,其实效果差不多--//        

                LcdSt7565_WriteCmd(0xF8);  //Boost ratio set

                LcdSt7565_WriteCmd(0x01);  //x4

                //--表格第18个命令,这个是个双字节命令,高字节为0X81,低字节可以--//

                //--选择从0x00到0X3F。用来设置背景光对比度。---/

                LcdSt7565_WriteCmd(0x81);  //V0 a set

                LcdSt7565_WriteCmd(0x23);

                //--表格第17个命令,选择调节电阻率--//

                LcdSt7565_WriteCmd(0x25);  //Ra/Rb set

                //--表格第16个命令,电源设置。--//

                LcdSt7565_WriteCmd(0x2F);

                for (i=0; i<100; i++);

                //--表格第2个命令,设置显示开始位置--//

                LcdSt7565_WriteCmd(0x40);  //start line

                //--表格第1个命令,开启显示--//

                LcdSt7565_WriteCmd(0xAF);  // display on

                for (i=0; i<100; i++);

        }

        /*******************************************************************************

        * 函 数 名         : LCD12864_ClearScreen

        * 函数功能                   : 清屏12864

        * 输    入         : 无

        * 输    出         : 无

        *******************************************************************************/

        void Lcd12864_ClearScreen(void)

        {

                uchar i, j;

                for(i=0; i<8; i++)

                {

                        //--表格第3个命令,设置Y的坐标--//

                        //--Y轴有64个,一个坐标8位,也就是有8个坐标--//

                        //所以一般我们使用的也就是从0xB0到0x07,就够了--//        

                        LcdSt7565_WriteCmd(0xB0+i);

                        //--表格第4个命令,设置X坐标--//

                        //--当你的段初始化为0xA1时,X坐标从0x10,0x04到0x18,0x04,一共128位--//

                        //--当你的段初始化为0xA0时,X坐标从0x10,0x00到0x18,0x00,一共128位--//

                        //--在写入数据之后X坐标的坐标是会自动加1的,我们初始化使用0xA0所以--//

                        //--我们的X坐标从0x10,0x00开始---//

                        LcdSt7565_WriteCmd(0x10);

                        LcdSt7565_WriteCmd(0x04);                                                           

                        //--X轴有128位,就一共刷128次,X坐标会自动加1,所以我们不用再设置坐标--//

                        for(j=0; j<128; j++)

                        {

                                LcdSt7565_WriteData(0x00);  //如果设置背景为白色时,清屏选择0XFF

                        }

                }

        }

        /*******************************************************************************

        * 函 数 名         : LCD12864_Write16CnCHAR

        * 函数功能                   : 在12864上面书写16X16的汉字

        * 输    入         : x, y, cn

        * 输    出         : 无

        * 说    明                   : 该函数可以直接书写字符串,但是书写是从右到左,所以输入的时

        *                  * 侯注意输入。汉字的取模方式请观看文件夹下的《汉字取模软件的

        *                  * 使用说明》

        *******************************************************************************/

        #ifdef  CHAR_CODE

        #include"charcode.h"

        uchar Lcd12864_Write16CnCHAR(uchar x, uchar y, uchar *cn)

        {

                uchar j, x1, x2, wordNum;

                //--Y的坐标只能从0到7,大于则直接返回--//

                if(y > 7)

                {

                        return 0;

                }

                //--X的坐标只能从0到128,大于则直接返回--//

                if(x > 128)

                {

                        return 0;

                }

                y += 0xB0;           //求取Y坐标的值

                //--设置Y坐标--//

                LcdSt7565_WriteCmd(y);

                while ( *cn != '\0')         //在C语言中字符串结束以‘\0’结尾

                {        

                        //--设置Y坐标--//

                        LcdSt7565_WriteCmd(y);

                        x1 = (x >> 4) & 0x0F;   //由于X坐标要两句命令,分高低4位,所以这里先取出高4位

                        x2 = x & 0x0F;          //去低四位

                        //--设置X坐标--//

                        LcdSt7565_WriteCmd(0x10 + x1);   //高4位

                        LcdSt7565_WriteCmd(0x04 + x2);        //低4位

                        for (wordNum=0; wordNum<50; wordNum++)

                        {

                            //--查询要写的字在字库中的位置--//

                                if ((CN16CHAR[wordNum].Index[0] == *cn)

                                     &&(CN16CHAR[wordNum].Index[1] == *(cn+1)))

                                {

                                        for (j=0; j<32; j++) //写一个字

                                        {               

                                                if (j == 16)         //由于16X16用到两个Y坐标,当大于等于16时,切换坐标

                                                {

                                                        //--设置Y坐标--//

                                                           LcdSt7565_WriteCmd(y + 1);

                                                        //--设置X坐标--//

                                                        LcdSt7565_WriteCmd(0x10 + x1);   //高4位

                                                        LcdSt7565_WriteCmd(0x04 + x2);        //低4位

                                                }

                                                LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]);

                                        }

                                        x += 16;

                                }//if查到字结束               

                        } //for查字结束        

                        cn += 2;

                }        //while结束

                return 1;

        }

        #endif

    //这是main.c文件

        #include<reg51.h>

        #include"st7565.h"

        //---声明一个全局变量---//

        void Delay10ms(unsigned int c);

        /*******************************************************************************

        * 函 数 名         : main

        * 函数功能                   : 主函数

        * 输    入         : 无

        * 输    出         : 无

        *******************************************************************************/

        void main()

        {

                uchar i = 128;

                Lcd12864_Init();

                Lcd12864_ClearScreen();

                while (1)

                {

                        for (i=0; i<8; i += 2)

                        {

                                Lcd12864_ClearScreen();

                                //--由于这个函数显示方向正好相反--//

                                Lcd12864_Write16CnCHAR(0, i, "司公限有技科中普");

                                Delay10ms(100);

                        }

                }

        }

        /*******************************************************************************

        * 函 数 名         : Delay10ms

        * 函数功能                   : 延时函数,延时10ms

        * 输    入         : 无

        * 输    出         : 无

        *******************************************************************************/

        void Delay10ms(unsigned int c)   //误差 0us

        {

            unsigned char a,b;

            for(;c>0;c--)

                for(b=38;b>0;b--)

                    for(a=130;a>0;a--);

        }





    求求大家看下为啥我的只亮不显示,两天了救救孩子吧

回复

使用道具 举报

ID:880867 发表于 2021-2-10 12:17 | 显示全部楼层
程序用的是卖家给的,pz开发版
回复

使用道具 举报

ID:390416 发表于 2021-2-10 18:59 | 显示全部楼层
LCD12864中文资料包 容易看明白 http://www.51hei.com/bbs/dpj-200462-1.html
回复

使用道具 举报

ID:97554 发表于 2021-2-10 20:48 | 显示全部楼层
普中的1602程序不兼容一般的屏,它自带的可以。12864不知道什么情况,你可以着重检查下引脚是否兼容,其次检查一下V0电压是否给够,1602和2004的V0只需要零点几伏,12864的可能需要4.5V左右。如果不是以上问题,那就不知道是否为不是普中配套的12864和显示程序是否一致。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:97554 发表于 2021-2-12 23:40 | 显示全部楼层
晚上有时间又看了下代码,顺便学习一下,今天白天也在折腾ST7565的12864,不过是串口的。今天只是折腾出了图片,没有字符和汉字。

但是,了解到st7565似乎并没有字库 ,所以考虑楼主这程序应该不是ST7565的,所以看到主程序的时候发现
Lcd12864_Write16CnCHAR(0, i, "司公限有技科中普");
这句似乎根本无法实现,这ST7565要显示汉字至少应该取模自己建字库才可以。

所以,作为一个没有入门的门外汉,还是觉得开发板就是一个坑,我也买过两块开发板,一块郭天祥的,一块普中的。我是电子爱好者,对于C语言毫无基础,郭天祥的教程却是针对在校大学生,至少对于C语言有些许了解的,所以其在讲解过程中对于我熟悉的硬件讲解过多,而且不完全正确。对于我需要学的编程过程他讲的似乎有些草率。

后来又买了一块普中68000,不说讲解问题如何,只说后来的学习过程中,发现这种集成式的开发板根本不考虑初学者对于硬件和程序的认知,就比如普中的板子,带的一块1602液晶,用他带的液晶和例程可以点亮,但是换一块大众的1602就完蛋了,大众的1602驱动程序也点不亮普中的1602液晶。这就是开发板的坑,初学者很容易掉进这些坑里。

今天找参考资料的时候又翻了下普中的资料,结果发现我买板子时候没给带的12864他们居然不止一个版本,而且都是极其小众的东西,不知何故。这样的东西要想举一反三颇有难度。

这两年,在51论坛混倒是学到了以前看无数遍教程都没有学到的知识总量,也有些自己的学习体会。单片机学习不能再搞开发板,买两片最小系统,一些外设的功能模块,比如这些液晶,还有什么时钟模块,ADC模块啥的,自己连线自己找相关程序一遍遍的试,试错的过程就是学习的过程。经常在51上看看别人遇到的问题,那行许就是自己可能遇到的问题,然后帮忙去寻找一下答案,找不到,解决不了,就收藏一下等着大佬给出指引,然后也一起学习一下,这就是提高入门的最佳方案了,至少我是这么觉得的。

最后,楼主还是找7565的显示汉字字符的例程去参考下,或者找画线或者填充方案先试下屏的好坏,连线的正确与否,初始化程序是否对应,硬件是否正确等都可以实现。
Lcd12864_Write16CnCHAR(0, i, "司公限有技科中普");

把上边这一句前边加 "//” 如下:
//Lcd12864_Write16CnCHAR(0, i, "司公限有技科中普");

如果其他都正常的情况下,应该是满屏都是白的,因为他清屏命令是反向显示的,所以会满屏像素点全白,如果没有全白,那么检查IO口是否一一对应,以及对比度电压是否正确。


普中68000开发板的资料里有三个例程对应四种12864平,一种常用的,是20脚并口带字库的屏,主控可能是ST7920的。旧12864是一块OLED屏,用的SPI驱动,新12864就是两块COG,我也看到了你贴的程序。有些屏在转接板上带个8脚的存储芯片做的字库,那种可以不用字模显示汉字,但是普中的两片我好像没有看见有字库存储芯片。 怎么区分两种类型的屏.jpg

下图为本站坛友贴的带字库的ST7565的模块的图




评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:97554 发表于 2021-2-13 17:06 | 显示全部楼层
看的不够仔细,charcode.h就是那几个汉字的字库。那么只剩下连线是直插还是杜邦线的问题了
回复

使用道具 举报

ID:880867 发表于 2021-2-14 16:41 | 显示全部楼层
杨雪飞 发表于 2021-2-13 17:06
看的不够仔细,charcode.h就是那几个汉字的字库。那么只剩下连线是直插还是杜邦线的问题了

对,但是我几天还是没搞出来,难受
回复

使用道具 举报

ID:584814 发表于 2021-2-15 00:06 | 显示全部楼层
普中的板子,同型号的我有两块,配的1602都不一样,原本的程序只能点亮其中之一,呵呵
开发板全是坑,从硬件到配套软件都一样,普中配的1602一般是压仓的山寨手机屏,就是便宜考虑
所以,你可以试一下普中各个开发板的配套程序,一般会找到可用的,同时可以本坛搜索一下,可能也找得到
板上用不同的单片机或晶振都可能需要对程序中的延时进行调整,祝好运
回复

使用道具 举报

ID:801056 发表于 2022-2-19 10:10 | 显示全部楼层
我把普中的12864显示程序移植到lcp1114上了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表