找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4359|回復(fù): 8
收起左側(cè)

單片機(jī)開(kāi)發(fā)板LCD12864 st7565 的顯示問(wèn)題,只顯示不會(huì)亮,不顯示任何內(nèi)容

[復(fù)制鏈接]
ID:880867 發(fā)表于 2021-2-10 10:15 | 顯示全部樓層 |閱讀模式
    //這是st7565.c文件

        #include"st7565.h"

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

        * 函 數(shù) 名         : LCD12864_WriteCmd

        * 函數(shù)功能                   : 寫(xiě)入一個(gè)命令到12864

        * 輸    入         : cmd

        * 輸    出         : 無(wú)

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

        void LcdSt7565_WriteCmd(cmd)

        {

                LCD12864_CS = 0;           //chip select,打開(kāi)片選

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

                LCD12864_RS = 0;       //select command,選擇命令

                LCD12864_RW = 0;       //select write,選擇寫(xiě)模式

                _nop_();

                _nop_();

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

                _nop_();

                _nop_();

                LCD12864_RW = 1;           //command writing ,寫(xiě)入命令

        }

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

        * 函 數(shù) 名         : LcdSt7565_WriteData

        * 函數(shù)功能                   : 寫(xiě)入一個(gè)數(shù)據(jù)到12864

        * 輸    入         : dat

        * 輸    出         : 無(wú)

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

        void LcdSt7565_WriteData(dat)

        {        

                LCD12864_CS = 0;           //chip select,打開(kāi)片選

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

                LCD12864_RS = 1;       //select data,選擇數(shù)據(jù)

                LCD12864_RW = 0;       //select write,選擇寫(xiě)模式

                _nop_();

                _nop_();

                DATA_PORT = dat;       //put data,放置數(shù)據(jù)

                _nop_();

                _nop_();

                LCD12864_RW = 1;           //data writing,寫(xiě)數(shù)據(jù)

        }

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

        * 函 數(shù) 名         : LCD12864_Init

        * 函數(shù)功能                   : 初始化12864

        * 輸    入         : 無(wú)

        * 輸    出         : 無(wú)

        * 說(shuō)    明         : LCD12864的命令指令可以查看例程文件夾下的《ST7565p數(shù)據(jù)手冊(cè)》

        *                  * 的第51頁(yè)的位置。

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

        void Lcd12864_Init()

        {

                uchar i;

                LCD12864_RSET = 0;

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

                LCD12864_CS = 0;

                LCD12864_RSET = 1;

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

                //------程序初始化設(shè)置,具體命令可以看文件夾下---//

                //--軟件初始化--//

                LcdSt7565_WriteCmd(0xE2);  //reset

                for (i=0; i<100; i++);           //延時(shí)一下

                //--表格第8個(gè)命令,0xA0段(左右)方向選擇正常方向(0xA1為反方向)--//

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

                //--表格第15個(gè)命令,0xC8普通(上下)方向選擇選擇反向,0xC0為正常方向--//

                LcdSt7565_WriteCmd(0xC8);  //Common direction

                //--表格第9個(gè)命令,0xA6為設(shè)置字體為黑色,背景為白色---//

                //--0xA7為設(shè)置字體為白色,背景為黑色---//

                LcdSt7565_WriteCmd(0xA6);  //reverse display

                //--表格第10個(gè)命令,0xA4像素正常顯示,0xA5像素全開(kāi)--//

                LcdSt7565_WriteCmd(0xA4);  //normal display

                //--表格第11個(gè)命令,0xA3偏壓為1/7,0xA2偏壓為1/9--//

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

                //--表格第19個(gè)命令,這個(gè)是個(gè)雙字節(jié)的命令,0xF800選擇增壓為4X;--//

                //--0xF801,選擇增壓為5X,其實(shí)效果差不多--//        

                LcdSt7565_WriteCmd(0xF8);  //Boost ratio set

                LcdSt7565_WriteCmd(0x01);  //x4

                //--表格第18個(gè)命令,這個(gè)是個(gè)雙字節(jié)命令,高字節(jié)為0X81,低字節(jié)可以--//

                //--選擇從0x00到0X3F。用來(lái)設(shè)置背景光對(duì)比度。---/

                LcdSt7565_WriteCmd(0x81);  //V0 a set

                LcdSt7565_WriteCmd(0x23);

                //--表格第17個(gè)命令,選擇調(diào)節(jié)電阻率--//

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

                //--表格第16個(gè)命令,電源設(shè)置。--//

                LcdSt7565_WriteCmd(0x2F);

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

                //--表格第2個(gè)命令,設(shè)置顯示開(kāi)始位置--//

                LcdSt7565_WriteCmd(0x40);  //start line

                //--表格第1個(gè)命令,開(kāi)啟顯示--//

                LcdSt7565_WriteCmd(0xAF);  // display on

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

        }

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

        * 函 數(shù) 名         : LCD12864_ClearScreen

        * 函數(shù)功能                   : 清屏12864

        * 輸    入         : 無(wú)

        * 輸    出         : 無(wú)

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

        void Lcd12864_ClearScreen(void)

        {

                uchar i, j;

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

                {

                        //--表格第3個(gè)命令,設(shè)置Y的坐標(biāo)--//

                        //--Y軸有64個(gè),一個(gè)坐標(biāo)8位,也就是有8個(gè)坐標(biāo)--//

                        //所以一般我們使用的也就是從0xB0到0x07,就夠了--//        

                        LcdSt7565_WriteCmd(0xB0+i);

                        //--表格第4個(gè)命令,設(shè)置X坐標(biāo)--//

                        //--當(dāng)你的段初始化為0xA1時(shí),X坐標(biāo)從0x10,0x04到0x18,0x04,一共128位--//

                        //--當(dāng)你的段初始化為0xA0時(shí),X坐標(biāo)從0x10,0x00到0x18,0x00,一共128位--//

                        //--在寫(xiě)入數(shù)據(jù)之后X坐標(biāo)的坐標(biāo)是會(huì)自動(dòng)加1的,我們初始化使用0xA0所以--//

                        //--我們的X坐標(biāo)從0x10,0x00開(kāi)始---//

                        LcdSt7565_WriteCmd(0x10);

                        LcdSt7565_WriteCmd(0x04);                                                           

                        //--X軸有128位,就一共刷128次,X坐標(biāo)會(huì)自動(dòng)加1,所以我們不用再設(shè)置坐標(biāo)--//

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

                        {

                                LcdSt7565_WriteData(0x00);  //如果設(shè)置背景為白色時(shí),清屏選擇0XFF

                        }

                }

        }

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

        * 函 數(shù) 名         : LCD12864_Write16CnCHAR

        * 函數(shù)功能                   : 在12864上面書(shū)寫(xiě)16X16的漢字

        * 輸    入         : x, y, cn

        * 輸    出         : 無(wú)

        * 說(shuō)    明                   : 該函數(shù)可以直接書(shū)寫(xiě)字符串,但是書(shū)寫(xiě)是從右到左,所以輸入的時(shí)

        *                  * 侯注意輸入。漢字的取模方式請(qǐng)觀看文件夾下的《漢字取模軟件的

        *                  * 使用說(shuō)明》

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

        #ifdef  CHAR_CODE

        #include"charcode.h"

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

        {

                uchar j, x1, x2, wordNum;

                //--Y的坐標(biāo)只能從0到7,大于則直接返回--//

                if(y > 7)

                {

                        return 0;

                }

                //--X的坐標(biāo)只能從0到128,大于則直接返回--//

                if(x > 128)

                {

                        return 0;

                }

                y += 0xB0;           //求取Y坐標(biāo)的值

                //--設(shè)置Y坐標(biāo)--//

                LcdSt7565_WriteCmd(y);

                while ( *cn != '\0')         //在C語(yǔ)言中字符串結(jié)束以‘\0’結(jié)尾

                {        

                        //--設(shè)置Y坐標(biāo)--//

                        LcdSt7565_WriteCmd(y);

                        x1 = (x >> 4) & 0x0F;   //由于X坐標(biāo)要兩句命令,分高低4位,所以這里先取出高4位

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

                        //--設(shè)置X坐標(biāo)--//

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

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

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

                        {

                            //--查詢要寫(xiě)的字在字庫(kù)中的位置--//

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

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

                                {

                                        for (j=0; j<32; j++) //寫(xiě)一個(gè)字

                                        {               

                                                if (j == 16)         //由于16X16用到兩個(gè)Y坐標(biāo),當(dāng)大于等于16時(shí),切換坐標(biāo)

                                                {

                                                        //--設(shè)置Y坐標(biāo)--//

                                                           LcdSt7565_WriteCmd(y + 1);

                                                        //--設(shè)置X坐標(biāo)--//

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

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

                                                }

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

                                        }

                                        x += 16;

                                }//if查到字結(jié)束               

                        } //for查字結(jié)束        

                        cn += 2;

                }        //while結(jié)束

                return 1;

        }

        #endif

    //這是main.c文件

        #include<reg51.h>

        #include"st7565.h"

        //---聲明一個(gè)全局變量---//

        void Delay10ms(unsigned int c);

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

        * 函 數(shù) 名         : main

        * 函數(shù)功能                   : 主函數(shù)

        * 輸    入         : 無(wú)

        * 輸    出         : 無(wú)

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

        void main()

        {

                uchar i = 128;

                Lcd12864_Init();

                Lcd12864_ClearScreen();

                while (1)

                {

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

                        {

                                Lcd12864_ClearScreen();

                                //--由于這個(gè)函數(shù)顯示方向正好相反--//

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

                                Delay10ms(100);

                        }

                }

        }

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

        * 函 數(shù) 名         : Delay10ms

        * 函數(shù)功能                   : 延時(shí)函數(shù),延時(shí)10ms

        * 輸    入         : 無(wú)

        * 輸    出         : 無(wú)

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

        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--);

        }





    求求大家看下為啥我的只亮不顯示,兩天了救救孩子吧

回復(fù)

使用道具 舉報(bào)

ID:880867 發(fā)表于 2021-2-10 12:17 | 顯示全部樓層
程序用的是賣(mài)家給的,pz開(kāi)發(fā)版
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2021-2-10 18:59 | 顯示全部樓層
LCD12864中文資料包 容易看明白 http://www.torrancerestoration.com/bbs/dpj-200462-1.html
回復(fù)

使用道具 舉報(bào)

ID:97554 發(fā)表于 2021-2-10 20:48 | 顯示全部樓層
普中的1602程序不兼容一般的屏,它自帶的可以。12864不知道什么情況,你可以著重檢查下引腳是否兼容,其次檢查一下V0電壓是否給夠,1602和2004的V0只需要零點(diǎn)幾伏,12864的可能需要4.5V左右。如果不是以上問(wèn)題,那就不知道是否為不是普中配套的12864和顯示程序是否一致。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:97554 發(fā)表于 2021-2-12 23:40 | 顯示全部樓層
晚上有時(shí)間又看了下代碼,順便學(xué)習(xí)一下,今天白天也在折騰ST7565的12864,不過(guò)是串口的。今天只是折騰出了圖片,沒(méi)有字符和漢字。

但是,了解到st7565似乎并沒(méi)有字庫(kù) ,所以考慮樓主這程序應(yīng)該不是ST7565的,所以看到主程序的時(shí)候發(fā)現(xiàn)
Lcd12864_Write16CnCHAR(0, i, "司公限有技科中普");
這句似乎根本無(wú)法實(shí)現(xiàn),這ST7565要顯示漢字至少應(yīng)該取模自己建字庫(kù)才可以。

所以,作為一個(gè)沒(méi)有入門(mén)的門(mén)外漢,還是覺(jué)得開(kāi)發(fā)板就是一個(gè)坑,我也買(mǎi)過(guò)兩塊開(kāi)發(fā)板,一塊郭天祥的,一塊普中的。我是電子愛(ài)好者,對(duì)于C語(yǔ)言毫無(wú)基礎(chǔ),郭天祥的教程卻是針對(duì)在校大學(xué)生,至少對(duì)于C語(yǔ)言有些許了解的,所以其在講解過(guò)程中對(duì)于我熟悉的硬件講解過(guò)多,而且不完全正確。對(duì)于我需要學(xué)的編程過(guò)程他講的似乎有些草率。

后來(lái)又買(mǎi)了一塊普中68000,不說(shuō)講解問(wèn)題如何,只說(shuō)后來(lái)的學(xué)習(xí)過(guò)程中,發(fā)現(xiàn)這種集成式的開(kāi)發(fā)板根本不考慮初學(xué)者對(duì)于硬件和程序的認(rèn)知,就比如普中的板子,帶的一塊1602液晶,用他帶的液晶和例程可以點(diǎn)亮,但是換一塊大眾的1602就完蛋了,大眾的1602驅(qū)動(dòng)程序也點(diǎn)不亮普中的1602液晶。這就是開(kāi)發(fā)板的坑,初學(xué)者很容易掉進(jìn)這些坑里。

今天找參考資料的時(shí)候又翻了下普中的資料,結(jié)果發(fā)現(xiàn)我買(mǎi)板子時(shí)候沒(méi)給帶的12864他們居然不止一個(gè)版本,而且都是極其小眾的東西,不知何故。這樣的東西要想舉一反三頗有難度。

這兩年,在51論壇混倒是學(xué)到了以前看無(wú)數(shù)遍教程都沒(méi)有學(xué)到的知識(shí)總量,也有些自己的學(xué)習(xí)體會(huì)。單片機(jī)學(xué)習(xí)不能再搞開(kāi)發(fā)板,買(mǎi)兩片最小系統(tǒng),一些外設(shè)的功能模塊,比如這些液晶,還有什么時(shí)鐘模塊,ADC模塊啥的,自己連線自己找相關(guān)程序一遍遍的試,試錯(cuò)的過(guò)程就是學(xué)習(xí)的過(guò)程。經(jīng)常在51上看看別人遇到的問(wèn)題,那行許就是自己可能遇到的問(wèn)題,然后幫忙去尋找一下答案,找不到,解決不了,就收藏一下等著大佬給出指引,然后也一起學(xué)習(xí)一下,這就是提高入門(mén)的最佳方案了,至少我是這么覺(jué)得的。

最后,樓主還是找7565的顯示漢字字符的例程去參考下,或者找畫(huà)線或者填充方案先試下屏的好壞,連線的正確與否,初始化程序是否對(duì)應(yīng),硬件是否正確等都可以實(shí)現(xiàn)。
Lcd12864_Write16CnCHAR(0, i, "司公限有技科中普");

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

如果其他都正常的情況下,應(yīng)該是滿屏都是白的,因?yàn)樗迤撩钍欠聪蝻@示的,所以會(huì)滿屏像素點(diǎn)全白,如果沒(méi)有全白,那么檢查IO口是否一一對(duì)應(yīng),以及對(duì)比度電壓是否正確。


普中68000開(kāi)發(fā)板的資料里有三個(gè)例程對(duì)應(yīng)四種12864平,一種常用的,是20腳并口帶字庫(kù)的屏,主控可能是ST7920的。舊12864是一塊OLED屏,用的SPI驅(qū)動(dòng),新12864就是兩塊COG,我也看到了你貼的程序。有些屏在轉(zhuǎn)接板上帶個(gè)8腳的存儲(chǔ)芯片做的字庫(kù),那種可以不用字模顯示漢字,但是普中的兩片我好像沒(méi)有看見(jiàn)有字庫(kù)存儲(chǔ)芯片。 怎么區(qū)分兩種類(lèi)型的屏.jpg

下圖為本站壇友貼的帶字庫(kù)的ST7565的模塊的圖




評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:97554 發(fā)表于 2021-2-13 17:06 | 顯示全部樓層
看的不夠仔細(xì),charcode.h就是那幾個(gè)漢字的字庫(kù)。那么只剩下連線是直插還是杜邦線的問(wèn)題了
回復(fù)

使用道具 舉報(bào)

ID:880867 發(fā)表于 2021-2-14 16:41 | 顯示全部樓層
楊雪飛 發(fā)表于 2021-2-13 17:06
看的不夠仔細(xì),charcode.h就是那幾個(gè)漢字的字庫(kù)。那么只剩下連線是直插還是杜邦線的問(wèn)題了

對(duì),但是我?guī)滋爝是沒(méi)搞出來(lái),難受
回復(fù)

使用道具 舉報(bào)

ID:584814 發(fā)表于 2021-2-15 00:06 | 顯示全部樓層
普中的板子,同型號(hào)的我有兩塊,配的1602都不一樣,原本的程序只能點(diǎn)亮其中之一,呵呵
開(kāi)發(fā)板全是坑,從硬件到配套軟件都一樣,普中配的1602一般是壓倉(cāng)的山寨手機(jī)屏,就是便宜考慮
所以,你可以試一下普中各個(gè)開(kāi)發(fā)板的配套程序,一般會(huì)找到可用的,同時(shí)可以本壇搜索一下,可能也找得到
板上用不同的單片機(jī)或晶振都可能需要對(duì)程序中的延時(shí)進(jìn)行調(diào)整,祝好運(yùn)
回復(fù)

使用道具 舉報(bào)

ID:801056 發(fā)表于 2022-2-19 10:10 | 顯示全部樓層
我把普中的12864顯示程序移植到lcp1114上了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表