標(biāo)題: 關(guān)于12864顯示點,有兩句單片機(jī)代碼不是很理解 [打印本頁]
作者: 電子x戰(zhàn)隊 時間: 2017-9-23 22:23
標(biāo)題: 關(guān)于12864顯示點,有兩句單片機(jī)代碼不是很理解
寫入一個點的單片機(jī)子程序。具體步驟是:計算出X軸、Y軸的地址、X軸中的第幾位,然后讀出該地址現(xiàn)在的值,因為一般寫入新的點的時候,會覆蓋掉16個點中其他點,當(dāng)你要同時顯示16個點中的兩個點的時候就會沖突,所以先將顯示中的點讀出來,然后在或上要點亮的點,這樣就可以同時點亮。注意讀取數(shù)據(jù)的時候讀取的第一個數(shù)據(jù)不要,從第二數(shù)據(jù)開始取,也就是說要讀取三次,只取后面兩次的值。還有就是讀取數(shù)據(jù)之前要先寫入你要讀取數(shù)據(jù)的地址,讀取數(shù)據(jù)之后的寫入數(shù)據(jù)還要從新寫入地址。最后就是輸入數(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; //計算Y軸的地址,應(yīng)為縱坐標(biāo)有64個,所有對32求余,當(dāng)Y大于31時,Y的坐標(biāo)是下半屏的。
if(y>31) //計算X軸的地址當(dāng)Y大于31時X的地址在下半屏,從0X88開始,小于31時X的地址是在上半屏,從0X80開始
x_adr=0x88+x/16;
else
x_adr=0x80+x/16;
bt=0x8000>>(x%16); //求這個點到底是在哪個點
write_com(0x34);
write_com(0x34);
write_com(y_adr); //讀取數(shù)據(jù)的時候要先寫入所取數(shù)據(jù)的地址
write_com(x_adr);
read_data(); //讀取的第一個字節(jié)不要,
read=read_data(); //從第二個字節(jié)開始接收。
read<<=8;
read|=read_data();
bt=bt|read;
h_bit=bt>>8;
l_bit=bt;
write_com(y_adr); //寫入點的時候,重新寫入地址,因為地址已經(jīng)改變。
write_com(x_adr);
write_num(h_bit);
write_num(l_bit);
write_com(0x36); //開顯示
write_com(0x30); //轉(zhuǎn)回基本指令集
}
根據(jù)文字提示的內(nèi)容,為什么第一次讀取的數(shù)據(jù)不要? 為什么與運(yùn)算之后就可以同時顯示了?
想請教下前輩指點下,哪怕是提示下都可以。小弟先謝謝了
作者: getoneheart 時間: 2017-9-24 00:28
哈哈,我也不是很了解
作者: yzwzfyz 時間: 2017-9-24 10:03
畫出邏輯框圖或許你自己就明白了。
作者: 電子x戰(zhàn)隊 時間: 2017-9-24 12:33
yzwzfyz 發(fā)表于 2017-9-24 10:03
畫出邏輯框圖或許你自己就明白了。
寫代碼從來不畫框圖,其實我就是不理解他為啥莫名其妙要多讀一次,我昨天想想是不是所謂二緩沖技術(shù)
作者: zl2168 時間: 2017-9-25 22:16
筆名很牛人不牛
作者: 電子x戰(zhàn)隊 時間: 2017-9-26 19:56
搞了兩天得到了答案~
作者: 電子x戰(zhàn)隊 時間: 2017-9-26 20:14
還是寫個解答吧,網(wǎng)上關(guān)于這個資料比較少(搜索了一遍,都是剪刀膠布,關(guān)鍵地方?jīng)]有說明為什么):
首先12864并不是點對點,就是你寫個(1,10)進(jìn)去,它就能顯示出個點來,大致就是橫向128,每次控制16位,也就是為啥
你寫了個字符進(jìn)去會顯示出那么大個的字出來。
基本上可以理解為:基地址+偏移量=最終顯示(代碼就是這個思路)
另外這個屏幕Y軸是分了32+32,過了32地址又從“0”開始;
1.png (206.08 KB, 下載次數(shù): 68)
下載附件
2017-9-26 20:00 上傳
這是st7920的datesheet,這個芯片讀取分兩種模式,一種是每次讀取4位,讀取兩次,另一種是一次性讀取8位。
其次每次讀取一個字節(jié)是8位,這里又接著讀取了兩次,可以猜想一下是先讀了高位,然后讀取低位。
一個地址是16位,這樣的話
Dummy是“假的”的意思,大意是“空讀”,就是每次要先空讀一次,才能讀取到真正的信息。
bt是用戶要寫入的地址,為什么要“與”一下呢?
QQ截圖20170926200633.png (105.69 KB, 下載次數(shù): 62)
下載附件
2017-9-26 20:06 上傳
看到這張圖,我想你已經(jīng)理解了。
uint bt = 0, readValue = 0;
uchar x_adr, y_adr, h_bit, l_bit;
//--Y軸最大一共64,但是12864分為上半屏和下半屏,超過32就是下半屏了,--//
//--地址得又從零開始了。所以對32求余數(shù),得到Y(jié)軸的坐標(biāo),然后加上80H的基地址--//
y_adr = 0x80 + y % 32; //計算Y軸的地址
//--當(dāng)Y大于31時是下半屏,X(水平位置的地址)是從88H開始的,而且它是16位一--//
//--個地址,所以對16求模。而上半屏的地址是從80H開始的--//
if(y>31)
{
x_adr = 0x88 + x / 16; //計算X軸的地址
}
else
{
x_adr = 0x80 + x / 16;
}
//--求出X(水平位置),點亮的點是在16位數(shù)據(jù)里面的哪一個位--//
//--所以對這個數(shù)求余數(shù)--//
bt = 0x8000 >> (x % 16);
LCD12864_ReadData(); //讀取的第一個字節(jié)不要, //空讀
readValue = LCD12864_ReadData(); //從第二個字節(jié)開始接收。//真正的讀取
// readValue <<= 8; //高8位
// readValue |= LCD12864_ReadData(); //低8位
bt = bt | readValue;
h_bit = bt >> 8;
l_bit = bt;
后記:就這么多信息,我覺得12864的核心就在這里,可能這點東西需要下個使用者研究上幾天,最近對這種事情也很感慨,學(xué)校里在搞智能車,
做的稀爛,能完整跑一圈的沒幾個,一個個還保密的不得了,以前也是做C++逆向的,不喜歡國內(nèi)這種風(fēng)氣。我也在想:是不是自己傻,別人問我的,只要我會的都會告訴對方,一旦自己遇到問題了每個能幫助的字節(jié)的人~
作者: 51hei靜靜 時間: 2017-10-16 14:55
好資料,51黑有你更精彩!!!
| 歡迎光臨 (http://www.denmoz.com/bbs/) |
Powered by Discuz! X3.1 |