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

QQ登錄

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

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

關(guān)于12864顯示點(diǎn),有兩句單片機(jī)代碼不是很理解

[復(fù)制鏈接]
ID:231376 發(fā)表于 2017-9-23 22:23 | 顯示全部樓層 |閱讀模式
寫(xiě)入一個(gè)點(diǎn)的單片機(jī)子程序。具體步驟是:計(jì)算出X軸、Y軸的地址、X軸中的第幾位,然后讀出該地址現(xiàn)在的值,因?yàn)橐话銓?xiě)入新的點(diǎn)的時(shí)候,會(huì)覆蓋掉16個(gè)點(diǎn)中其他點(diǎn),當(dāng)你要同時(shí)顯示16個(gè)點(diǎn)中的兩個(gè)點(diǎn)的時(shí)候就會(huì)沖突,所以先將顯示中的點(diǎn)讀出來(lái),然后在或上要點(diǎn)亮的點(diǎn),這樣就可以同時(shí)點(diǎn)亮。注意讀取數(shù)據(jù)的時(shí)候讀取的第一個(gè)數(shù)據(jù)不要,從第二數(shù)據(jù)開(kāi)始取,也就是說(shuō)要讀取三次,只取后面兩次的值。還有就是讀取數(shù)據(jù)之前要先寫(xiě)入你要讀取數(shù)據(jù)的地址,讀取數(shù)據(jù)之后的寫(xiě)入數(shù)據(jù)還要從新寫(xiě)入地址。最后就是輸入數(shù)據(jù)地址,先輸入Y軸,再輸入X軸,輸入數(shù)據(jù)。
*/
voidput_point(uchar x,uchar y)
{
       uint bt=0,read=0;
       uchar x_adr,y_adr,h_bit,l_bit;
       y_adr=0x80+y%32;                    //計(jì)算Y軸的地址,應(yīng)為縱坐標(biāo)有64個(gè),所有對(duì)32求余,當(dāng)Y大于31時(shí),Y的坐標(biāo)是下半屏的。
       if(y>31)             //計(jì)算X軸的地址當(dāng)Y大于31時(shí)X的地址在下半屏,從0X88開(kāi)始,小于31時(shí)X的地址是在上半屏,從0X80開(kāi)始
              x_adr=0x88+x/16;        
       else
              x_adr=0x80+x/16;
       bt=0x8000>>(x%16);  //求這個(gè)點(diǎn)到底是在哪個(gè)點(diǎn)
       write_com(0x34);
       write_com(0x34);
       write_com(y_adr);   //讀取數(shù)據(jù)的時(shí)候要先寫(xiě)入所取數(shù)據(jù)的地址
       write_com(x_adr);
       read_data();             //讀取的第一個(gè)字節(jié)不要,
       read=read_data();     //從第二個(gè)字節(jié)開(kāi)始接收。
       read<<=8;
       read|=read_data();
       bt=bt|read;
       h_bit=bt>>8;
       l_bit=bt;
       write_com(y_adr);    //寫(xiě)入點(diǎn)的時(shí)候,重新寫(xiě)入地址,因?yàn)榈刂芬呀?jīng)改變。
       write_com(x_adr);
       write_num(h_bit);
       write_num(l_bit);
       write_com(0x36);    //開(kāi)顯示
       write_com(0x30);    //轉(zhuǎn)回基本指令集           
}



根據(jù)文字提示的內(nèi)容,為什么第一次讀取的數(shù)據(jù)不要? 為什么與運(yùn)算之后就可以同時(shí)顯示了?

想請(qǐng)教下前輩指點(diǎn)下,哪怕是提示下都可以。小弟先謝謝了

回復(fù)

使用道具 舉報(bào)

ID:235207 發(fā)表于 2017-9-24 00:28 | 顯示全部樓層
哈哈,我也不是很了解
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2017-9-24 10:03 | 顯示全部樓層
畫(huà)出邏輯框圖或許你自己就明白了。
回復(fù)

使用道具 舉報(bào)

ID:231376 發(fā)表于 2017-9-24 12:33 來(lái)自手機(jī) | 顯示全部樓層
yzwzfyz 發(fā)表于 2017-9-24 10:03
畫(huà)出邏輯框圖或許你自己就明白了。

寫(xiě)代碼從來(lái)不畫(huà)框圖,其實(shí)我就是不理解他為啥莫名其妙要多讀一次,我昨天想想是不是所謂二緩沖技術(shù)
回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2017-9-25 22:16 | 顯示全部樓層
筆名很牛人不牛
回復(fù)

使用道具 舉報(bào)

ID:231376 發(fā)表于 2017-9-26 19:56 | 顯示全部樓層

搞了兩天得到了答案~
回復(fù)

使用道具 舉報(bào)

ID:231376 發(fā)表于 2017-9-26 20:14 | 顯示全部樓層
還是寫(xiě)個(gè)解答吧,網(wǎng)上關(guān)于這個(gè)資料比較少(搜索了一遍,都是剪刀膠布,關(guān)鍵地方?jīng)]有說(shuō)明為什么):

首先12864并不是點(diǎn)對(duì)點(diǎn),就是你寫(xiě)個(gè)(1,10)進(jìn)去,它就能顯示出個(gè)點(diǎn)來(lái),大致就是橫向128,每次控制16位,也就是為啥
你寫(xiě)了個(gè)字符進(jìn)去會(huì)顯示出那么大個(gè)的字出來(lái)。

基本上可以理解為:基地址+偏移量=最終顯示(代碼就是這個(gè)思路)

另外這個(gè)屏幕Y軸是分了32+32,過(guò)了32地址又從“0”開(kāi)始;


1.png

這是st7920的datesheet,這個(gè)芯片讀取分兩種模式,一種是每次讀取4位,讀取兩次,另一種是一次性讀取8位。

其次每次讀取一個(gè)字節(jié)是8位,這里又接著讀取了兩次,可以猜想一下是先讀了高位,然后讀取低位。

一個(gè)地址是16位,這樣的話

Dummy是“假的”的意思,大意是“空讀”,就是每次要先空讀一次,才能讀取到真正的信息。

bt是用戶要寫(xiě)入的地址,為什么要“與”一下呢?

QQ截圖20170926200633.png 看到這張圖,我想你已經(jīng)理解了。



        uint bt = 0, readValue = 0;
        uchar x_adr, y_adr, h_bit, l_bit;

        //--Y軸最大一共64,但是12864分為上半屏和下半屏,超過(guò)32就是下半屏了,--//
        //--地址得又從零開(kāi)始了。所以對(duì)32求余數(shù),得到Y(jié)軸的坐標(biāo),然后加上80H的基地址--//
        y_adr = 0x80 + y % 32;                //計(jì)算Y軸的地址       
       
        //--當(dāng)Y大于31時(shí)是下半屏,X(水平位置的地址)是從88H開(kāi)始的,而且它是16位一--//
        //--個(gè)地址,所以對(duì)16求模。而上半屏的地址是從80H開(kāi)始的--//
        if(y>31)
        {
                x_adr = 0x88 + x / 16;        //計(jì)算X軸的地址
        }
       
        else
        {
                x_adr = 0x80 + x / 16;
        }
       
        //--求出X(水平位置),點(diǎn)亮的點(diǎn)是在16位數(shù)據(jù)里面的哪一個(gè)位--//
        //--所以對(duì)這個(gè)數(shù)求余數(shù)--//
        bt = 0x8000 >> (x % 16);


        LCD12864_ReadData();                  //讀取的第一個(gè)字節(jié)不要,  //空讀
        readValue = LCD12864_ReadData();          //從第二個(gè)字節(jié)開(kāi)始接收。//真正的讀取
//        readValue <<= 8;                                           //高8位
//        readValue |= LCD12864_ReadData();           //低8位
        bt = bt | readValue;
        h_bit = bt >> 8;
        l_bit = bt;




后記:就這么多信息,我覺(jué)得12864的核心就在這里,可能這點(diǎn)東西需要下個(gè)使用者研究上幾天,最近對(duì)這種事情也很感慨,學(xué)校里在搞智能車(chē),
做的稀爛,能完整跑一圈的沒(méi)幾個(gè),一個(gè)個(gè)還保密的不得了,以前也是做C++逆向的,不喜歡國(guó)內(nèi)這種風(fēng)氣。我也在想:是不是自己傻,別人問(wèn)我的,只要我會(huì)的都會(huì)告訴對(duì)方,一旦自己遇到問(wèn)題了每個(gè)能幫助的字節(jié)的人~

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:237272 發(fā)表于 2017-10-16 14:55 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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